• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
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 "base/test/histogram_tester.h"
6 
7 #include "base/metrics/histogram.h"
8 #include "base/metrics/histogram_samples.h"
9 #include "base/metrics/statistics_recorder.h"
10 #include "base/stl_util.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace base {
14 
HistogramTester()15 HistogramTester::HistogramTester() {
16   StatisticsRecorder::Initialize();  // Safe to call multiple times.
17 
18   // Record any histogram data that exists when the object is created so it can
19   // be subtracted later.
20   StatisticsRecorder::Histograms histograms;
21   StatisticsRecorder::GetSnapshot(std::string(), &histograms);
22   for (size_t i = 0; i < histograms.size(); ++i) {
23     histograms_snapshot_[histograms[i]->histogram_name()] =
24         histograms[i]->SnapshotSamples().release();
25   }
26 }
27 
~HistogramTester()28 HistogramTester::~HistogramTester() {
29   STLDeleteValues(&histograms_snapshot_);
30 }
31 
ExpectUniqueSample(const std::string & name,base::HistogramBase::Sample sample,base::HistogramBase::Count expected_count) const32 void HistogramTester::ExpectUniqueSample(
33     const std::string& name,
34     base::HistogramBase::Sample sample,
35     base::HistogramBase::Count expected_count) const {
36   base::HistogramBase* histogram =
37       base::StatisticsRecorder::FindHistogram(name);
38   EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
39       << "Histogram \"" << name << "\" does not exist.";
40 
41   if (histogram) {
42     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
43     CheckBucketCount(name, sample, expected_count, *samples);
44     CheckTotalCount(name, expected_count, *samples);
45   }
46 }
47 
ExpectBucketCount(const std::string & name,base::HistogramBase::Sample sample,base::HistogramBase::Count expected_count) const48 void HistogramTester::ExpectBucketCount(
49     const std::string& name,
50     base::HistogramBase::Sample sample,
51     base::HistogramBase::Count expected_count) const {
52   base::HistogramBase* histogram =
53       base::StatisticsRecorder::FindHistogram(name);
54   EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
55       << "Histogram \"" << name << "\" does not exist.";
56 
57   if (histogram) {
58     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
59     CheckBucketCount(name, sample, expected_count, *samples);
60   }
61 }
62 
ExpectTotalCount(const std::string & name,base::HistogramBase::Count count) const63 void HistogramTester::ExpectTotalCount(const std::string& name,
64                                        base::HistogramBase::Count count) const {
65   base::HistogramBase* histogram =
66       base::StatisticsRecorder::FindHistogram(name);
67   if (histogram) {
68     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
69     CheckTotalCount(name, count, *samples);
70   } else {
71     // No histogram means there were zero samples.
72     EXPECT_EQ(count, 0) << "Histogram \"" << name << "\" does not exist.";
73   }
74 }
75 
GetHistogramSamplesSinceCreation(const std::string & histogram_name)76 scoped_ptr<HistogramSamples> HistogramTester::GetHistogramSamplesSinceCreation(
77     const std::string& histogram_name) {
78   HistogramBase* histogram = StatisticsRecorder::FindHistogram(histogram_name);
79   if (!histogram)
80     return scoped_ptr<HistogramSamples>();
81   scoped_ptr<HistogramSamples> named_samples(histogram->SnapshotSamples());
82   HistogramSamples* named_original_samples =
83       histograms_snapshot_[histogram_name];
84   if (named_original_samples)
85     named_samples->Subtract(*named_original_samples);
86   return named_samples.Pass();
87 }
88 
CheckBucketCount(const std::string & name,base::HistogramBase::Sample sample,base::HistogramBase::Count expected_count,base::HistogramSamples & samples) const89 void HistogramTester::CheckBucketCount(
90     const std::string& name,
91     base::HistogramBase::Sample sample,
92     base::HistogramBase::Count expected_count,
93     base::HistogramSamples& samples) const {
94   int actual_count = samples.GetCount(sample);
95   std::map<std::string, HistogramSamples*>::const_iterator histogram_data;
96   histogram_data = histograms_snapshot_.find(name);
97   if (histogram_data != histograms_snapshot_.end())
98     actual_count -= histogram_data->second->GetCount(sample);
99 
100   EXPECT_EQ(expected_count, actual_count)
101       << "Histogram \"" << name
102       << "\" does not have the right number of samples (" << expected_count
103       << ") in the expected bucket (" << sample << "). It has (" << actual_count
104       << ").";
105 }
106 
CheckTotalCount(const std::string & name,base::HistogramBase::Count expected_count,base::HistogramSamples & samples) const107 void HistogramTester::CheckTotalCount(const std::string& name,
108                                       base::HistogramBase::Count expected_count,
109                                       base::HistogramSamples& samples) const {
110   int actual_count = samples.TotalCount();
111   std::map<std::string, HistogramSamples*>::const_iterator histogram_data;
112   histogram_data = histograms_snapshot_.find(name);
113   if (histogram_data != histograms_snapshot_.end())
114     actual_count -= histogram_data->second->TotalCount();
115 
116   EXPECT_EQ(expected_count, actual_count)
117       << "Histogram \"" << name
118       << "\" does not have the right total number of samples ("
119       << expected_count << "). It has (" << actual_count << ").";
120 }
121 
122 }  // namespace base
123