xref: /aosp_15_r20/external/cronet/base/metrics/histogram_samples_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2017 The Chromium Authors
2 // 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_samples.h"
6 
7 #include <limits>
8 
9 #include "base/test/gtest_util.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace base {
13 
14 using SingleSample = HistogramSamples::SingleSample;
15 using AtomicSingleSample = HistogramSamples::AtomicSingleSample;
16 
TEST(SingleSampleTest,Load)17 TEST(SingleSampleTest, Load) {
18   AtomicSingleSample sample;
19   ASSERT_TRUE(sample.Accumulate(9, 1));
20 
21   SingleSample s = sample.Load();
22   EXPECT_EQ(9U, s.bucket);
23   EXPECT_EQ(1U, s.count);
24 
25   s = sample.Load();
26   EXPECT_EQ(9U, s.bucket);
27   EXPECT_EQ(1U, s.count);
28 
29   ASSERT_TRUE(sample.Accumulate(9, 1));
30   s = sample.Load();
31   EXPECT_EQ(9U, s.bucket);
32   EXPECT_EQ(2U, s.count);
33 }
34 
TEST(SingleSampleTest,Extract)35 TEST(SingleSampleTest, Extract) {
36   AtomicSingleSample sample;
37   ASSERT_TRUE(sample.Accumulate(9, 1));
38 
39   SingleSample s = sample.Extract();
40   EXPECT_EQ(9U, s.bucket);
41   EXPECT_EQ(1U, s.count);
42 
43   s = sample.Extract();
44   EXPECT_EQ(0U, s.bucket);
45   EXPECT_EQ(0U, s.count);
46 
47   ASSERT_TRUE(sample.Accumulate(1, 2));
48   s = sample.Extract();
49   EXPECT_EQ(1U, s.bucket);
50   EXPECT_EQ(2U, s.count);
51 }
52 
TEST(SingleSampleTest,Disable)53 TEST(SingleSampleTest, Disable) {
54   AtomicSingleSample sample;
55   EXPECT_EQ(0U, sample.Extract().count);
56   EXPECT_FALSE(sample.IsDisabled());
57 
58   ASSERT_TRUE(sample.Accumulate(9, 1));
59   EXPECT_EQ(1U, sample.ExtractAndDisable().count);
60   EXPECT_TRUE(sample.IsDisabled());
61 
62   ASSERT_FALSE(sample.Accumulate(9, 1));
63   EXPECT_EQ(0U, sample.Extract().count);
64   // The sample should still be disabled.
65   EXPECT_TRUE(sample.IsDisabled());
66 }
67 
TEST(SingleSampleTest,Accumulate)68 TEST(SingleSampleTest, Accumulate) {
69   AtomicSingleSample sample;
70 
71   ASSERT_TRUE(sample.Accumulate(9, 1));
72   ASSERT_TRUE(sample.Accumulate(9, 2));
73   ASSERT_TRUE(sample.Accumulate(9, 4));
74   ASSERT_FALSE(sample.Accumulate(10, 1));
75   EXPECT_EQ(7U, sample.Extract().count);
76 
77   ASSERT_TRUE(sample.Accumulate(9, 4));
78   ASSERT_TRUE(sample.Accumulate(9, -2));
79   ASSERT_TRUE(sample.Accumulate(9, 1));
80   ASSERT_FALSE(sample.Accumulate(10, 1));
81   EXPECT_EQ(3U, sample.Extract().count);
82 }
83 
TEST(SingleSampleTest,Overflow)84 TEST(SingleSampleTest, Overflow) {
85   AtomicSingleSample sample;
86 
87   ASSERT_TRUE(sample.Accumulate(9, 1));
88   ASSERT_FALSE(sample.Accumulate(9, -2));
89   EXPECT_EQ(1U, sample.Extract().count);
90 
91   ASSERT_TRUE(sample.Accumulate(9, std::numeric_limits<uint16_t>::max()));
92   ASSERT_FALSE(sample.Accumulate(9, 1));
93   EXPECT_EQ(std::numeric_limits<uint16_t>::max(), sample.Extract().count);
94 }
95 
TEST(HistogramSamplesTest,WriteAsciiBucketGraph)96 TEST(HistogramSamplesTest, WriteAsciiBucketGraph) {
97   constexpr int kLineLength = 72;
98   constexpr size_t kOutputSize = kLineLength + 1;
99 
100   std::string output;
101 
102   HistogramSamples::WriteAsciiBucketGraph(0.0, kLineLength, &output);
103   ASSERT_EQ(output.size(), kOutputSize);
104   output.clear();
105 
106   HistogramSamples::WriteAsciiBucketGraph(-1.0, kLineLength, &output);
107   ASSERT_EQ(output.size(), kOutputSize);
108   output.clear();
109 
110   HistogramSamples::WriteAsciiBucketGraph(kLineLength - 1, kLineLength,
111                                           &output);
112   ASSERT_EQ(output.size(), kOutputSize);
113   output.clear();
114 
115   HistogramSamples::WriteAsciiBucketGraph(kLineLength, kLineLength, &output);
116   ASSERT_EQ(output.size(), kOutputSize);
117   output.clear();
118 
119   HistogramSamples::WriteAsciiBucketGraph(kLineLength + 1, kLineLength,
120                                           &output);
121   ASSERT_EQ(output.size(), kOutputSize + 1);
122 }
123 
124 }  // namespace base
125