blob: a27e9038a38b020b5521cd9ae4e44647f26dc260 [file] [log] [blame]
asapersson01d70a32016-05-20 13:29:461/*
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 15:47:4911#include <map>
12#include <memory>
13#include <string>
14#include <utility>
15
16#include "rtc_base/checks.h"
Ali Tofigh969c13562022-05-13 08:26:5817#include "rtc_base/string_utils.h"
Karl Wiberg79eb1d92017-11-08 11:26:0718#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3119#include "test/gtest.h"
asapersson01d70a32016-05-20 13:29:4620
Ying Wangef3998f2019-12-09 12:06:5321#if RTC_METRICS_ENABLED
asapersson01d70a32016-05-20 13:29:4622namespace webrtc {
23
24namespace {
25const int kSample = 22;
26const char kName[] = "Name";
27
Ali Tofigh969c13562022-05-13 08:26:5828int NumSamples(absl::string_view name,
29 const std::map<std::string,
30 std::unique_ptr<metrics::SampleInfo>,
31 rtc::AbslStringViewCmp>& histograms) {
asapersson01d70a32016-05-20 13:29:4632 const auto it = histograms.find(name);
33 if (it == histograms.end())
34 return 0;
35
36 int num_samples = 0;
37 for (const auto& sample : it->second->samples)
38 num_samples += sample.second;
39
40 return num_samples;
41}
42
Ali Tofigh969c13562022-05-13 08:26:5843int NumEvents(absl::string_view name,
asapersson01d70a32016-05-20 13:29:4644 int sample,
Ali Tofigh969c13562022-05-13 08:26:5845 const std::map<std::string,
46 std::unique_ptr<metrics::SampleInfo>,
47 rtc::AbslStringViewCmp>& histograms) {
asapersson01d70a32016-05-20 13:29:4648 const auto it = histograms.find(name);
49 if (it == histograms.end())
50 return 0;
51
52 const auto it_sample = it->second->samples.find(sample);
53 if (it_sample == it->second->samples.end())
54 return 0;
55
56 return it_sample->second;
57}
58} // namespace
59
60class MetricsDefaultTest : public ::testing::Test {
61 public:
62 MetricsDefaultTest() {}
63
64 protected:
Mirko Bonadeic14d9bb2018-07-16 13:44:2865 void SetUp() override { metrics::Reset(); }
asapersson01d70a32016-05-20 13:29:4666};
67
68TEST_F(MetricsDefaultTest, Reset) {
69 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
70 EXPECT_EQ(1, metrics::NumSamples(kName));
71 metrics::Reset();
72 EXPECT_EQ(0, metrics::NumSamples(kName));
73}
74
75TEST_F(MetricsDefaultTest, NumSamples) {
76 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
77 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
78 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
79 EXPECT_EQ(3, metrics::NumSamples(kName));
80 EXPECT_EQ(0, metrics::NumSamples("NonExisting"));
81}
82
83TEST_F(MetricsDefaultTest, NumEvents) {
84 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
85 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
86 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
87 EXPECT_EQ(2, metrics::NumEvents(kName, 5));
88 EXPECT_EQ(1, metrics::NumEvents(kName, 10));
89 EXPECT_EQ(0, metrics::NumEvents(kName, 11));
90 EXPECT_EQ(0, metrics::NumEvents("NonExisting", 5));
91}
92
93TEST_F(MetricsDefaultTest, MinSample) {
94 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
95 RTC_HISTOGRAM_PERCENTAGE(kName, kSample + 1);
96 EXPECT_EQ(kSample, metrics::MinSample(kName));
97 EXPECT_EQ(-1, metrics::MinSample("NonExisting"));
98}
99
100TEST_F(MetricsDefaultTest, Overflow) {
101 const std::string kName = "Overflow";
102 // Samples should end up in overflow bucket.
103 RTC_HISTOGRAM_PERCENTAGE(kName, 101);
104 EXPECT_EQ(1, metrics::NumSamples(kName));
105 EXPECT_EQ(1, metrics::NumEvents(kName, 101));
106 RTC_HISTOGRAM_PERCENTAGE(kName, 102);
107 EXPECT_EQ(2, metrics::NumSamples(kName));
108 EXPECT_EQ(2, metrics::NumEvents(kName, 101));
109}
110
111TEST_F(MetricsDefaultTest, Underflow) {
112 const std::string kName = "Underflow";
113 // Samples should end up in underflow bucket.
114 RTC_HISTOGRAM_COUNTS_10000(kName, 0);
115 EXPECT_EQ(1, metrics::NumSamples(kName));
116 EXPECT_EQ(1, metrics::NumEvents(kName, 0));
117 RTC_HISTOGRAM_COUNTS_10000(kName, -1);
118 EXPECT_EQ(2, metrics::NumSamples(kName));
119 EXPECT_EQ(2, metrics::NumEvents(kName, 0));
120}
121
122TEST_F(MetricsDefaultTest, GetAndReset) {
Ali Tofigh969c13562022-05-13 08:26:58123 std::map<std::string, std::unique_ptr<metrics::SampleInfo>,
124 rtc::AbslStringViewCmp>
125 histograms;
asapersson01d70a32016-05-20 13:29:46126 metrics::GetAndReset(&histograms);
127 EXPECT_EQ(0u, histograms.size());
128 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 4);
129 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
130 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
131 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 10);
132 EXPECT_EQ(3, metrics::NumSamples("Histogram1"));
133 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
134
135 metrics::GetAndReset(&histograms);
136 EXPECT_EQ(2u, histograms.size());
137 EXPECT_EQ(0, metrics::NumSamples("Histogram1"));
138 EXPECT_EQ(0, metrics::NumSamples("Histogram2"));
139
140 EXPECT_EQ(3, NumSamples("Histogram1", histograms));
141 EXPECT_EQ(1, NumSamples("Histogram2", histograms));
142 EXPECT_EQ(1, NumEvents("Histogram1", 4, histograms));
143 EXPECT_EQ(2, NumEvents("Histogram1", 5, histograms));
144 EXPECT_EQ(1, NumEvents("Histogram2", 10, histograms));
asapersson1731c9c2016-11-30 08:29:09145
146 // Add samples after reset.
147 metrics::GetAndReset(&histograms);
148 EXPECT_EQ(0u, histograms.size());
149 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 50);
150 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 8);
151 EXPECT_EQ(1, metrics::NumSamples("Histogram1"));
152 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
153 EXPECT_EQ(1, metrics::NumEvents("Histogram1", 50));
154 EXPECT_EQ(1, metrics::NumEvents("Histogram2", 8));
asapersson01d70a32016-05-20 13:29:46155}
156
157TEST_F(MetricsDefaultTest, TestMinMaxBucket) {
158 const std::string kName = "MinMaxCounts100";
159 RTC_HISTOGRAM_COUNTS_100(kName, 4);
160
Ali Tofigh969c13562022-05-13 08:26:58161 std::map<std::string, std::unique_ptr<metrics::SampleInfo>,
162 rtc::AbslStringViewCmp>
163 histograms;
asapersson01d70a32016-05-20 13:29:46164 metrics::GetAndReset(&histograms);
165 EXPECT_EQ(1u, histograms.size());
166 EXPECT_EQ(kName, histograms.begin()->second->name);
167 EXPECT_EQ(1, histograms.begin()->second->min);
168 EXPECT_EQ(100, histograms.begin()->second->max);
169 EXPECT_EQ(50u, histograms.begin()->second->bucket_count);
170 EXPECT_EQ(1u, histograms.begin()->second->samples.size());
171}
172
173} // namespace webrtc
Ying Wangef3998f2019-12-09 12:06:53174#endif