blob: 6dcb741fa9b324b0b0bdb518b947a89ba3a8ef92 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gn/string_output_buffer.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "util/test/test.h"
namespace {
// Create a test string of |size| characters with pseudo-random ASCII content.
std::string CreateTestString(size_t size, size_t seed = 0) {
std::string result;
result.resize(size);
for (size_t n = 0; n < size; ++n) {
int offset = (size + seed + n * 1337);
char ch = ' ' + offset % (127 - 32);
result[n] = ch;
}
return result;
}
} // namespace
TEST(StringOutputBuffer, Append) {
const size_t data_size = 100000;
std::string data = CreateTestString(data_size);
const size_t num_spans = 50;
const size_t span_size = data_size / num_spans;
StringOutputBuffer buffer;
for (size_t n = 0; n < num_spans; ++n) {
size_t start_offset = n * span_size;
size_t end_offset = std::min(start_offset + span_size, data.size());
buffer.Append(&data[start_offset], end_offset - start_offset);
}
EXPECT_EQ(data.size(), buffer.size());
ASSERT_STREQ(data.c_str(), buffer.str().c_str());
}
TEST(StringOutputBuffer, AppendWithPageSizeMultiples) {
const size_t page_size = StringOutputBuffer::GetPageSizeForTesting();
const size_t page_count = 100;
const size_t data_size = page_size * page_count;
std::string data = CreateTestString(data_size);
StringOutputBuffer buffer;
for (size_t n = 0; n < page_count; ++n) {
size_t start_offset = n * page_size;
buffer.Append(&data[start_offset], page_size);
}
EXPECT_EQ(data.size(), buffer.size());
ASSERT_STREQ(data.c_str(), buffer.str().c_str());
}
TEST(StringOutput, WrappedByStdOstream) {
const size_t data_size = 100000;
std::string data = CreateTestString(data_size);
const size_t num_spans = 50;
const size_t span_size = data_size / num_spans;
StringOutputBuffer buffer;
std::ostream out(&buffer);
for (size_t n = 0; n < num_spans; ++n) {
size_t start_offset = n * span_size;
size_t end_offset = std::min(start_offset + span_size, data.size());
out << std::string_view(&data[start_offset], end_offset - start_offset);
}
EXPECT_EQ(data.size(), buffer.size());
ASSERT_STREQ(data.c_str(), buffer.str().c_str());
}
TEST(StringOutputBuffer, ContentsEqual) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
const size_t data_size = 100000;
std::string data = CreateTestString(data_size);
base::FilePath file_path = temp_dir.GetPath().AppendASCII("foo.txt");
base::WriteFile(file_path, data.c_str(), static_cast<int>(data.size()));
{
StringOutputBuffer buffer;
buffer.Append(data);
EXPECT_TRUE(buffer.ContentsEqual(file_path));
// Different length and contents.
buffer << "extra";
EXPECT_FALSE(buffer.ContentsEqual(file_path));
}
// The same length, different contents.
{
StringOutputBuffer buffer;
buffer << CreateTestString(data_size, 1);
EXPECT_FALSE(buffer.ContentsEqual(file_path));
}
}
TEST(StringOutputBuffer, WriteToFile) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
const size_t data_size = 100000;
std::string data = CreateTestString(data_size);
// Write if file doesn't exist. Also create directory.
base::FilePath file_path =
temp_dir.GetPath().AppendASCII("bar").AppendASCII("foo.txt");
StringOutputBuffer buffer;
buffer.Append(data);
EXPECT_TRUE(buffer.WriteToFile(file_path, nullptr));
// Verify file was created and has same content.
base::File::Info file_info;
ASSERT_TRUE(base::GetFileInfo(file_path, &file_info));
ASSERT_TRUE(buffer.ContentsEqual(file_path));
}