Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Unified Diff: base/prefs/json_pref_store_unittest.cc

Issue 1083603002: Add histograms to record the number of writes to the prefs file (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/prefs/json_pref_store_unittest.cc
diff --git a/base/prefs/json_pref_store_unittest.cc b/base/prefs/json_pref_store_unittest.cc
index ff68836014f65bcb780e8aac035224e79a61d655..37406670139734600057d849162d0e535a2e4e29 100644
--- a/base/prefs/json_pref_store_unittest.cc
+++ b/base/prefs/json_pref_store_unittest.cc
@@ -10,6 +10,8 @@
#include "base/memory/ref_counted.h"
#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"
@@ -85,6 +87,14 @@ class MockReadErrorDelegate : public PersistentPrefStore::ReadErrorDelegate {
} // namespace
class JsonPrefStoreTest : public testing::Test {
+ public:
+ base::Time current_time() { return current_time_; }
+
+ void SetCurrentTimeInMinutes(double minutes) {
+ const int32_t kBaseTimeMins = 100;
+ current_time_ = base::Time::FromDoubleT((kBaseTimeMins + minutes) * 60);
+ }
+
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
@@ -92,6 +102,9 @@ class JsonPrefStoreTest : public testing::Test {
ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &data_dir_));
data_dir_ = data_dir_.AppendASCII("prefs");
ASSERT_TRUE(PathExists(data_dir_));
+
+ base::StatisticsRecorder::InitializeForTest();
+ SetCurrentTimeInMinutes(0);
}
void TearDown() override {
@@ -101,6 +114,8 @@ class JsonPrefStoreTest : public testing::Test {
message_loop_.Run();
}
+ base::Time current_time_;
+
// 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.
@@ -671,4 +686,144 @@ TEST_F(JsonPrefStoreTest, BasicAsyncWithAlternateFile) {
pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json"));
}
+TEST_F(JsonPrefStoreTest, WriteCountHistogramTestBasic) {
+ JsonPrefStore::WriteCountHistogram histogram(
+ base::TimeDelta::FromSeconds(10),
+ base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
+ base::Bind(&JsonPrefStoreTest::current_time, base::Unretained(this)));
+ int32 report_interval =
+ JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
+
+ SetCurrentTimeInMinutes(0);
+ histogram.RecordWriteOccured();
+
+ SetCurrentTimeInMinutes(1.5 * report_interval);
+ histogram.ReportOutstandingWrites();
+ scoped_ptr<HistogramSamples> samples =
+ histogram.GetHistogram()->SnapshotSamples();
+ ASSERT_EQ(1, samples->GetCount(1));
+ ASSERT_EQ(1, samples->TotalCount());
+
+ ASSERT_EQ("Settings.JsonDataWriteCount.Local_State",
+ histogram.GetHistogram()->histogram_name());
+ ASSERT_TRUE(histogram.GetHistogram()->HasConstructionArguments(1, 30, 31));
+}
+
+TEST_F(JsonPrefStoreTest, WriteCountHistogramTestSinglePeriod) {
+ JsonPrefStore::WriteCountHistogram histogram(
+ base::TimeDelta::FromSeconds(10),
+ base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
+ base::Bind(&JsonPrefStoreTest::current_time, base::Unretained(this)));
+ int32 report_interval =
+ JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
+
+ SetCurrentTimeInMinutes(0);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(0.5 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(0.7 * report_interval);
+ histogram.RecordWriteOccured();
+
+ // Nothing should be recorded until the report period has elapsed.
+ scoped_ptr<HistogramSamples> samples =
+ histogram.GetHistogram()->SnapshotSamples();
+ ASSERT_EQ(0, samples->TotalCount());
+
+ SetCurrentTimeInMinutes(1.3 * report_interval);
+ histogram.RecordWriteOccured();
+
+ // Now the report period has elapsed.
+ samples = histogram.GetHistogram()->SnapshotSamples();
+ ASSERT_EQ(1, samples->GetCount(3));
+ ASSERT_EQ(1, samples->TotalCount());
+
+ // The last write won't be recorded because the second count period hasn't
+ // fully elapsed.
+ SetCurrentTimeInMinutes(1.5 * report_interval);
+ histogram.ReportOutstandingWrites();
+
+ samples = histogram.GetHistogram()->SnapshotSamples();
+ ASSERT_EQ(1, samples->GetCount(3));
+ ASSERT_EQ(1, samples->TotalCount());
+}
+
+TEST_F(JsonPrefStoreTest, WriteCountHistogramTestMultiplePeriods) {
+ JsonPrefStore::WriteCountHistogram histogram(
+ base::TimeDelta::FromSeconds(10),
+ base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
+ base::Bind(&JsonPrefStoreTest::current_time, base::Unretained(this)));
+ int32 report_interval =
+ JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
+
+ SetCurrentTimeInMinutes(0);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(0.5 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(0.7 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(1.3 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(1.5 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(2.1 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(2.5 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(2.7 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(3.3 * report_interval);
+ histogram.RecordWriteOccured();
+
+ // The last write won't be recorded because the second count period hasn't
+ // fully elapsed
+ SetCurrentTimeInMinutes(3.5 * report_interval);
+ 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());
+}
+
+TEST_F(JsonPrefStoreTest, WriteCountHistogramTestPeriodWithGaps) {
+ JsonPrefStore::WriteCountHistogram histogram(
+ base::TimeDelta::FromSeconds(10),
+ base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
+ base::Bind(&JsonPrefStoreTest::current_time, base::Unretained(this)));
+ int32 report_interval =
+ JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
+
+ // 1 write in the first period.
+ SetCurrentTimeInMinutes(0);
+ histogram.RecordWriteOccured();
+
+ // No writes in the second and third periods.
+
+ // 2 writes in the fourth period.
+ SetCurrentTimeInMinutes(3.1 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(3.3 * report_interval);
+ histogram.RecordWriteOccured();
+
+ // No writes in the fifth period.
+
+ // 3 writes in the sixth period.
+ SetCurrentTimeInMinutes(5.1 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(5.3 * report_interval);
+ histogram.RecordWriteOccured();
+ SetCurrentTimeInMinutes(5.5 * report_interval);
+ histogram.RecordWriteOccured();
+
+ SetCurrentTimeInMinutes(6.1 * report_interval);
+ 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());
+}
+
} // namespace base

Powered by Google App Engine
This is Rietveld 408576698