xref: /aosp_15_r20/external/cronet/base/metrics/histogram_functions_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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