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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/prefs/json_pref_store.h" 5 #include "base/prefs/json_pref_store.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/metrics/histogram_samples.h"
14 #include "base/metrics/statistics_recorder.h"
13 #include "base/path_service.h" 15 #include "base/path_service.h"
14 #include "base/prefs/pref_filter.h" 16 #include "base/prefs/pref_filter.h"
15 #include "base/run_loop.h" 17 #include "base/run_loop.h"
16 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
18 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
21 #include "base/test/simple_test_clock.h"
19 #include "base/threading/sequenced_worker_pool.h" 22 #include "base/threading/sequenced_worker_pool.h"
20 #include "base/threading/thread.h" 23 #include "base/threading/thread.h"
21 #include "base/values.h" 24 #include "base/values.h"
22 #include "testing/gmock/include/gmock/gmock.h" 25 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
24 27
25 namespace base { 28 namespace base {
26 namespace { 29 namespace {
27 30
28 const char kHomePage[] = "homepage"; 31 const char kHomePage[] = "homepage";
29 32
33 // Set the time on the given SimpleTestClock to the given time in minutes.
34 void SetCurrentTimeInMinutes(base::SimpleTestClock* clock, double minutes) {
Alexei Svitkine (slow) 2015/04/27 20:21:20 Nit: Modifiable parameters should be last.
raymes 2015/04/28 00:32:58 Done.
35 const int32_t kBaseTimeMins = 100;
36 clock->SetNow(base::Time::FromDoubleT((kBaseTimeMins + minutes) * 60));
37 }
38
30 // A PrefFilter that will intercept all calls to FilterOnLoad() and hold on 39 // A PrefFilter that will intercept all calls to FilterOnLoad() and hold on
31 // to the |prefs| until explicitly asked to release them. 40 // to the |prefs| until explicitly asked to release them.
32 class InterceptingPrefFilter : public PrefFilter { 41 class InterceptingPrefFilter : public PrefFilter {
33 public: 42 public:
34 InterceptingPrefFilter(); 43 InterceptingPrefFilter();
35 ~InterceptingPrefFilter() override; 44 ~InterceptingPrefFilter() override;
36 45
37 // PrefFilter implementation: 46 // PrefFilter implementation:
38 void FilterOnLoad( 47 void FilterOnLoad(
39 const PostFilterOnLoadCallback& post_filter_on_load_callback, 48 const PostFilterOnLoadCallback& post_filter_on_load_callback,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 } // namespace 94 } // namespace
86 95
87 class JsonPrefStoreTest : public testing::Test { 96 class JsonPrefStoreTest : public testing::Test {
88 protected: 97 protected:
89 void SetUp() override { 98 void SetUp() override {
90 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 99 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
91 100
92 ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &data_dir_)); 101 ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &data_dir_));
93 data_dir_ = data_dir_.AppendASCII("prefs"); 102 data_dir_ = data_dir_.AppendASCII("prefs");
94 ASSERT_TRUE(PathExists(data_dir_)); 103 ASSERT_TRUE(PathExists(data_dir_));
104
105 base::StatisticsRecorder::ResetForTesting();
95 } 106 }
96 107
97 void TearDown() override { 108 void TearDown() override {
98 // Make sure all pending tasks have been processed (e.g., deleting the 109 // Make sure all pending tasks have been processed (e.g., deleting the
99 // JsonPrefStore may post write tasks). 110 // JsonPrefStore may post write tasks).
100 message_loop_.PostTask(FROM_HERE, MessageLoop::QuitWhenIdleClosure()); 111 message_loop_.PostTask(FROM_HERE, MessageLoop::QuitWhenIdleClosure());
101 message_loop_.Run(); 112 message_loop_.Run();
102 } 113 }
103 114
104 // The path to temporary directory used to contain the test operations. 115 // The path to temporary directory used to contain the test operations.
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 // "tabs": { 675 // "tabs": {
665 // "new_windows_in_tabs": true, 676 // "new_windows_in_tabs": true,
666 // "max_tabs": 20 677 // "max_tabs": 20
667 // } 678 // }
668 // } 679 // }
669 680
670 RunBasicJsonPrefStoreTest( 681 RunBasicJsonPrefStoreTest(
671 pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json")); 682 pref_store.get(), input_file, data_dir_.AppendASCII("write.golden.json"));
672 } 683 }
673 684
685 TEST_F(JsonPrefStoreTest, WriteCountHistogramTestBasic) {
686 SimpleTestClock* test_clock = new SimpleTestClock;
687 SetCurrentTimeInMinutes(test_clock, 0);
688 JsonPrefStore::WriteCountHistogram histogram(
689 base::TimeDelta::FromSeconds(10),
690 base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
691 scoped_ptr<base::Clock>(test_clock));
692 int32 report_interval =
693 JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
694
695 histogram.RecordWriteOccured();
696
697 SetCurrentTimeInMinutes(test_clock, 1.5 * report_interval);
698 histogram.ReportOutstandingWrites();
699 scoped_ptr<HistogramSamples> samples =
700 histogram.GetHistogram()->SnapshotSamples();
701 ASSERT_EQ(1, samples->GetCount(1));
702 ASSERT_EQ(1, samples->TotalCount());
703
704 ASSERT_EQ("Settings.JsonDataWriteCount.Local_State",
705 histogram.GetHistogram()->histogram_name());
706 ASSERT_TRUE(histogram.GetHistogram()->HasConstructionArguments(1, 30, 31));
707 }
708
709 TEST_F(JsonPrefStoreTest, WriteCountHistogramTestSinglePeriod) {
710 SimpleTestClock* test_clock = new SimpleTestClock;
711 SetCurrentTimeInMinutes(test_clock, 0);
712 JsonPrefStore::WriteCountHistogram histogram(
713 base::TimeDelta::FromSeconds(10),
714 base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
715 scoped_ptr<base::Clock>(test_clock));
716 int32 report_interval =
717 JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
718
719 histogram.RecordWriteOccured();
720 SetCurrentTimeInMinutes(test_clock, 0.5 * report_interval);
721 histogram.RecordWriteOccured();
722 SetCurrentTimeInMinutes(test_clock, 0.7 * report_interval);
723 histogram.RecordWriteOccured();
724
725 // Nothing should be recorded until the report period has elapsed.
726 scoped_ptr<HistogramSamples> samples =
727 histogram.GetHistogram()->SnapshotSamples();
728 ASSERT_EQ(0, samples->TotalCount());
729
730 SetCurrentTimeInMinutes(test_clock, 1.3 * report_interval);
731 histogram.RecordWriteOccured();
732
733 // Now the report period has elapsed.
734 samples = histogram.GetHistogram()->SnapshotSamples();
735 ASSERT_EQ(1, samples->GetCount(3));
736 ASSERT_EQ(1, samples->TotalCount());
737
738 // The last write won't be recorded because the second count period hasn't
739 // fully elapsed.
740 SetCurrentTimeInMinutes(test_clock, 1.5 * report_interval);
741 histogram.ReportOutstandingWrites();
742
743 samples = histogram.GetHistogram()->SnapshotSamples();
744 ASSERT_EQ(1, samples->GetCount(3));
745 ASSERT_EQ(1, samples->TotalCount());
746 }
747
748 TEST_F(JsonPrefStoreTest, WriteCountHistogramTestMultiplePeriods) {
749 SimpleTestClock* test_clock = new SimpleTestClock;
750 SetCurrentTimeInMinutes(test_clock, 0);
751 JsonPrefStore::WriteCountHistogram histogram(
752 base::TimeDelta::FromSeconds(10),
753 base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
754 scoped_ptr<base::Clock>(test_clock));
755 int32 report_interval =
756 JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
757
758 histogram.RecordWriteOccured();
759 SetCurrentTimeInMinutes(test_clock, 0.5 * report_interval);
760 histogram.RecordWriteOccured();
761 SetCurrentTimeInMinutes(test_clock, 0.7 * report_interval);
762 histogram.RecordWriteOccured();
763 SetCurrentTimeInMinutes(test_clock, 1.3 * report_interval);
764 histogram.RecordWriteOccured();
765 SetCurrentTimeInMinutes(test_clock, 1.5 * report_interval);
766 histogram.RecordWriteOccured();
767 SetCurrentTimeInMinutes(test_clock, 2.1 * report_interval);
768 histogram.RecordWriteOccured();
769 SetCurrentTimeInMinutes(test_clock, 2.5 * report_interval);
770 histogram.RecordWriteOccured();
771 SetCurrentTimeInMinutes(test_clock, 2.7 * report_interval);
772 histogram.RecordWriteOccured();
773 SetCurrentTimeInMinutes(test_clock, 3.3 * report_interval);
774 histogram.RecordWriteOccured();
775
776 // The last write won't be recorded because the second count period hasn't
777 // fully elapsed
778 SetCurrentTimeInMinutes(test_clock, 3.5 * report_interval);
779 histogram.ReportOutstandingWrites();
780 scoped_ptr<HistogramSamples> samples =
781 histogram.GetHistogram()->SnapshotSamples();
782 ASSERT_EQ(2, samples->GetCount(3));
783 ASSERT_EQ(1, samples->GetCount(2));
784 ASSERT_EQ(3, samples->TotalCount());
785 }
786
787 TEST_F(JsonPrefStoreTest, WriteCountHistogramTestPeriodWithGaps) {
788 SimpleTestClock* test_clock = new SimpleTestClock;
789 SetCurrentTimeInMinutes(test_clock, 0);
790 JsonPrefStore::WriteCountHistogram histogram(
791 base::TimeDelta::FromSeconds(10),
792 base::FilePath(FILE_PATH_LITERAL("/tmp/Local State")),
793 scoped_ptr<base::Clock>(test_clock));
794 int32 report_interval =
795 JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins;
796
797 // 1 write in the first period.
798 histogram.RecordWriteOccured();
799
800 // No writes in the second and third periods.
801
802 // 2 writes in the fourth period.
803 SetCurrentTimeInMinutes(test_clock, 3.1 * report_interval);
804 histogram.RecordWriteOccured();
805 SetCurrentTimeInMinutes(test_clock, 3.3 * report_interval);
806 histogram.RecordWriteOccured();
807
808 // No writes in the fifth period.
809
810 // 3 writes in the sixth period.
811 SetCurrentTimeInMinutes(test_clock, 5.1 * report_interval);
812 histogram.RecordWriteOccured();
813 SetCurrentTimeInMinutes(test_clock, 5.3 * report_interval);
814 histogram.RecordWriteOccured();
815 SetCurrentTimeInMinutes(test_clock, 5.5 * report_interval);
816 histogram.RecordWriteOccured();
817
818 SetCurrentTimeInMinutes(test_clock, 6.1 * report_interval);
819 histogram.ReportOutstandingWrites();
820 scoped_ptr<HistogramSamples> samples =
821 histogram.GetHistogram()->SnapshotSamples();
822 ASSERT_EQ(3, samples->GetCount(0));
823 ASSERT_EQ(1, samples->GetCount(1));
824 ASSERT_EQ(1, samples->GetCount(2));
825 ASSERT_EQ(1, samples->GetCount(3));
826 ASSERT_EQ(6, samples->TotalCount());
827 }
828
674 } // namespace base 829 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698