blob: ad4bfc5a4c28a7a528d99acbdce8679dcea7077a [file] [log] [blame]
Kevin Marshalld35a337092020-03-17 22:20:231// Copyright 2020 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 "fuchsia/base/legacymetrics_histogram_flattener.h"
6
7#include "base/metrics/histogram_macros.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10using fuchsia::legacymetrics::Histogram;
11using fuchsia::legacymetrics::HistogramBucket;
12
13namespace cr_fuchsia {
14namespace {
15
16constexpr char kHistogramCount1M[] = "Foo.Bar";
17
18int64_t GetCount(int64_t value, const std::vector<HistogramBucket>& buckets) {
19 for (const HistogramBucket& bucket : buckets) {
20 if (value >= bucket.min && value < bucket.max)
21 return bucket.count;
22 }
23
24 return 0;
25}
26
27const fuchsia::legacymetrics::Histogram* LookupHistogram(
28 base::StringPiece name,
29 const std::vector<Histogram>& histograms) {
30 for (const auto& histogram : histograms) {
31 if (histogram.name() == name)
32 return &histogram;
33 }
34 return nullptr;
35}
36
37class LegacyMetricsHistogramFlattenerTest : public testing::Test {
38 public:
39 LegacyMetricsHistogramFlattenerTest() = default;
40 ~LegacyMetricsHistogramFlattenerTest() override = default;
Kevin Marshall05e29bd2020-03-19 21:55:4441
42 void SetUp() override {
43 // Flush all histogram deltas from prior tests executed in this process.
44 GetLegacyMetricsDeltas();
45 }
Kevin Marshalld35a337092020-03-17 22:20:2346};
47
48TEST_F(LegacyMetricsHistogramFlattenerTest, NoHistogramData) {
49 EXPECT_TRUE(GetLegacyMetricsDeltas().empty());
50}
51
52TEST_F(LegacyMetricsHistogramFlattenerTest, Boolean) {
53 constexpr char kBooleanHistogram[] = "Foo.Bar.Boolean";
54 UMA_HISTOGRAM_BOOLEAN(kBooleanHistogram, true);
55 UMA_HISTOGRAM_BOOLEAN(kBooleanHistogram, true);
56 UMA_HISTOGRAM_BOOLEAN(kBooleanHistogram, false);
57
58 auto deltas = GetLegacyMetricsDeltas();
59 EXPECT_EQ(1,
60 GetCount(0, LookupHistogram(kBooleanHistogram, deltas)->buckets()));
61 EXPECT_EQ(2,
62 GetCount(1, LookupHistogram(kBooleanHistogram, deltas)->buckets()));
63}
64
65TEST_F(LegacyMetricsHistogramFlattenerTest, Linear) {
66 constexpr char kLinearHistogram[] = "Foo.Bar.Linear";
67
68 for (int i = 0; i < 200; ++i) {
69 UMA_HISTOGRAM_EXACT_LINEAR(kLinearHistogram, i, 200);
70 }
71
72 auto deltas = GetLegacyMetricsDeltas();
73
74 for (int i = 0; i < 200; ++i) {
75 EXPECT_EQ(
76 1, GetCount(i, LookupHistogram(kLinearHistogram, deltas)->buckets()));
77 }
78}
79
80TEST_F(LegacyMetricsHistogramFlattenerTest, Percentage) {
81 constexpr char kPercentageHistogram[] = "Foo.Bar.Percentage";
82
83 for (int i = 0; i <= 100; ++i) {
84 for (int j = 0; j < i; ++j)
85 UMA_HISTOGRAM_PERCENTAGE(kPercentageHistogram, i);
86 }
87
88 auto deltas = GetLegacyMetricsDeltas();
89
90 for (int i = 0; i <= 100; ++i) {
91 EXPECT_EQ(
92 i,
93 GetCount(i, LookupHistogram(kPercentageHistogram, deltas)->buckets()));
94 }
95}
96
97enum Fruit {
98 APPLE,
99 BANANA,
100 PEAR,
101 FRUIT_MAX = PEAR,
102};
103
104TEST_F(LegacyMetricsHistogramFlattenerTest, Enumeration) {
105 constexpr char kEnumHistogram[] = "Foo.Bar.Enumeration";
106
107 UMA_HISTOGRAM_ENUMERATION(kEnumHistogram, APPLE, FRUIT_MAX);
108 UMA_HISTOGRAM_ENUMERATION(kEnumHistogram, BANANA, FRUIT_MAX);
109 UMA_HISTOGRAM_ENUMERATION(kEnumHistogram, BANANA, FRUIT_MAX);
110 UMA_HISTOGRAM_ENUMERATION(kEnumHistogram, BANANA, FRUIT_MAX);
111 UMA_HISTOGRAM_ENUMERATION(kEnumHistogram, PEAR, FRUIT_MAX);
112
113 auto deltas = GetLegacyMetricsDeltas();
114
115 EXPECT_EQ(
116 1, GetCount(APPLE, LookupHistogram(kEnumHistogram, deltas)->buckets()));
117 EXPECT_EQ(
118 3, GetCount(BANANA, LookupHistogram(kEnumHistogram, deltas)->buckets()));
119 EXPECT_EQ(1,
120 GetCount(PEAR, LookupHistogram(kEnumHistogram, deltas)->buckets()));
121}
122
123TEST_F(LegacyMetricsHistogramFlattenerTest, NoNewData) {
124 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 20);
125
126 auto deltas = GetLegacyMetricsDeltas();
127 EXPECT_EQ(
128 1, GetCount(20, LookupHistogram(kHistogramCount1M, deltas)->buckets()));
129
130 // No changes to a histogram means we should not be seeing it in the deltas.
131 deltas = GetLegacyMetricsDeltas();
132 EXPECT_TRUE(deltas.empty());
133}
134
135TEST_F(LegacyMetricsHistogramFlattenerTest, MultipleHistograms) {
136 constexpr char kAnotherHistogram[] = "Foo.Bar2";
137
138 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 20);
139 UMA_HISTOGRAM_COUNTS_1M(kAnotherHistogram, 1000);
140 UMA_HISTOGRAM_COUNTS_1M(kAnotherHistogram, 1000);
141
142 auto deltas = GetLegacyMetricsDeltas();
143 EXPECT_EQ(
144 1, GetCount(20, LookupHistogram(kHistogramCount1M, deltas)->buckets()));
145 EXPECT_EQ(
146 2, GetCount(1000, LookupHistogram(kAnotherHistogram, deltas)->buckets()));
147}
148
149TEST_F(LegacyMetricsHistogramFlattenerTest, MultipleBuckets) {
150 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 20);
151 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 1000);
152
153 auto deltas = GetLegacyMetricsDeltas();
154 EXPECT_EQ(
155 1, GetCount(20, LookupHistogram(kHistogramCount1M, deltas)->buckets()));
156 EXPECT_EQ(
157 1, GetCount(1000, LookupHistogram(kHistogramCount1M, deltas)->buckets()));
158
159 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 1000);
160 UMA_HISTOGRAM_COUNTS_1M(kHistogramCount1M, 1000);
161 deltas = GetLegacyMetricsDeltas();
162 EXPECT_EQ(
163 2, GetCount(1000, LookupHistogram(kHistogramCount1M, deltas)->buckets()));
164}
165
166} // namespace
167} // namespace cr_fuchsia