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