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