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/metrics/histogram_tester.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/metrics/histogram_macros.h"
11 #include "base/metrics/histogram_samples.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using ::testing::ElementsAre;
16 using ::testing::IsEmpty;
17
18 namespace {
19
20 const char kHistogram1[] = "Test1";
21 const char kHistogram2[] = "Test2";
22 const char kHistogram3[] = "Test3";
23 const char kHistogram4[] = "Test4";
24 const char kHistogram5[] = "Test5";
25
26 } // namespace
27
28 namespace base {
29
30 typedef testing::Test HistogramTesterTest;
31
TEST_F(HistogramTesterTest,Scope)32 TEST_F(HistogramTesterTest, Scope) {
33 // Record a histogram before the creation of the recorder.
34 UMA_HISTOGRAM_BOOLEAN(kHistogram1, true);
35
36 HistogramTester tester;
37
38 // Verify that no histogram is recorded.
39 tester.ExpectTotalCount(kHistogram1, 0);
40
41 // Record a histogram after the creation of the recorder.
42 UMA_HISTOGRAM_BOOLEAN(kHistogram1, true);
43
44 // Verify that one histogram is recorded.
45 std::unique_ptr<HistogramSamples> samples(
46 tester.GetHistogramSamplesSinceCreation(kHistogram1));
47 EXPECT_TRUE(samples);
48 EXPECT_EQ(1, samples->TotalCount());
49 }
50
TEST_F(HistogramTesterTest,GetHistogramSamplesSinceCreationNotNull)51 TEST_F(HistogramTesterTest, GetHistogramSamplesSinceCreationNotNull) {
52 // Chose the histogram name uniquely, to ensure nothing was recorded for it so
53 // far.
54 static const char kHistogram[] =
55 "GetHistogramSamplesSinceCreationNotNullHistogram";
56 HistogramTester tester;
57
58 // Verify that the returned samples are empty but not null.
59 std::unique_ptr<HistogramSamples> samples(
60 tester.GetHistogramSamplesSinceCreation(kHistogram1));
61 EXPECT_TRUE(samples);
62 tester.ExpectTotalCount(kHistogram, 0);
63 }
64
TEST_F(HistogramTesterTest,TestUniqueSample)65 TEST_F(HistogramTesterTest, TestUniqueSample) {
66 HistogramTester tester;
67
68 // Record into a sample thrice
69 UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
70 UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
71 UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
72
73 tester.ExpectUniqueSample(kHistogram2, 2, 3);
74 }
75
TEST_F(HistogramTesterTest,TestBucketsSample)76 TEST_F(HistogramTesterTest, TestBucketsSample) {
77 HistogramTester tester;
78
79 // Record into a sample twice
80 UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
81 UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
82 UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
83 UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
84 UMA_HISTOGRAM_COUNTS_100(kHistogram3, 3);
85
86 tester.ExpectBucketCount(kHistogram3, 2, 4);
87 tester.ExpectBucketCount(kHistogram3, 3, 1);
88
89 tester.ExpectTotalCount(kHistogram3, 5);
90 }
91
TEST_F(HistogramTesterTest,TestBucketsSampleWithScope)92 TEST_F(HistogramTesterTest, TestBucketsSampleWithScope) {
93 // Record into a sample twice, once before the tester creation and once after.
94 UMA_HISTOGRAM_COUNTS_100(kHistogram4, 2);
95
96 HistogramTester tester;
97 UMA_HISTOGRAM_COUNTS_100(kHistogram4, 3);
98
99 tester.ExpectBucketCount(kHistogram4, 2, 0);
100 tester.ExpectBucketCount(kHistogram4, 3, 1);
101
102 tester.ExpectTotalCount(kHistogram4, 1);
103 }
104
TEST_F(HistogramTesterTest,TestGetAllSamples)105 TEST_F(HistogramTesterTest, TestGetAllSamples) {
106 HistogramTester tester;
107 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 2, 5);
108 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 3, 5);
109 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 3, 5);
110 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 5, 5);
111
112 EXPECT_THAT(tester.GetAllSamples(kHistogram5),
113 ElementsAre(Bucket(2, 1), Bucket(3, 2), Bucket(5, 1)));
114 }
115
TEST_F(HistogramTesterTest,TestGetAllSamples_NoSamples)116 TEST_F(HistogramTesterTest, TestGetAllSamples_NoSamples) {
117 HistogramTester tester;
118 EXPECT_THAT(tester.GetAllSamples(kHistogram5), IsEmpty());
119 }
120
TEST_F(HistogramTesterTest,TestGetTotalCountsForPrefix)121 TEST_F(HistogramTesterTest, TestGetTotalCountsForPrefix) {
122 HistogramTester tester;
123 UMA_HISTOGRAM_ENUMERATION("Test1.Test2.Test3", 2, 5);
124
125 // Regression check for bug https://crbug.com/659977.
126 EXPECT_TRUE(tester.GetTotalCountsForPrefix("Test2.").empty());
127
128 EXPECT_EQ(1u, tester.GetTotalCountsForPrefix("Test1.").size());
129 }
130
TEST_F(HistogramTesterTest,TestGetAllChangedHistograms)131 TEST_F(HistogramTesterTest, TestGetAllChangedHistograms) {
132 // Record into a sample twice, once before the tester creation.
133 UMA_HISTOGRAM_COUNTS_100(kHistogram1, true);
134 UMA_HISTOGRAM_COUNTS_100(kHistogram4, 4);
135
136 HistogramTester tester;
137 UMA_HISTOGRAM_COUNTS_100(kHistogram4, 3);
138
139 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 2, 5);
140 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 3, 5);
141 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 4, 5);
142 UMA_HISTOGRAM_ENUMERATION(kHistogram5, 5, 5);
143
144 UMA_HISTOGRAM_ENUMERATION("Test1.Test2.Test3", 2, 5);
145 std::string results = tester.GetAllHistogramsRecorded();
146
147 EXPECT_EQ(std::string::npos, results.find("Histogram: Test1 recorded"));
148 EXPECT_NE(std::string::npos,
149 results.find("Histogram: Test4 recorded 1 new samples"));
150 EXPECT_NE(std::string::npos,
151 results.find("Histogram: Test5 recorded 4 new samples"));
152 EXPECT_NE(
153 std::string::npos,
154 results.find("Histogram: Test1.Test2.Test3 recorded 1 new samples"));
155 }
156
157 } // namespace base
158