blob: cb427c2f2922bcd9e75cebe159cad25d04e80ba2 [file] [log] [blame]
asapersson01d70a32016-05-20 06:29:46 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <map>
12#include <memory>
13#include <string>
14#include <utility>
15
16#include "rtc_base/checks.h"
Karl Wiberg79eb1d92017-11-08 12:26:07 +010017#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gtest.h"
asapersson01d70a32016-05-20 06:29:46 -070019
20namespace webrtc {
21
22namespace {
23const int kSample = 22;
24const char kName[] = "Name";
25
26int NumSamples(
27 const std::string& name,
28 const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
29 histograms) {
30 const auto it = histograms.find(name);
31 if (it == histograms.end())
32 return 0;
33
34 int num_samples = 0;
35 for (const auto& sample : it->second->samples)
36 num_samples += sample.second;
37
38 return num_samples;
39}
40
41int NumEvents(const std::string& name,
42 int sample,
43 const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
44 histograms) {
45 const auto it = histograms.find(name);
46 if (it == histograms.end())
47 return 0;
48
49 const auto it_sample = it->second->samples.find(sample);
50 if (it_sample == it->second->samples.end())
51 return 0;
52
53 return it_sample->second;
54}
55} // namespace
56
57class MetricsDefaultTest : public ::testing::Test {
58 public:
59 MetricsDefaultTest() {}
60
61 protected:
Mirko Bonadeic14d9bb2018-07-16 15:44:28 +020062 void SetUp() override { metrics::Reset(); }
asapersson01d70a32016-05-20 06:29:46 -070063};
64
65TEST_F(MetricsDefaultTest, Reset) {
66 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
67 EXPECT_EQ(1, metrics::NumSamples(kName));
68 metrics::Reset();
69 EXPECT_EQ(0, metrics::NumSamples(kName));
70}
71
72TEST_F(MetricsDefaultTest, NumSamples) {
73 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
74 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
75 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
76 EXPECT_EQ(3, metrics::NumSamples(kName));
77 EXPECT_EQ(0, metrics::NumSamples("NonExisting"));
78}
79
80TEST_F(MetricsDefaultTest, NumEvents) {
81 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
82 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
83 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
84 EXPECT_EQ(2, metrics::NumEvents(kName, 5));
85 EXPECT_EQ(1, metrics::NumEvents(kName, 10));
86 EXPECT_EQ(0, metrics::NumEvents(kName, 11));
87 EXPECT_EQ(0, metrics::NumEvents("NonExisting", 5));
88}
89
90TEST_F(MetricsDefaultTest, MinSample) {
91 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
92 RTC_HISTOGRAM_PERCENTAGE(kName, kSample + 1);
93 EXPECT_EQ(kSample, metrics::MinSample(kName));
94 EXPECT_EQ(-1, metrics::MinSample("NonExisting"));
95}
96
97TEST_F(MetricsDefaultTest, Overflow) {
98 const std::string kName = "Overflow";
99 // Samples should end up in overflow bucket.
100 RTC_HISTOGRAM_PERCENTAGE(kName, 101);
101 EXPECT_EQ(1, metrics::NumSamples(kName));
102 EXPECT_EQ(1, metrics::NumEvents(kName, 101));
103 RTC_HISTOGRAM_PERCENTAGE(kName, 102);
104 EXPECT_EQ(2, metrics::NumSamples(kName));
105 EXPECT_EQ(2, metrics::NumEvents(kName, 101));
106}
107
108TEST_F(MetricsDefaultTest, Underflow) {
109 const std::string kName = "Underflow";
110 // Samples should end up in underflow bucket.
111 RTC_HISTOGRAM_COUNTS_10000(kName, 0);
112 EXPECT_EQ(1, metrics::NumSamples(kName));
113 EXPECT_EQ(1, metrics::NumEvents(kName, 0));
114 RTC_HISTOGRAM_COUNTS_10000(kName, -1);
115 EXPECT_EQ(2, metrics::NumSamples(kName));
116 EXPECT_EQ(2, metrics::NumEvents(kName, 0));
117}
118
119TEST_F(MetricsDefaultTest, GetAndReset) {
120 std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
121 metrics::GetAndReset(&histograms);
122 EXPECT_EQ(0u, histograms.size());
123 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 4);
124 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
125 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
126 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 10);
127 EXPECT_EQ(3, metrics::NumSamples("Histogram1"));
128 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
129
130 metrics::GetAndReset(&histograms);
131 EXPECT_EQ(2u, histograms.size());
132 EXPECT_EQ(0, metrics::NumSamples("Histogram1"));
133 EXPECT_EQ(0, metrics::NumSamples("Histogram2"));
134
135 EXPECT_EQ(3, NumSamples("Histogram1", histograms));
136 EXPECT_EQ(1, NumSamples("Histogram2", histograms));
137 EXPECT_EQ(1, NumEvents("Histogram1", 4, histograms));
138 EXPECT_EQ(2, NumEvents("Histogram1", 5, histograms));
139 EXPECT_EQ(1, NumEvents("Histogram2", 10, histograms));
asapersson1731c9c2016-11-30 00:29:09 -0800140
141 // Add samples after reset.
142 metrics::GetAndReset(&histograms);
143 EXPECT_EQ(0u, histograms.size());
144 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 50);
145 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 8);
146 EXPECT_EQ(1, metrics::NumSamples("Histogram1"));
147 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
148 EXPECT_EQ(1, metrics::NumEvents("Histogram1", 50));
149 EXPECT_EQ(1, metrics::NumEvents("Histogram2", 8));
asapersson01d70a32016-05-20 06:29:46 -0700150}
151
152TEST_F(MetricsDefaultTest, TestMinMaxBucket) {
153 const std::string kName = "MinMaxCounts100";
154 RTC_HISTOGRAM_COUNTS_100(kName, 4);
155
156 std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
157 metrics::GetAndReset(&histograms);
158 EXPECT_EQ(1u, histograms.size());
159 EXPECT_EQ(kName, histograms.begin()->second->name);
160 EXPECT_EQ(1, histograms.begin()->second->min);
161 EXPECT_EQ(100, histograms.begin()->second->max);
162 EXPECT_EQ(50u, histograms.begin()->second->bucket_count);
163 EXPECT_EQ(1u, histograms.begin()->second->samples.size());
164}
165
166} // namespace webrtc