blob: 630d436b51cc9ed5ea0a16e4a70a0cdbd0a52dcf [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2016 The Chromium Authors
nikunjb09d94502016-11-14 22:06:252// 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/metrics/histogram_functions.h"
6
7#include "base/metrics/histogram_macros.h"
Devlin Cronin15291e9c2018-06-07 21:37:488#include "base/test/metrics/histogram_tester.h"
nikunjb09d94502016-11-14 22:06:259#include "base/time/time.h"
Ilya Sherman16d5d5f42017-12-08 00:32:4410#include "testing/gmock/include/gmock/gmock.h"
nikunjb09d94502016-11-14 22:06:2511#include "testing/gtest/include/gtest/gtest.h"
12
13namespace base {
14
15enum UmaHistogramTestingEnum {
16 UMA_HISTOGRAM_TESTING_ENUM_FIRST,
17 UMA_HISTOGRAM_TESTING_ENUM_SECOND,
18 UMA_HISTOGRAM_TESTING_ENUM_THIRD
19};
20
Ilya Sherman16d5d5f42017-12-08 00:32:4421TEST(HistogramFunctionsTest, ExactLinear) {
nikunjb09d94502016-11-14 22:06:2522 std::string histogram("Testing.UMA.HistogramExactLinear");
23 HistogramTester tester;
24 UmaHistogramExactLinear(histogram, 10, 100);
25 tester.ExpectUniqueSample(histogram, 10, 1);
26 UmaHistogramExactLinear(histogram, 20, 100);
27 UmaHistogramExactLinear(histogram, 10, 100);
28 tester.ExpectBucketCount(histogram, 10, 2);
29 tester.ExpectBucketCount(histogram, 20, 1);
30 tester.ExpectTotalCount(histogram, 3);
31 // Test linear buckets overflow.
32 UmaHistogramExactLinear(histogram, 200, 100);
33 tester.ExpectBucketCount(histogram, 101, 1);
34 tester.ExpectTotalCount(histogram, 4);
35 // Test linear buckets underflow.
36 UmaHistogramExactLinear(histogram, 0, 100);
37 tester.ExpectBucketCount(histogram, 0, 1);
38 tester.ExpectTotalCount(histogram, 5);
39}
40
Ilya Sherman16d5d5f42017-12-08 00:32:4441TEST(HistogramFunctionsTest, Enumeration) {
nikunjb09d94502016-11-14 22:06:2542 std::string histogram("Testing.UMA.HistogramEnumeration");
43 HistogramTester tester;
44 UmaHistogramEnumeration(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST,
45 UMA_HISTOGRAM_TESTING_ENUM_THIRD);
46 tester.ExpectUniqueSample(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST, 1);
47
48 // Verify the overflow & underflow bucket exists.
49 UMA_HISTOGRAM_ENUMERATION(
50 histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 10,
Wei-Yin Chen (陳威尹)3330991f2017-07-27 17:25:5751 static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD));
nikunjb09d94502016-11-14 22:06:2552 tester.ExpectBucketCount(
53 histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 1, 1);
54 tester.ExpectTotalCount(histogram, 2);
55}
56
Ilya Sherman16d5d5f42017-12-08 00:32:4457TEST(HistogramFunctionsTest, Boolean) {
nikunjb09d94502016-11-14 22:06:2558 std::string histogram("Testing.UMA.HistogramBoolean");
59 HistogramTester tester;
60 UmaHistogramBoolean(histogram, true);
61 tester.ExpectUniqueSample(histogram, 1, 1);
62 UmaHistogramBoolean(histogram, false);
63 tester.ExpectBucketCount(histogram, 0, 1);
64 tester.ExpectTotalCount(histogram, 2);
65}
66
Ilya Sherman16d5d5f42017-12-08 00:32:4467TEST(HistogramFunctionsTest, Percentage) {
nikunjb09d94502016-11-14 22:06:2568 std::string histogram("Testing.UMA.HistogramPercentage");
69 HistogramTester tester;
Yue Ru Sun702f74602020-10-16 00:05:1170 UmaHistogramPercentage(histogram, 1);
71 tester.ExpectBucketCount(histogram, 1, 1);
72 tester.ExpectTotalCount(histogram, 1);
73
nikunjb09d94502016-11-14 22:06:2574 UmaHistogramPercentage(histogram, 50);
Yue Ru Sun702f74602020-10-16 00:05:1175 tester.ExpectBucketCount(histogram, 50, 1);
nikunjb09d94502016-11-14 22:06:2576 tester.ExpectTotalCount(histogram, 2);
Yue Ru Sun702f74602020-10-16 00:05:1177
78 UmaHistogramPercentage(histogram, 100);
79 tester.ExpectBucketCount(histogram, 100, 1);
80 tester.ExpectTotalCount(histogram, 3);
81 // Test overflows.
82 UmaHistogramPercentage(histogram, 101);
83 tester.ExpectBucketCount(histogram, 101, 1);
84 tester.ExpectTotalCount(histogram, 4);
85
86 UmaHistogramPercentage(histogram, 500);
87 tester.ExpectBucketCount(histogram, 101, 2);
88 tester.ExpectTotalCount(histogram, 5);
nikunjb09d94502016-11-14 22:06:2589}
90
Ilya Sherman16d5d5f42017-12-08 00:32:4491TEST(HistogramFunctionsTest, Counts) {
nikunjb09d94502016-11-14 22:06:2592 std::string histogram("Testing.UMA.HistogramCount.Custom");
93 HistogramTester tester;
Caitlin Fischerfc138c82021-11-04 21:31:1994
95 // Add a sample that should go into the underflow bucket.
96 UmaHistogramCustomCounts(histogram, 0, 1, 100, 10);
97
98 // Add a sample that should go into the first bucket.
99 UmaHistogramCustomCounts(histogram, 1, 1, 100, 10);
100
101 // Add multiple samples that should go into the same bucket.
nikunjb09d94502016-11-14 22:06:25102 UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
103 UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
Caitlin Fischerfc138c82021-11-04 21:31:19104 UmaHistogramCustomCounts(histogram, 21, 1, 100, 10);
105
106 // Add a sample that should go into the last bucket.
107 UmaHistogramCustomCounts(histogram, 99, 1, 100, 10);
108
109 // Add some samples that should go into the overflow bucket.
110 UmaHistogramCustomCounts(histogram, 100, 1, 100, 10);
111 UmaHistogramCustomCounts(histogram, 101, 1, 100, 10);
112
113 // Verify the number of samples.
114 tester.ExpectTotalCount(histogram, 8);
115
116 // Verify the following:
117 // (a) The underflow bucket [0, 1) contains one sample.
118 // (b) The first and last buckets each contain one sample.
119 // (c) The bucket for values in [16, 29) contains three samples.
120 // (d) The overflow bucket contains two samples.
121 EXPECT_THAT(tester.GetAllSamples(histogram),
122 testing::ElementsAre(Bucket(0, 1), Bucket(1, 1), Bucket(16, 3),
123 Bucket(54, 1), Bucket(100, 2)));
nikunjb09d94502016-11-14 22:06:25124}
125
Ilya Sherman16d5d5f42017-12-08 00:32:44126TEST(HistogramFunctionsTest, Times) {
nikunjb09d94502016-11-14 22:06:25127 std::string histogram("Testing.UMA.HistogramTimes");
128 HistogramTester tester;
Peter Kasting53fd6ee2021-10-05 20:40:48129 UmaHistogramTimes(histogram, Seconds(1));
130 tester.ExpectTimeBucketCount(histogram, Seconds(1), 1);
nikunjb09d94502016-11-14 22:06:25131 tester.ExpectTotalCount(histogram, 1);
Peter Kasting53fd6ee2021-10-05 20:40:48132 UmaHistogramTimes(histogram, Seconds(9));
133 tester.ExpectTimeBucketCount(histogram, Seconds(9), 1);
nikunjb09d94502016-11-14 22:06:25134 tester.ExpectTotalCount(histogram, 2);
Peter Kasting53fd6ee2021-10-05 20:40:48135 UmaHistogramTimes(histogram, Seconds(10)); // Overflows
136 tester.ExpectTimeBucketCount(histogram, Seconds(10), 1);
137 UmaHistogramTimes(histogram, Seconds(20)); // Overflows.
nikunjb09d94502016-11-14 22:06:25138 // Check the value by picking any overflow time.
Peter Kasting53fd6ee2021-10-05 20:40:48139 tester.ExpectTimeBucketCount(histogram, Seconds(11), 2);
nikunjb09d94502016-11-14 22:06:25140 tester.ExpectTotalCount(histogram, 4);
141}
142
Tanushree Bishtce31a6f92024-05-30 19:57:11143TEST(HistogramFunctionsTest, ScopedTimes) {
144 std::string histogram("Testing.UMA.HistogramScopedTimes");
145 HistogramTester tester;
146 { ScopedUmaHistogramTimer scoped_uma_histogram_timer(histogram); }
147 tester.ExpectTotalCount(histogram, 1);
148 { ScopedUmaHistogramTimer scoped_uma_histogram_timer(histogram); }
149 tester.ExpectTotalCount(histogram, 2);
150}
151
Ilya Sherman16d5d5f42017-12-08 00:32:44152TEST(HistogramFunctionsTest, Sparse_SupportsLargeRange) {
153 std::string histogram("Testing.UMA.HistogramSparse");
154 HistogramTester tester;
155 UmaHistogramSparse(histogram, 0);
156 UmaHistogramSparse(histogram, 123456789);
157 UmaHistogramSparse(histogram, 123456789);
158 EXPECT_THAT(tester.GetAllSamples(histogram),
159 testing::ElementsAre(Bucket(0, 1), Bucket(123456789, 2)));
160}
161
162TEST(HistogramFunctionsTest, Sparse_SupportsNegativeValues) {
163 std::string histogram("Testing.UMA.HistogramSparse");
164 HistogramTester tester;
165 UmaHistogramSparse(histogram, -1);
166 tester.ExpectUniqueSample(histogram, -1, 1);
167}
168
nikunjb09d94502016-11-14 22:06:25169} // namespace base.