1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 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/metrics/histogram_functions.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_macros.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/test/metrics/histogram_tester.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
10*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker namespace base {
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker enum UmaHistogramTestingEnum {
16*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_TESTING_ENUM_FIRST,
17*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_TESTING_ENUM_SECOND,
18*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_TESTING_ENUM_THIRD
19*6777b538SAndroid Build Coastguard Worker };
20*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,ExactLinear)21*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, ExactLinear) {
22*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramExactLinear");
23*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
24*6777b538SAndroid Build Coastguard Worker UmaHistogramExactLinear(histogram, 10, 100);
25*6777b538SAndroid Build Coastguard Worker tester.ExpectUniqueSample(histogram, 10, 1);
26*6777b538SAndroid Build Coastguard Worker UmaHistogramExactLinear(histogram, 20, 100);
27*6777b538SAndroid Build Coastguard Worker UmaHistogramExactLinear(histogram, 10, 100);
28*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 10, 2);
29*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 20, 1);
30*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 3);
31*6777b538SAndroid Build Coastguard Worker // Test linear buckets overflow.
32*6777b538SAndroid Build Coastguard Worker UmaHistogramExactLinear(histogram, 200, 100);
33*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 101, 1);
34*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 4);
35*6777b538SAndroid Build Coastguard Worker // Test linear buckets underflow.
36*6777b538SAndroid Build Coastguard Worker UmaHistogramExactLinear(histogram, 0, 100);
37*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 0, 1);
38*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 5);
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Enumeration)41*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Enumeration) {
42*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramEnumeration");
43*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
44*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST,
45*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_TESTING_ENUM_THIRD);
46*6777b538SAndroid Build Coastguard Worker tester.ExpectUniqueSample(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST, 1);
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker // Verify the overflow & underflow bucket exists.
49*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION(
50*6777b538SAndroid Build Coastguard Worker histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 10,
51*6777b538SAndroid Build Coastguard Worker static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD));
52*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(
53*6777b538SAndroid Build Coastguard Worker histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 1, 1);
54*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 2);
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Boolean)57*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Boolean) {
58*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramBoolean");
59*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
60*6777b538SAndroid Build Coastguard Worker UmaHistogramBoolean(histogram, true);
61*6777b538SAndroid Build Coastguard Worker tester.ExpectUniqueSample(histogram, 1, 1);
62*6777b538SAndroid Build Coastguard Worker UmaHistogramBoolean(histogram, false);
63*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 0, 1);
64*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 2);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Percentage)67*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Percentage) {
68*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramPercentage");
69*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
70*6777b538SAndroid Build Coastguard Worker UmaHistogramPercentage(histogram, 1);
71*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 1, 1);
72*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 1);
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker UmaHistogramPercentage(histogram, 50);
75*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 50, 1);
76*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 2);
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker UmaHistogramPercentage(histogram, 100);
79*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 100, 1);
80*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 3);
81*6777b538SAndroid Build Coastguard Worker // Test overflows.
82*6777b538SAndroid Build Coastguard Worker UmaHistogramPercentage(histogram, 101);
83*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 101, 1);
84*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 4);
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker UmaHistogramPercentage(histogram, 500);
87*6777b538SAndroid Build Coastguard Worker tester.ExpectBucketCount(histogram, 101, 2);
88*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 5);
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Counts)91*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Counts) {
92*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramCount.Custom");
93*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker // Add a sample that should go into the underflow bucket.
96*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 0, 1, 100, 10);
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker // Add a sample that should go into the first bucket.
99*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 1, 1, 100, 10);
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker // Add multiple samples that should go into the same bucket.
102*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
103*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
104*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 21, 1, 100, 10);
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker // Add a sample that should go into the last bucket.
107*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 99, 1, 100, 10);
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker // Add some samples that should go into the overflow bucket.
110*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 100, 1, 100, 10);
111*6777b538SAndroid Build Coastguard Worker UmaHistogramCustomCounts(histogram, 101, 1, 100, 10);
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker // Verify the number of samples.
114*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 8);
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker // Verify the following:
117*6777b538SAndroid Build Coastguard Worker // (a) The underflow bucket [0, 1) contains one sample.
118*6777b538SAndroid Build Coastguard Worker // (b) The first and last buckets each contain one sample.
119*6777b538SAndroid Build Coastguard Worker // (c) The bucket for values in [16, 29) contains three samples.
120*6777b538SAndroid Build Coastguard Worker // (d) The overflow bucket contains two samples.
121*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(tester.GetAllSamples(histogram),
122*6777b538SAndroid Build Coastguard Worker testing::ElementsAre(Bucket(0, 1), Bucket(1, 1), Bucket(16, 3),
123*6777b538SAndroid Build Coastguard Worker Bucket(54, 1), Bucket(100, 2)));
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Times)126*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Times) {
127*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramTimes");
128*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
129*6777b538SAndroid Build Coastguard Worker UmaHistogramTimes(histogram, Seconds(1));
130*6777b538SAndroid Build Coastguard Worker tester.ExpectTimeBucketCount(histogram, Seconds(1), 1);
131*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 1);
132*6777b538SAndroid Build Coastguard Worker UmaHistogramTimes(histogram, Seconds(9));
133*6777b538SAndroid Build Coastguard Worker tester.ExpectTimeBucketCount(histogram, Seconds(9), 1);
134*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 2);
135*6777b538SAndroid Build Coastguard Worker UmaHistogramTimes(histogram, Seconds(10)); // Overflows
136*6777b538SAndroid Build Coastguard Worker tester.ExpectTimeBucketCount(histogram, Seconds(10), 1);
137*6777b538SAndroid Build Coastguard Worker UmaHistogramTimes(histogram, Seconds(20)); // Overflows.
138*6777b538SAndroid Build Coastguard Worker // Check the value by picking any overflow time.
139*6777b538SAndroid Build Coastguard Worker tester.ExpectTimeBucketCount(histogram, Seconds(11), 2);
140*6777b538SAndroid Build Coastguard Worker tester.ExpectTotalCount(histogram, 4);
141*6777b538SAndroid Build Coastguard Worker }
142*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Sparse_SupportsLargeRange)143*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Sparse_SupportsLargeRange) {
144*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramSparse");
145*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
146*6777b538SAndroid Build Coastguard Worker UmaHistogramSparse(histogram, 0);
147*6777b538SAndroid Build Coastguard Worker UmaHistogramSparse(histogram, 123456789);
148*6777b538SAndroid Build Coastguard Worker UmaHistogramSparse(histogram, 123456789);
149*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(tester.GetAllSamples(histogram),
150*6777b538SAndroid Build Coastguard Worker testing::ElementsAre(Bucket(0, 1), Bucket(123456789, 2)));
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker
TEST(HistogramFunctionsTest,Sparse_SupportsNegativeValues)153*6777b538SAndroid Build Coastguard Worker TEST(HistogramFunctionsTest, Sparse_SupportsNegativeValues) {
154*6777b538SAndroid Build Coastguard Worker std::string histogram("Testing.UMA.HistogramSparse");
155*6777b538SAndroid Build Coastguard Worker HistogramTester tester;
156*6777b538SAndroid Build Coastguard Worker UmaHistogramSparse(histogram, -1);
157*6777b538SAndroid Build Coastguard Worker tester.ExpectUniqueSample(histogram, -1, 1);
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker } // namespace base.
161