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

Side by Side Diff: components/metrics/file_metrics_provider_unittest.cc

Issue 1537743006: Persist setup metrics and have Chrome report them during UMA upload. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shared-histograms
Patch Set: address (many) comments by Greg Created 4 years, 10 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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
grt (UTC plus 2) 2016/02/08 18:09:19 2016
bcwhite 2016/02/09 21:08:46 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/metrics/file_metrics_provider.h"
6
7 #include "base/files/file_util.h"
8 #include "base/files/memory_mapped_file.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/metrics/histogram.h"
11 #include "base/metrics/histogram_flattener.h"
12 #include "base/metrics/histogram_persistence.h"
13 #include "base/metrics/histogram_snapshot_manager.h"
14 #include "base/metrics/persistent_memory_allocator.h"
15 #include "base/prefs/pref_registry_simple.h"
16 #include "base/prefs/testing_pref_service.h"
17 #include "components/metrics/metrics_pref_names.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 using namespace base;
21
22 namespace {
23 const char* kMetricsName = "TestMetrics";
grt (UTC plus 2) 2016/02/08 18:09:19 nit: const char kMetricsName[] =
bcwhite 2016/02/09 21:08:46 Done.
24 const char* kMetricsFilename = "file.metrics";
25 } // namespace
26
27 namespace metrics {
28
29 class HistogramFlattenerDeltaRecorder : public HistogramFlattener {
30 public:
31 HistogramFlattenerDeltaRecorder() {}
32
33 void RecordDelta(const HistogramBase& histogram,
34 const HistogramSamples& snapshot) override {
35 recorded_delta_histogram_names_.push_back(histogram.histogram_name());
36 }
37
38 void InconsistencyDetected(HistogramBase::Inconsistency problem) override {
39 ASSERT_TRUE(false);
40 }
41
42 void UniqueInconsistencyDetected(
43 HistogramBase::Inconsistency problem) override {
44 ASSERT_TRUE(false);
45 }
46
47 void InconsistencyDetectedInLoggedCount(int amount) override {
48 ASSERT_TRUE(false);
49 }
50
51 std::vector<std::string> GetRecordedDeltaHistogramNames() {
52 return recorded_delta_histogram_names_;
53 }
54
55 private:
56 std::vector<std::string> recorded_delta_histogram_names_;
57
58 DISALLOW_COPY_AND_ASSIGN(HistogramFlattenerDeltaRecorder);
59 };
60
61 class FileMetricsProviderTest : public testing::Test {
62 protected:
63
grt (UTC plus 2) 2016/02/08 18:09:19 nit: omit blank line
bcwhite 2016/02/09 21:08:46 Done.
64 FileMetricsProviderTest() : prefs_(new TestingPrefServiceSimple) {
65 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
66 FileMetricsProvider::RegisterPrefs(prefs_->registry(), kMetricsName);
67 }
68
69 TestingPrefServiceSimple* prefs() { return prefs_.get(); }
70 FilePath temp_dir() { return temp_dir_.path(); }
71 FilePath metrics_file() {
72 return temp_dir_.path().AppendASCII(kMetricsFilename);
73 }
74
75 FileMetricsProvider* provider() {
76 if (!provider_)
77 provider_.reset(new FileMetricsProvider(nullptr, prefs()));
78 return provider_.get();
79 }
80
81 private:
82 ScopedTempDir temp_dir_;
83 scoped_ptr<TestingPrefServiceSimple> prefs_;
84 scoped_ptr<FileMetricsProvider> provider_;
85
86 DISALLOW_COPY_AND_ASSIGN(FileMetricsProviderTest);
87 };
88
89
90 TEST_F(FileMetricsProviderTest, AccessMetrics) {
grt (UTC plus 2) 2016/02/08 18:09:19 this looks like a "white box" test that is tightly
bcwhite 2016/02/09 21:08:46 Done.
91 ASSERT_FALSE(PathExists(metrics_file()));
92
93 {
94 // Get this first so it isn't created inside the persistent allocator.
95 GetCreateHistogramResultHistogram();
96
97 SetPersistentHistogramMemoryAllocator(
98 new LocalPersistentMemoryAllocator(64 << 10, 0, kMetricsName));
99 HistogramBase* foo = Histogram::FactoryGet("foo", 1, 100, 10, 0);
100 HistogramBase* bar = Histogram::FactoryGet("bar", 1, 100, 10, 0);
101 foo->Add(42);
102 bar->Add(84);
103
104 scoped_ptr<PersistentMemoryAllocator> allocator(
105 ReleasePersistentHistogramMemoryAllocator());
106 File writer(metrics_file(), File::FLAG_CREATE | File::FLAG_WRITE);
107 EXPECT_TRUE(writer.IsValid());
108 writer.Write(0, (const char*)allocator->data(), allocator->used());
109 }
110
111 ASSERT_TRUE(PathExists(metrics_file()));
112 EXPECT_EQ(0, provider()->metrics_files_.size());
113 provider()->RegisterFile(metrics_file(),
114 FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC,
115 kMetricsName);
116 EXPECT_EQ(1, provider()->metrics_files_.size());
117
118 scoped_ptr<FileMetricsProvider::FileInformationList> check_list(
119 new FileMetricsProvider::FileInformationList());
120 std::swap(provider()->metrics_files_, *check_list);
121 FileMetricsProvider::FileInformation* file = check_list->begin()->get();
122 ASSERT_TRUE(file);
123 base::Time not_seen = file->last_seen;
124
125 // Simulate schedules tasks and callbacks to detect file availability.
126 EXPECT_EQ(0, provider()->metrics_found_.size());
127 ASSERT_TRUE(provider()->CheckAndMapNewMetrics(file));
128 provider()->RecordFileInformation(check_list.get());
129 EXPECT_EQ(1, provider()->metrics_found_.size());
130 EXPECT_EQ(0, provider()->metrics_files_.size());
131 ASSERT_TRUE(file->mapped);
132 ASSERT_FALSE(file->allocator);
133
134 // Management of file-check results is done by OnDidCreateMetricsLog.
135 provider()->OnDidCreateMetricsLog();
136 EXPECT_EQ(1, provider()->metrics_found_.size());
137 EXPECT_EQ(0, provider()->metrics_files_.size());
138
139 // Record embedded snapshots via snapshot-manager.
140 HistogramFlattenerDeltaRecorder flattener;
141 HistogramSnapshotManager snapshot_manager(&flattener);
142 snapshot_manager.StartDeltas();
143 provider()->RecordHistogramSnapshots(&snapshot_manager);
144 snapshot_manager.FinishDeltas();
145 EXPECT_EQ(2, flattener.GetRecordedDeltaHistogramNames().size());
146
147 // Release happens when snapshot is complete.
148 EXPECT_FALSE(file->mapped);
149 EXPECT_FALSE(file->allocator);
150 EXPECT_LT(not_seen, file->last_seen);
151
152 // Next call to OnDidCreateMetricsLog will re-categorize the file.
153 provider()->OnDidCreateMetricsLog();
154 EXPECT_EQ(0, provider()->metrics_found_.size());
155 EXPECT_EQ(1, provider()->metrics_files_.size());
156 }
157
158 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698