Index: components/prefs/json_pref_store_unittest.cc |
diff --git a/base/prefs/json_pref_store_unittest.cc b/components/prefs/json_pref_store_unittest.cc |
similarity index 88% |
rename from base/prefs/json_pref_store_unittest.cc |
rename to components/prefs/json_pref_store_unittest.cc |
index 41cad8985cf8386a9e59d881cc2d41b128db096e..bc9eecaace09bb337d1d700733ec63fe2f30248a 100644 |
--- a/base/prefs/json_pref_store_unittest.cc |
+++ b/components/prefs/json_pref_store_unittest.cc |
@@ -17,7 +17,6 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
#include "base/metrics/histogram_samples.h" |
-#include "base/metrics/statistics_recorder.h" |
#include "base/path_service.h" |
#include "base/prefs/pref_filter.h" |
#include "base/run_loop.h" |
@@ -25,6 +24,7 @@ |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/test/histogram_tester.h" |
#include "base/test/simple_test_clock.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/threading/thread.h" |
@@ -37,6 +37,25 @@ namespace { |
const char kHomePage[] = "homepage"; |
+const char kReadJson[] = |
+ "{\n" |
+ " \"homepage\": \"http://www.cnn.com\",\n" |
+ " \"some_directory\": \"/usr/local/\",\n" |
+ " \"tabs\": {\n" |
+ " \"new_windows_in_tabs\": true,\n" |
+ " \"max_tabs\": 20\n" |
+ " }\n" |
+ "}"; |
+ |
+const char kInvalidJson[] = "!@#$%^&"; |
+ |
+// Expected output for tests using RunBasicJsonPrefStoreTest(). |
+const char kWriteGolden[] = |
+ "{\"homepage\":\"http://www.cnn.com\"," |
+ "\"long_int\":{\"pref\":\"214748364842\"}," |
+ "\"some_directory\":\"/usr/sbin/\"," |
+ "\"tabs\":{\"max_tabs\":10,\"new_windows_in_tabs\":false}}"; |
+ |
// Set the time on the given SimpleTestClock to the given time in minutes. |
void SetCurrentTimeInMinutes(double minutes, base::SimpleTestClock* clock) { |
const int32_t kBaseTimeMins = 100; |
@@ -104,10 +123,6 @@ class JsonPrefStoreTest : public testing::Test { |
protected: |
void SetUp() override { |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- |
- ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &data_dir_)); |
- data_dir_ = data_dir_.AppendASCII("prefs"); |
- ASSERT_TRUE(PathExists(data_dir_)); |
} |
void TearDown() override { |
@@ -118,14 +133,8 @@ class JsonPrefStoreTest : public testing::Test { |
// The path to temporary directory used to contain the test operations. |
base::ScopedTempDir temp_dir_; |
- // The path to the directory where the test data is stored. |
- base::FilePath data_dir_; |
// A message loop that we can use as the file thread message loop. |
MessageLoop message_loop_; |
- |
- private: |
- // Ensure histograms are reset for each test. |
- StatisticsRecorder statistics_recorder_; |
}; |
// Test fallback behavior for a nonexistent file. |
@@ -156,9 +165,10 @@ TEST_F(JsonPrefStoreTest, NonExistentFileAndAlternateFile) { |
// Test fallback behavior for an invalid file. |
TEST_F(JsonPrefStoreTest, InvalidFile) { |
- base::FilePath invalid_file_original = data_dir_.AppendASCII("invalid.json"); |
base::FilePath invalid_file = temp_dir_.path().AppendASCII("invalid.json"); |
- ASSERT_TRUE(base::CopyFile(invalid_file_original, invalid_file)); |
+ ASSERT_LT(0, base::WriteFile(invalid_file, |
+ kInvalidJson, arraysize(kInvalidJson) - 1)); |
+ |
scoped_refptr<JsonPrefStore> pref_store = new JsonPrefStore( |
invalid_file, message_loop_.task_runner(), scoped_ptr<PrefFilter>()); |
EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE, |
@@ -169,14 +179,17 @@ TEST_F(JsonPrefStoreTest, InvalidFile) { |
EXPECT_FALSE(PathExists(invalid_file)); |
base::FilePath moved_aside = temp_dir_.path().AppendASCII("invalid.bad"); |
EXPECT_TRUE(PathExists(moved_aside)); |
- EXPECT_TRUE(TextContentsEqual(invalid_file_original, moved_aside)); |
+ |
+ std::string moved_aside_contents; |
+ ASSERT_TRUE(base::ReadFileToString(moved_aside, &moved_aside_contents)); |
+ EXPECT_EQ(kInvalidJson, moved_aside_contents); |
} |
-// This function is used to avoid code duplication while testing synchronous and |
-// asynchronous version of the JsonPrefStore loading. |
+// This function is used to avoid code duplication while testing synchronous |
+// and asynchronous version of the JsonPrefStore loading. It validates that the |
+// given output file's contents matches kWriteGolden. |
void RunBasicJsonPrefStoreTest(JsonPrefStore* pref_store, |
- const base::FilePath& output_file, |
- const base::FilePath& golden_output_file) { |
+ const base::FilePath& output_file) { |
const char kNewWindowsInTabs[] = "tabs.new_windows_in_tabs"; |
const char kMaxTabs[] = "tabs.max_tabs"; |
const char kLongIntPref[] = "long_int.pref"; |
@@ -238,19 +251,21 @@ void RunBasicJsonPrefStoreTest(JsonPrefStore* pref_store, |
EXPECT_EQ(214748364842LL, value); |
// Serialize and compare to expected output. |
- ASSERT_TRUE(PathExists(golden_output_file)); |
pref_store->CommitPendingWrite(); |
RunLoop().RunUntilIdle(); |
- EXPECT_TRUE(TextContentsEqual(golden_output_file, output_file)); |
+ |
+ std::string output_contents; |
+ ASSERT_TRUE(base::ReadFileToString(output_file, &output_contents)); |
+ EXPECT_EQ(kWriteGolden, output_contents); |
ASSERT_TRUE(base::DeleteFile(output_file, false)); |
} |
TEST_F(JsonPrefStoreTest, Basic) { |
- ASSERT_TRUE(base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
+ base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
// Test that the persistent value can be loaded. |
- base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
ASSERT_TRUE(PathExists(input_file)); |
scoped_refptr<JsonPrefStore> pref_store = new JsonPrefStore( |
input_file, message_loop_.task_runner(), scoped_ptr<PrefFilter>()); |
@@ -268,17 +283,15 @@ TEST_F(JsonPrefStoreTest, Basic) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, BasicAsync) { |
- ASSERT_TRUE(base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
+ base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
// Test that the persistent value can be loaded. |
- base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- ASSERT_TRUE(PathExists(input_file)); |
scoped_refptr<JsonPrefStore> pref_store = new JsonPrefStore( |
input_file, message_loop_.task_runner(), scoped_ptr<PrefFilter>()); |
@@ -309,8 +322,7 @@ TEST_F(JsonPrefStoreTest, BasicAsync) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, PreserveEmptyValues) { |
@@ -386,12 +398,9 @@ TEST_F(JsonPrefStoreTest, AsyncNonExistingFile) { |
} |
TEST_F(JsonPrefStoreTest, ReadWithInterceptor) { |
- ASSERT_TRUE(base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
- |
- // Test that the persistent value can be loaded. |
base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- ASSERT_TRUE(PathExists(input_file)); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
scoped_ptr<InterceptingPrefFilter> intercepting_pref_filter( |
new InterceptingPrefFilter()); |
@@ -427,17 +436,13 @@ TEST_F(JsonPrefStoreTest, ReadWithInterceptor) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, ReadAsyncWithInterceptor) { |
- ASSERT_TRUE(base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
- |
- // Test that the persistent value can be loaded. |
base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- ASSERT_TRUE(PathExists(input_file)); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
scoped_ptr<InterceptingPrefFilter> intercepting_pref_filter( |
new InterceptingPrefFilter()); |
@@ -492,20 +497,18 @@ TEST_F(JsonPrefStoreTest, ReadAsyncWithInterceptor) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, AlternateFile) { |
- ASSERT_TRUE( |
- base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("alternate.json"))); |
+ base::FilePath alternate_input_file = |
+ temp_dir_.path().AppendASCII("alternate.json"); |
+ ASSERT_LT(0, base::WriteFile(alternate_input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
// Test that the alternate file is moved to the main file and read as-is from |
// there. |
base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- base::FilePath alternate_input_file = |
- temp_dir_.path().AppendASCII("alternate.json"); |
ASSERT_FALSE(PathExists(input_file)); |
ASSERT_TRUE(PathExists(alternate_input_file)); |
scoped_refptr<JsonPrefStore> pref_store = |
@@ -532,26 +535,22 @@ TEST_F(JsonPrefStoreTest, AlternateFile) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, AlternateFileIgnoredWhenMainFileExists) { |
- ASSERT_TRUE( |
- base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
- ASSERT_TRUE( |
- base::CopyFile(data_dir_.AppendASCII("invalid.json"), |
- temp_dir_.path().AppendASCII("alternate.json"))); |
+ base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
+ |
+ base::FilePath alternate_input_file = |
+ temp_dir_.path().AppendASCII("alternate.json"); |
+ ASSERT_LT(0, base::WriteFile(alternate_input_file, |
+ kInvalidJson, arraysize(kInvalidJson) - 1)); |
// Test that the alternate file is ignored and that the read occurs from the |
// existing main file. There is no attempt at even deleting the alternate |
// file as this scenario should never happen in normal user-data-dirs. |
- base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- base::FilePath alternate_input_file = |
- temp_dir_.path().AppendASCII("alternate.json"); |
- ASSERT_TRUE(PathExists(input_file)); |
- ASSERT_TRUE(PathExists(alternate_input_file)); |
scoped_refptr<JsonPrefStore> pref_store = |
new JsonPrefStore(input_file, alternate_input_file, |
message_loop_.task_runner(), scoped_ptr<PrefFilter>()); |
@@ -576,18 +575,16 @@ TEST_F(JsonPrefStoreTest, AlternateFileIgnoredWhenMainFileExists) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, AlternateFileDNE) { |
- ASSERT_TRUE( |
- base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("write.json"))); |
+ base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
+ ASSERT_LT(0, base::WriteFile(input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
// Test that the basic read works fine when an alternate file is specified but |
// does not exist. |
- base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
base::FilePath alternate_input_file = |
temp_dir_.path().AppendASCII("alternate.json"); |
ASSERT_TRUE(PathExists(input_file)); |
@@ -616,22 +613,18 @@ TEST_F(JsonPrefStoreTest, AlternateFileDNE) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, BasicAsyncWithAlternateFile) { |
- ASSERT_TRUE( |
- base::CopyFile(data_dir_.AppendASCII("read.json"), |
- temp_dir_.path().AppendASCII("alternate.json"))); |
+ base::FilePath alternate_input_file = |
+ temp_dir_.path().AppendASCII("alternate.json"); |
+ ASSERT_LT(0, base::WriteFile(alternate_input_file, |
+ kReadJson, arraysize(kReadJson) - 1)); |
// Test that the alternate file is moved to the main file and read as-is from |
// there even when the read is made asynchronously. |
base::FilePath input_file = temp_dir_.path().AppendASCII("write.json"); |
- base::FilePath alternate_input_file = |
- temp_dir_.path().AppendASCII("alternate.json"); |
- ASSERT_FALSE(PathExists(input_file)); |
- ASSERT_TRUE(PathExists(alternate_input_file)); |
scoped_refptr<JsonPrefStore> pref_store = |
new JsonPrefStore(input_file, alternate_input_file, |
message_loop_.task_runner(), scoped_ptr<PrefFilter>()); |
@@ -669,11 +662,12 @@ TEST_F(JsonPrefStoreTest, BasicAsyncWithAlternateFile) { |
// } |
// } |
- RunBasicJsonPrefStoreTest( |
- pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); |
+ RunBasicJsonPrefStoreTest(pref_store.get(), input_file); |
} |
TEST_F(JsonPrefStoreTest, WriteCountHistogramTestBasic) { |
+ base::HistogramTester histogram_tester; |
+ |
SimpleTestClock* test_clock = new SimpleTestClock; |
SetCurrentTimeInMinutes(0, test_clock); |
JsonPrefStore::WriteCountHistogram histogram( |
@@ -689,8 +683,10 @@ TEST_F(JsonPrefStoreTest, WriteCountHistogramTestBasic) { |
histogram.ReportOutstandingWrites(); |
scoped_ptr<HistogramSamples> samples = |
histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(1, samples->GetCount(1)); |
- ASSERT_EQ(1, samples->TotalCount()); |
+ |
+ std::string histogram_name = histogram.GetHistogram()->histogram_name(); |
+ histogram_tester.ExpectBucketCount(histogram_name, 1, 1); |
+ histogram_tester.ExpectTotalCount(histogram_name, 1); |
ASSERT_EQ("Settings.JsonDataWriteCount.Local_State", |
histogram.GetHistogram()->histogram_name()); |
@@ -698,6 +694,8 @@ TEST_F(JsonPrefStoreTest, WriteCountHistogramTestBasic) { |
} |
TEST_F(JsonPrefStoreTest, WriteCountHistogramTestSinglePeriod) { |
+ base::HistogramTester histogram_tester; |
+ |
SimpleTestClock* test_clock = new SimpleTestClock; |
SetCurrentTimeInMinutes(0, test_clock); |
JsonPrefStore::WriteCountHistogram histogram( |
@@ -714,29 +712,28 @@ TEST_F(JsonPrefStoreTest, WriteCountHistogramTestSinglePeriod) { |
histogram.RecordWriteOccured(); |
// Nothing should be recorded until the report period has elapsed. |
- scoped_ptr<HistogramSamples> samples = |
- histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(0, samples->TotalCount()); |
+ std::string histogram_name = histogram.GetHistogram()->histogram_name(); |
+ histogram_tester.ExpectTotalCount(histogram_name, 0); |
SetCurrentTimeInMinutes(1.3 * report_interval, test_clock); |
histogram.RecordWriteOccured(); |
// Now the report period has elapsed. |
- samples = histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(1, samples->GetCount(3)); |
- ASSERT_EQ(1, samples->TotalCount()); |
+ histogram_tester.ExpectBucketCount(histogram_name, 3, 1); |
+ histogram_tester.ExpectTotalCount(histogram_name, 1); |
// The last write won't be recorded because the second count period hasn't |
// fully elapsed. |
SetCurrentTimeInMinutes(1.5 * report_interval, test_clock); |
histogram.ReportOutstandingWrites(); |
- samples = histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(1, samples->GetCount(3)); |
- ASSERT_EQ(1, samples->TotalCount()); |
+ histogram_tester.ExpectBucketCount(histogram_name, 3, 1); |
+ histogram_tester.ExpectTotalCount(histogram_name, 1); |
} |
TEST_F(JsonPrefStoreTest, WriteCountHistogramTestMultiplePeriods) { |
+ base::HistogramTester histogram_tester; |
+ |
SimpleTestClock* test_clock = new SimpleTestClock; |
SetCurrentTimeInMinutes(0, test_clock); |
JsonPrefStore::WriteCountHistogram histogram( |
@@ -768,14 +765,15 @@ TEST_F(JsonPrefStoreTest, WriteCountHistogramTestMultiplePeriods) { |
// fully elapsed |
SetCurrentTimeInMinutes(3.5 * report_interval, test_clock); |
histogram.ReportOutstandingWrites(); |
- scoped_ptr<HistogramSamples> samples = |
- histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(2, samples->GetCount(3)); |
- ASSERT_EQ(1, samples->GetCount(2)); |
- ASSERT_EQ(3, samples->TotalCount()); |
+ std::string histogram_name = histogram.GetHistogram()->histogram_name(); |
+ histogram_tester.ExpectBucketCount(histogram_name, 3, 2); |
+ histogram_tester.ExpectBucketCount(histogram_name, 2, 1); |
+ histogram_tester.ExpectTotalCount(histogram_name, 3); |
} |
TEST_F(JsonPrefStoreTest, WriteCountHistogramTestPeriodWithGaps) { |
+ base::HistogramTester histogram_tester; |
+ |
SimpleTestClock* test_clock = new SimpleTestClock; |
SetCurrentTimeInMinutes(0, test_clock); |
JsonPrefStore::WriteCountHistogram histogram( |
@@ -808,13 +806,12 @@ TEST_F(JsonPrefStoreTest, WriteCountHistogramTestPeriodWithGaps) { |
SetCurrentTimeInMinutes(6.1 * report_interval, test_clock); |
histogram.ReportOutstandingWrites(); |
- scoped_ptr<HistogramSamples> samples = |
- histogram.GetHistogram()->SnapshotSamples(); |
- ASSERT_EQ(3, samples->GetCount(0)); |
- ASSERT_EQ(1, samples->GetCount(1)); |
- ASSERT_EQ(1, samples->GetCount(2)); |
- ASSERT_EQ(1, samples->GetCount(3)); |
- ASSERT_EQ(6, samples->TotalCount()); |
+ std::string histogram_name = histogram.GetHistogram()->histogram_name(); |
+ histogram_tester.ExpectBucketCount(histogram_name, 0, 3); |
+ histogram_tester.ExpectBucketCount(histogram_name, 1, 1); |
+ histogram_tester.ExpectBucketCount(histogram_name, 2, 1); |
+ histogram_tester.ExpectBucketCount(histogram_name, 3, 1); |
+ histogram_tester.ExpectTotalCount(histogram_name, 6); |
} |
class JsonPrefStoreLossyWriteTest : public JsonPrefStoreTest { |