xref: /aosp_15_r20/external/perfetto/src/tracing/service/histogram_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "src/tracing/service/histogram.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include <random>
20*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
21*6dbdd20aSAndroid Build Coastguard Worker 
22*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
23*6dbdd20aSAndroid Build Coastguard Worker namespace {
24*6dbdd20aSAndroid Build Coastguard Worker 
TEST(HistogramTest,SingleBucket)25*6dbdd20aSAndroid Build Coastguard Worker TEST(HistogramTest, SingleBucket) {
26*6dbdd20aSAndroid Build Coastguard Worker   Histogram<8> h;
27*6dbdd20aSAndroid Build Coastguard Worker   h.Add(0);
28*6dbdd20aSAndroid Build Coastguard Worker   h.Add(1);
29*6dbdd20aSAndroid Build Coastguard Worker   h.Add(8);
30*6dbdd20aSAndroid Build Coastguard Worker   h.Add(10);
31*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(0), 3u);
32*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(0), 9);
33*6dbdd20aSAndroid Build Coastguard Worker 
34*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(1), 1u);
35*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(1), 10);
36*6dbdd20aSAndroid Build Coastguard Worker }
37*6dbdd20aSAndroid Build Coastguard Worker 
TEST(HistogramTest,ThreeBuckets)38*6dbdd20aSAndroid Build Coastguard Worker TEST(HistogramTest, ThreeBuckets) {
39*6dbdd20aSAndroid Build Coastguard Worker   Histogram<8, 16, 32> h;
40*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketThres(0), 8);
41*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketThres(1), 16);
42*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketThres(2), 32);
43*6dbdd20aSAndroid Build Coastguard Worker   for (size_t i = 0; i < h.num_buckets(); i++) {
44*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(h.GetBucketCount(i), 0u);
45*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(h.GetBucketSum(i), 0);
46*6dbdd20aSAndroid Build Coastguard Worker   }
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker   h.Add(4);
49*6dbdd20aSAndroid Build Coastguard Worker   h.Add(8);
50*6dbdd20aSAndroid Build Coastguard Worker   h.Add(15);
51*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(0), 2u);
52*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(0), 4 + 8);
53*6dbdd20aSAndroid Build Coastguard Worker 
54*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(1), 1u);
55*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(1), 15);
56*6dbdd20aSAndroid Build Coastguard Worker 
57*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(2), 0u);
58*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(2), 0);
59*6dbdd20aSAndroid Build Coastguard Worker 
60*6dbdd20aSAndroid Build Coastguard Worker   h.Add(17);
61*6dbdd20aSAndroid Build Coastguard Worker   h.Add(31);
62*6dbdd20aSAndroid Build Coastguard Worker   h.Add(32);
63*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(2), 3u);
64*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(2), 17 + 31 + 32);
65*6dbdd20aSAndroid Build Coastguard Worker 
66*6dbdd20aSAndroid Build Coastguard Worker   h.Add(1000);
67*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(3), 1u);
68*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(3), 1000);
69*6dbdd20aSAndroid Build Coastguard Worker }
70*6dbdd20aSAndroid Build Coastguard Worker 
TEST(HistogramTest,Merge)71*6dbdd20aSAndroid Build Coastguard Worker TEST(HistogramTest, Merge) {
72*6dbdd20aSAndroid Build Coastguard Worker   Histogram<8, 16, 32> h, h2;
73*6dbdd20aSAndroid Build Coastguard Worker   h.Add(4);
74*6dbdd20aSAndroid Build Coastguard Worker   h.Add(15);
75*6dbdd20aSAndroid Build Coastguard Worker   h.Add(90);
76*6dbdd20aSAndroid Build Coastguard Worker 
77*6dbdd20aSAndroid Build Coastguard Worker   h2.Add(5);
78*6dbdd20aSAndroid Build Coastguard Worker   h2.Add(30);
79*6dbdd20aSAndroid Build Coastguard Worker   h2.Add(91);
80*6dbdd20aSAndroid Build Coastguard Worker 
81*6dbdd20aSAndroid Build Coastguard Worker   h.Merge(h2);
82*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(0), 2u);
83*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(0), 4 + 5);
84*6dbdd20aSAndroid Build Coastguard Worker 
85*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(1), 1u);
86*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(1), 15);
87*6dbdd20aSAndroid Build Coastguard Worker 
88*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(2), 1u);
89*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(2), 30);
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketCount(3), 2u);
92*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(h.GetBucketSum(3), 90 + 91);
93*6dbdd20aSAndroid Build Coastguard Worker }
94*6dbdd20aSAndroid Build Coastguard Worker 
TEST(HistogramTest,CopyAndMoveOperators)95*6dbdd20aSAndroid Build Coastguard Worker TEST(HistogramTest, CopyAndMoveOperators) {
96*6dbdd20aSAndroid Build Coastguard Worker   using HistType = Histogram<8, 16, 32>;
97*6dbdd20aSAndroid Build Coastguard Worker   HistType h1;
98*6dbdd20aSAndroid Build Coastguard Worker   h1.Add(1);
99*6dbdd20aSAndroid Build Coastguard Worker   h1.Add(15);
100*6dbdd20aSAndroid Build Coastguard Worker   h1.Add(30);
101*6dbdd20aSAndroid Build Coastguard Worker   h1.Add(31);
102*6dbdd20aSAndroid Build Coastguard Worker   h1.Add(99);
103*6dbdd20aSAndroid Build Coastguard Worker 
104*6dbdd20aSAndroid Build Coastguard Worker   auto check_validity = [](const HistType& h) {
105*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketSum(0), 1);
106*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketCount(0), 1u);
107*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketSum(1), 15);
108*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketCount(1), 1u);
109*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketSum(2), 30 + 31);
110*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketCount(2), 2u);
111*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketSum(3), 99);
112*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(h.GetBucketCount(3), 1u);
113*6dbdd20aSAndroid Build Coastguard Worker   };
114*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h1);
115*6dbdd20aSAndroid Build Coastguard Worker 
116*6dbdd20aSAndroid Build Coastguard Worker   HistType h2(h1);
117*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h2);
118*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h1);
119*6dbdd20aSAndroid Build Coastguard Worker 
120*6dbdd20aSAndroid Build Coastguard Worker   HistType h3 = h2;
121*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h3);
122*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h2);
123*6dbdd20aSAndroid Build Coastguard Worker 
124*6dbdd20aSAndroid Build Coastguard Worker   HistType h4(std::move(h3));
125*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h4);
126*6dbdd20aSAndroid Build Coastguard Worker 
127*6dbdd20aSAndroid Build Coastguard Worker   HistType h5;
128*6dbdd20aSAndroid Build Coastguard Worker   h5 = std::move(h4);
129*6dbdd20aSAndroid Build Coastguard Worker   check_validity(h5);
130*6dbdd20aSAndroid Build Coastguard Worker }
131*6dbdd20aSAndroid Build Coastguard Worker 
TEST(HistogramTest,Rand)132*6dbdd20aSAndroid Build Coastguard Worker TEST(HistogramTest, Rand) {
133*6dbdd20aSAndroid Build Coastguard Worker   std::minstd_rand0 rnd_engine(0);
134*6dbdd20aSAndroid Build Coastguard Worker   Histogram<10, 100, 1000> h;
135*6dbdd20aSAndroid Build Coastguard Worker 
136*6dbdd20aSAndroid Build Coastguard Worker   int64_t expected_sum = 0;
137*6dbdd20aSAndroid Build Coastguard Worker   const uint64_t expected_count = 1000;
138*6dbdd20aSAndroid Build Coastguard Worker   for (uint64_t i = 0; i < expected_count; i++) {
139*6dbdd20aSAndroid Build Coastguard Worker     auto value = static_cast<int32_t>(rnd_engine());
140*6dbdd20aSAndroid Build Coastguard Worker     expected_sum += value;
141*6dbdd20aSAndroid Build Coastguard Worker     h.Add(value);
142*6dbdd20aSAndroid Build Coastguard Worker   }
143*6dbdd20aSAndroid Build Coastguard Worker 
144*6dbdd20aSAndroid Build Coastguard Worker   int64_t actual_sum = 0;
145*6dbdd20aSAndroid Build Coastguard Worker   uint64_t actual_count = 0;
146*6dbdd20aSAndroid Build Coastguard Worker   for (size_t i = 0; i < h.num_buckets(); i++) {
147*6dbdd20aSAndroid Build Coastguard Worker     actual_count += h.GetBucketCount(i);
148*6dbdd20aSAndroid Build Coastguard Worker     actual_sum += h.GetBucketSum(i);
149*6dbdd20aSAndroid Build Coastguard Worker   }
150*6dbdd20aSAndroid Build Coastguard Worker 
151*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_count, actual_count);
152*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(expected_sum, actual_sum);
153*6dbdd20aSAndroid Build Coastguard Worker }
154*6dbdd20aSAndroid Build Coastguard Worker 
155*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
156*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
157