xref: /aosp_15_r20/external/cronet/base/test/metrics/histogram_tester.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/test/metrics/histogram_tester.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <string_view>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_samples.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/metrics/metrics_hashes.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/metrics/sample_map.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/metrics/sparse_histogram.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/metrics/statistics_recorder.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
19*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker namespace base {
22*6777b538SAndroid Build Coastguard Worker 
HistogramTester()23*6777b538SAndroid Build Coastguard Worker HistogramTester::HistogramTester() {
24*6777b538SAndroid Build Coastguard Worker   // Record any histogram data that exists when the object is created so it can
25*6777b538SAndroid Build Coastguard Worker   // be subtracted later.
26*6777b538SAndroid Build Coastguard Worker   for (const auto* const histogram : StatisticsRecorder::GetHistograms()) {
27*6777b538SAndroid Build Coastguard Worker     histograms_snapshot_[histogram->histogram_name()] =
28*6777b538SAndroid Build Coastguard Worker         histogram->SnapshotSamples();
29*6777b538SAndroid Build Coastguard Worker   }
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker HistogramTester::~HistogramTester() = default;
33*6777b538SAndroid Build Coastguard Worker 
ExpectUniqueSample(std::string_view name,HistogramBase::Sample sample,HistogramBase::Count expected_bucket_count,const Location & location) const34*6777b538SAndroid Build Coastguard Worker void HistogramTester::ExpectUniqueSample(
35*6777b538SAndroid Build Coastguard Worker     std::string_view name,
36*6777b538SAndroid Build Coastguard Worker     HistogramBase::Sample sample,
37*6777b538SAndroid Build Coastguard Worker     HistogramBase::Count expected_bucket_count,
38*6777b538SAndroid Build Coastguard Worker     const Location& location) const {
39*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
40*6777b538SAndroid Build Coastguard Worker   if (histogram) {
41*6777b538SAndroid Build Coastguard Worker     int actual_bucket_count;
42*6777b538SAndroid Build Coastguard Worker     int actual_total_count;
43*6777b538SAndroid Build Coastguard Worker     GetBucketCountForSamples(*histogram, sample, &actual_bucket_count,
44*6777b538SAndroid Build Coastguard Worker                              &actual_total_count);
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(expected_bucket_count == actual_bucket_count &&
47*6777b538SAndroid Build Coastguard Worker                 expected_bucket_count == actual_total_count)
48*6777b538SAndroid Build Coastguard Worker         << "Histogram \"" << name << "\" did not meet its expectations.\n"
49*6777b538SAndroid Build Coastguard Worker         << "Bucket " << sample << " should contain " << expected_bucket_count
50*6777b538SAndroid Build Coastguard Worker         << " samples and contained " << actual_bucket_count << " samples.\n"
51*6777b538SAndroid Build Coastguard Worker         << "The total count of samples in the histogram should be "
52*6777b538SAndroid Build Coastguard Worker         << expected_bucket_count << " and was " << actual_total_count << ".\n"
53*6777b538SAndroid Build Coastguard Worker         << SnapshotToString(*histogram) << "\n"
54*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
55*6777b538SAndroid Build Coastguard Worker   } else {
56*6777b538SAndroid Build Coastguard Worker     // No histogram means there were zero samples.
57*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, expected_bucket_count)
58*6777b538SAndroid Build Coastguard Worker         << "Zero samples found for Histogram \"" << name << "\".\n"
59*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
60*6777b538SAndroid Build Coastguard Worker     return;
61*6777b538SAndroid Build Coastguard Worker   }
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker 
ExpectUniqueTimeSample(std::string_view name,TimeDelta sample,HistogramBase::Count expected_bucket_count,const Location & location) const64*6777b538SAndroid Build Coastguard Worker void HistogramTester::ExpectUniqueTimeSample(
65*6777b538SAndroid Build Coastguard Worker     std::string_view name,
66*6777b538SAndroid Build Coastguard Worker     TimeDelta sample,
67*6777b538SAndroid Build Coastguard Worker     HistogramBase::Count expected_bucket_count,
68*6777b538SAndroid Build Coastguard Worker     const Location& location) const {
69*6777b538SAndroid Build Coastguard Worker   ExpectUniqueSample(name, sample.InMilliseconds(), expected_bucket_count,
70*6777b538SAndroid Build Coastguard Worker                      location);
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
ExpectBucketCount(std::string_view name,HistogramBase::Sample sample,HistogramBase::Count expected_count,const Location & location) const73*6777b538SAndroid Build Coastguard Worker void HistogramTester::ExpectBucketCount(std::string_view name,
74*6777b538SAndroid Build Coastguard Worker                                         HistogramBase::Sample sample,
75*6777b538SAndroid Build Coastguard Worker                                         HistogramBase::Count expected_count,
76*6777b538SAndroid Build Coastguard Worker                                         const Location& location) const {
77*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
78*6777b538SAndroid Build Coastguard Worker   if (histogram) {
79*6777b538SAndroid Build Coastguard Worker     int actual_count;
80*6777b538SAndroid Build Coastguard Worker     GetBucketCountForSamples(*histogram, sample, &actual_count,
81*6777b538SAndroid Build Coastguard Worker                              /*total_count=*/nullptr);
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(expected_count, actual_count)
84*6777b538SAndroid Build Coastguard Worker         << "Histogram \"" << name
85*6777b538SAndroid Build Coastguard Worker         << "\" does not have the right number of samples (" << expected_count
86*6777b538SAndroid Build Coastguard Worker         << ") in the expected bucket (" << sample << "). It has ("
87*6777b538SAndroid Build Coastguard Worker         << actual_count << ").\n"
88*6777b538SAndroid Build Coastguard Worker         << SnapshotToString(*histogram) << "\n"
89*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
90*6777b538SAndroid Build Coastguard Worker   } else {
91*6777b538SAndroid Build Coastguard Worker     // No histogram means there were zero samples.
92*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, expected_count)
93*6777b538SAndroid Build Coastguard Worker         << "Histogram \"" << name << "\" does not exist. "
94*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
95*6777b538SAndroid Build Coastguard Worker   }
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker 
ExpectTotalCount(std::string_view name,HistogramBase::Count expected_count,const Location & location) const98*6777b538SAndroid Build Coastguard Worker void HistogramTester::ExpectTotalCount(std::string_view name,
99*6777b538SAndroid Build Coastguard Worker                                        HistogramBase::Count expected_count,
100*6777b538SAndroid Build Coastguard Worker                                        const Location& location) const {
101*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
102*6777b538SAndroid Build Coastguard Worker   if (histogram) {
103*6777b538SAndroid Build Coastguard Worker     int actual_count = GetTotalCountForSamples(*histogram);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(expected_count, actual_count)
106*6777b538SAndroid Build Coastguard Worker         << "Histogram \"" << name
107*6777b538SAndroid Build Coastguard Worker         << "\" does not have the right total number of samples ("
108*6777b538SAndroid Build Coastguard Worker         << expected_count << "). It has (" << actual_count << ").\n"
109*6777b538SAndroid Build Coastguard Worker         << SnapshotToString(*histogram) << "\n"
110*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
111*6777b538SAndroid Build Coastguard Worker   } else {
112*6777b538SAndroid Build Coastguard Worker     // No histogram means there were zero samples.
113*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(0, expected_count)
114*6777b538SAndroid Build Coastguard Worker         << "Histogram \"" << name << "\" does not exist. "
115*6777b538SAndroid Build Coastguard Worker         << "(expected at " << location.ToString() << ")";
116*6777b538SAndroid Build Coastguard Worker   }
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker 
ExpectTimeBucketCount(std::string_view name,TimeDelta sample,HistogramBase::Count count,const Location & location) const119*6777b538SAndroid Build Coastguard Worker void HistogramTester::ExpectTimeBucketCount(std::string_view name,
120*6777b538SAndroid Build Coastguard Worker                                             TimeDelta sample,
121*6777b538SAndroid Build Coastguard Worker                                             HistogramBase::Count count,
122*6777b538SAndroid Build Coastguard Worker                                             const Location& location) const {
123*6777b538SAndroid Build Coastguard Worker   ExpectBucketCount(name, sample.InMilliseconds(), count, location);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
GetTotalSum(std::string_view name) const126*6777b538SAndroid Build Coastguard Worker int64_t HistogramTester::GetTotalSum(std::string_view name) const {
127*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
128*6777b538SAndroid Build Coastguard Worker   if (!histogram)
129*6777b538SAndroid Build Coastguard Worker     return 0;
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   int64_t original_sum = 0;
132*6777b538SAndroid Build Coastguard Worker   auto original_samples_it = histograms_snapshot_.find(name);
133*6777b538SAndroid Build Coastguard Worker   if (original_samples_it != histograms_snapshot_.end())
134*6777b538SAndroid Build Coastguard Worker     original_sum = original_samples_it->second->sum();
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
137*6777b538SAndroid Build Coastguard Worker   return samples->sum() - original_sum;
138*6777b538SAndroid Build Coastguard Worker }
139*6777b538SAndroid Build Coastguard Worker 
GetAllSamples(std::string_view name) const140*6777b538SAndroid Build Coastguard Worker std::vector<Bucket> HistogramTester::GetAllSamples(
141*6777b538SAndroid Build Coastguard Worker     std::string_view name) const {
142*6777b538SAndroid Build Coastguard Worker   std::vector<Bucket> samples;
143*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> snapshot =
144*6777b538SAndroid Build Coastguard Worker       GetHistogramSamplesSinceCreation(name);
145*6777b538SAndroid Build Coastguard Worker   if (snapshot) {
146*6777b538SAndroid Build Coastguard Worker     for (auto it = snapshot->Iterator(); !it->Done(); it->Next()) {
147*6777b538SAndroid Build Coastguard Worker       HistogramBase::Sample sample;
148*6777b538SAndroid Build Coastguard Worker       int64_t max;
149*6777b538SAndroid Build Coastguard Worker       HistogramBase::Count count;
150*6777b538SAndroid Build Coastguard Worker       it->Get(&sample, &max, &count);
151*6777b538SAndroid Build Coastguard Worker       samples.emplace_back(sample, count);
152*6777b538SAndroid Build Coastguard Worker     }
153*6777b538SAndroid Build Coastguard Worker   }
154*6777b538SAndroid Build Coastguard Worker   return samples;
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
GetBucketCount(std::string_view name,HistogramBase::Sample sample) const157*6777b538SAndroid Build Coastguard Worker HistogramBase::Count HistogramTester::GetBucketCount(
158*6777b538SAndroid Build Coastguard Worker     std::string_view name,
159*6777b538SAndroid Build Coastguard Worker     HistogramBase::Sample sample) const {
160*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
161*6777b538SAndroid Build Coastguard Worker   HistogramBase::Count count = 0;
162*6777b538SAndroid Build Coastguard Worker   if (histogram) {
163*6777b538SAndroid Build Coastguard Worker     GetBucketCountForSamples(*histogram, sample, &count,
164*6777b538SAndroid Build Coastguard Worker                              /*total_count=*/nullptr);
165*6777b538SAndroid Build Coastguard Worker   }
166*6777b538SAndroid Build Coastguard Worker   return count;
167*6777b538SAndroid Build Coastguard Worker }
168*6777b538SAndroid Build Coastguard Worker 
GetBucketCountForSamples(const HistogramBase & histogram,HistogramBase::Sample sample,HistogramBase::Count * count,HistogramBase::Count * total_count) const169*6777b538SAndroid Build Coastguard Worker void HistogramTester::GetBucketCountForSamples(
170*6777b538SAndroid Build Coastguard Worker     const HistogramBase& histogram,
171*6777b538SAndroid Build Coastguard Worker     HistogramBase::Sample sample,
172*6777b538SAndroid Build Coastguard Worker     HistogramBase::Count* count,
173*6777b538SAndroid Build Coastguard Worker     HistogramBase::Count* total_count) const {
174*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> samples = histogram.SnapshotSamples();
175*6777b538SAndroid Build Coastguard Worker   *count = samples->GetCount(sample);
176*6777b538SAndroid Build Coastguard Worker   if (total_count)
177*6777b538SAndroid Build Coastguard Worker     *total_count = samples->TotalCount();
178*6777b538SAndroid Build Coastguard Worker   auto histogram_data = histograms_snapshot_.find(histogram.histogram_name());
179*6777b538SAndroid Build Coastguard Worker   if (histogram_data != histograms_snapshot_.end()) {
180*6777b538SAndroid Build Coastguard Worker     *count -= histogram_data->second->GetCount(sample);
181*6777b538SAndroid Build Coastguard Worker     if (total_count)
182*6777b538SAndroid Build Coastguard Worker       *total_count -= histogram_data->second->TotalCount();
183*6777b538SAndroid Build Coastguard Worker   }
184*6777b538SAndroid Build Coastguard Worker }
185*6777b538SAndroid Build Coastguard Worker 
GetTotalCountsForPrefix(std::string_view prefix) const186*6777b538SAndroid Build Coastguard Worker HistogramTester::CountsMap HistogramTester::GetTotalCountsForPrefix(
187*6777b538SAndroid Build Coastguard Worker     std::string_view prefix) const {
188*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(prefix.find('.') != StringPiece::npos)
189*6777b538SAndroid Build Coastguard Worker       << "|prefix| ought to contain at least one period, to avoid matching too"
190*6777b538SAndroid Build Coastguard Worker       << " many histograms.";
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   CountsMap result;
193*6777b538SAndroid Build Coastguard Worker 
194*6777b538SAndroid Build Coastguard Worker   // Find candidate matches by using the logic built into GetSnapshot().
195*6777b538SAndroid Build Coastguard Worker   for (const HistogramBase* histogram : StatisticsRecorder::GetHistograms()) {
196*6777b538SAndroid Build Coastguard Worker     if (!StartsWith(histogram->histogram_name(), prefix,
197*6777b538SAndroid Build Coastguard Worker                     CompareCase::SENSITIVE)) {
198*6777b538SAndroid Build Coastguard Worker       continue;
199*6777b538SAndroid Build Coastguard Worker     }
200*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<HistogramSamples> new_samples =
201*6777b538SAndroid Build Coastguard Worker         GetHistogramSamplesSinceCreation(histogram->histogram_name());
202*6777b538SAndroid Build Coastguard Worker     // Omit unchanged histograms from the result.
203*6777b538SAndroid Build Coastguard Worker     if (new_samples->TotalCount()) {
204*6777b538SAndroid Build Coastguard Worker       result[histogram->histogram_name()] = new_samples->TotalCount();
205*6777b538SAndroid Build Coastguard Worker     }
206*6777b538SAndroid Build Coastguard Worker   }
207*6777b538SAndroid Build Coastguard Worker   return result;
208*6777b538SAndroid Build Coastguard Worker }
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples>
GetHistogramSamplesSinceCreation(std::string_view histogram_name) const211*6777b538SAndroid Build Coastguard Worker HistogramTester::GetHistogramSamplesSinceCreation(
212*6777b538SAndroid Build Coastguard Worker     std::string_view histogram_name) const {
213*6777b538SAndroid Build Coastguard Worker   HistogramBase* histogram = StatisticsRecorder::FindHistogram(histogram_name);
214*6777b538SAndroid Build Coastguard Worker   // Whether the histogram exists or not may not depend on the current test
215*6777b538SAndroid Build Coastguard Worker   // calling this method, but rather on which tests ran before and possibly
216*6777b538SAndroid Build Coastguard Worker   // generated a histogram or not (see http://crbug.com/473689). To provide a
217*6777b538SAndroid Build Coastguard Worker   // response which is independent of the previously run tests, this method
218*6777b538SAndroid Build Coastguard Worker   // creates empty samples in the absence of the histogram, rather than
219*6777b538SAndroid Build Coastguard Worker   // returning null.
220*6777b538SAndroid Build Coastguard Worker   if (!histogram) {
221*6777b538SAndroid Build Coastguard Worker     return std::unique_ptr<HistogramSamples>(
222*6777b538SAndroid Build Coastguard Worker         new SampleMap(HashMetricName(histogram_name)));
223*6777b538SAndroid Build Coastguard Worker   }
224*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> named_samples =
225*6777b538SAndroid Build Coastguard Worker       histogram->SnapshotSamples();
226*6777b538SAndroid Build Coastguard Worker   auto original_samples_it = histograms_snapshot_.find(histogram_name);
227*6777b538SAndroid Build Coastguard Worker   if (original_samples_it != histograms_snapshot_.end())
228*6777b538SAndroid Build Coastguard Worker     named_samples->Subtract(*original_samples_it->second.get());
229*6777b538SAndroid Build Coastguard Worker   return named_samples;
230*6777b538SAndroid Build Coastguard Worker }
231*6777b538SAndroid Build Coastguard Worker 
GetAllHistogramsRecorded() const232*6777b538SAndroid Build Coastguard Worker std::string HistogramTester::GetAllHistogramsRecorded() const {
233*6777b538SAndroid Build Coastguard Worker   std::string output;
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker   for (const auto* const histogram : StatisticsRecorder::GetHistograms()) {
236*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<HistogramSamples> named_samples =
237*6777b538SAndroid Build Coastguard Worker         histogram->SnapshotSamples();
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker     for (const auto& histogram_data : histograms_snapshot_) {
240*6777b538SAndroid Build Coastguard Worker       if (histogram_data.first == histogram->histogram_name())
241*6777b538SAndroid Build Coastguard Worker         named_samples->Subtract(*histogram_data.second);
242*6777b538SAndroid Build Coastguard Worker     }
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker     if (named_samples->TotalCount()) {
245*6777b538SAndroid Build Coastguard Worker       auto current_count = histogram->SnapshotSamples()->TotalCount();
246*6777b538SAndroid Build Coastguard Worker       StringAppendF(&output, "Histogram: %s recorded %d new samples.\n",
247*6777b538SAndroid Build Coastguard Worker                     histogram->histogram_name(), named_samples->TotalCount());
248*6777b538SAndroid Build Coastguard Worker       if (current_count != named_samples->TotalCount()) {
249*6777b538SAndroid Build Coastguard Worker         StringAppendF(&output,
250*6777b538SAndroid Build Coastguard Worker                       "WARNING: There were samples recorded to this histogram "
251*6777b538SAndroid Build Coastguard Worker                       "before tester instantiation.\n");
252*6777b538SAndroid Build Coastguard Worker       }
253*6777b538SAndroid Build Coastguard Worker       histogram->WriteAscii(&output);
254*6777b538SAndroid Build Coastguard Worker       StringAppendF(&output, "\n");
255*6777b538SAndroid Build Coastguard Worker     }
256*6777b538SAndroid Build Coastguard Worker   }
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   return output;
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker 
GetTotalCountForSamples(const base::HistogramBase & histogram) const261*6777b538SAndroid Build Coastguard Worker int HistogramTester::GetTotalCountForSamples(
262*6777b538SAndroid Build Coastguard Worker     const base::HistogramBase& histogram) const {
263*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> samples = histogram.SnapshotSamples();
264*6777b538SAndroid Build Coastguard Worker   int actual_count = samples->TotalCount();
265*6777b538SAndroid Build Coastguard Worker   auto histogram_data = histograms_snapshot_.find(histogram.histogram_name());
266*6777b538SAndroid Build Coastguard Worker   if (histogram_data != histograms_snapshot_.end())
267*6777b538SAndroid Build Coastguard Worker     actual_count -= histogram_data->second->TotalCount();
268*6777b538SAndroid Build Coastguard Worker   return actual_count;
269*6777b538SAndroid Build Coastguard Worker }
270*6777b538SAndroid Build Coastguard Worker 
SnapshotToString(const base::HistogramBase & histogram) const271*6777b538SAndroid Build Coastguard Worker std::string HistogramTester::SnapshotToString(
272*6777b538SAndroid Build Coastguard Worker     const base::HistogramBase& histogram) const {
273*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<HistogramSamples> snapshot =
274*6777b538SAndroid Build Coastguard Worker       GetHistogramSamplesSinceCreation(histogram.histogram_name());
275*6777b538SAndroid Build Coastguard Worker 
276*6777b538SAndroid Build Coastguard Worker   base::Value::Dict graph_dict =
277*6777b538SAndroid Build Coastguard Worker       snapshot->ToGraphDict(histogram.histogram_name(), histogram.flags());
278*6777b538SAndroid Build Coastguard Worker   std::string tmp;
279*6777b538SAndroid Build Coastguard Worker   // The header message describes this histogram samples (name of the histogram
280*6777b538SAndroid Build Coastguard Worker   // and median of the samples). The body contains an ASCII art histogram of the
281*6777b538SAndroid Build Coastguard Worker   // samples.
282*6777b538SAndroid Build Coastguard Worker   tmp.append(*graph_dict.FindString("header"));
283*6777b538SAndroid Build Coastguard Worker   tmp.append("\n");
284*6777b538SAndroid Build Coastguard Worker   tmp.append(*graph_dict.FindString("body"));
285*6777b538SAndroid Build Coastguard Worker   return tmp;
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker 
PrintTo(const Bucket & bucket,std::ostream * os)288*6777b538SAndroid Build Coastguard Worker void PrintTo(const Bucket& bucket, std::ostream* os) {
289*6777b538SAndroid Build Coastguard Worker   *os << "Bucket " << bucket.min << ": " << bucket.count;
290*6777b538SAndroid Build Coastguard Worker }
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker }  // namespace base
293