1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
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
TEST(SingleSampleTest,Extract)30 TEST(SingleSampleTest, Extract) {
31 AtomicSingleSample sample;
32 ASSERT_TRUE(sample.Accumulate(9, 1));
33
34 SingleSample s = sample.Extract(/*disable=*/false);
35 EXPECT_EQ(9U, s.bucket);
36 EXPECT_EQ(1U, s.count);
37
38 s = sample.Extract(/*disable=*/false);
39 EXPECT_EQ(0U, s.bucket);
40 EXPECT_EQ(0U, s.count);
41 }
42
TEST(SingleSampleTest,Disable)43 TEST(SingleSampleTest, Disable) {
44 AtomicSingleSample sample;
45 EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
46 EXPECT_FALSE(sample.IsDisabled());
47
48 ASSERT_TRUE(sample.Accumulate(9, 1));
49 EXPECT_EQ(1U, sample.Extract(/*disable=*/true).count);
50 EXPECT_TRUE(sample.IsDisabled());
51
52 ASSERT_FALSE(sample.Accumulate(9, 1));
53 EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
54 EXPECT_FALSE(sample.IsDisabled());
55 }
56
TEST(SingleSampleTest,Accumulate)57 TEST(SingleSampleTest, Accumulate) {
58 AtomicSingleSample sample;
59
60 ASSERT_TRUE(sample.Accumulate(9, 1));
61 ASSERT_TRUE(sample.Accumulate(9, 2));
62 ASSERT_TRUE(sample.Accumulate(9, 4));
63 EXPECT_EQ(7U, sample.Extract(/*disable=*/false).count);
64
65 ASSERT_TRUE(sample.Accumulate(9, 4));
66 ASSERT_TRUE(sample.Accumulate(9, -2));
67 ASSERT_TRUE(sample.Accumulate(9, 1));
68 EXPECT_EQ(3U, sample.Extract(/*disable=*/false).count);
69 }
70
TEST(SingleSampleTest,Overflow)71 TEST(SingleSampleTest, Overflow) {
72 AtomicSingleSample sample;
73
74 ASSERT_TRUE(sample.Accumulate(9, 1));
75 ASSERT_FALSE(sample.Accumulate(9, -2));
76 EXPECT_EQ(1U, sample.Extract(/*disable=*/false).count);
77
78 ASSERT_TRUE(sample.Accumulate(9, std::numeric_limits<uint16_t>::max()));
79 ASSERT_FALSE(sample.Accumulate(9, 1));
80 EXPECT_EQ(std::numeric_limits<uint16_t>::max(),
81 sample.Extract(/*disable=*/false).count);
82 }
83
84 } // namespace base
85