blob: b2d202325ffba607f1864281a1b74875168e5e1c [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
Karl Wiberg79eb1d92017-11-08 12:26:07 +010011#include "system_wrappers/include/metrics.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "test/gtest.h"
asapersson01d70a32016-05-20 06:29:46 -070013
14namespace webrtc {
15
16namespace {
17const int kSample = 22;
18const char kName[] = "Name";
19
20int NumSamples(
21 const std::string& name,
22 const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
23 histograms) {
24 const auto it = histograms.find(name);
25 if (it == histograms.end())
26 return 0;
27
28 int num_samples = 0;
29 for (const auto& sample : it->second->samples)
30 num_samples += sample.second;
31
32 return num_samples;
33}
34
35int NumEvents(const std::string& name,
36 int sample,
37 const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
38 histograms) {
39 const auto it = histograms.find(name);
40 if (it == histograms.end())
41 return 0;
42
43 const auto it_sample = it->second->samples.find(sample);
44 if (it_sample == it->second->samples.end())
45 return 0;
46
47 return it_sample->second;
48}
49} // namespace
50
51class MetricsDefaultTest : public ::testing::Test {
52 public:
53 MetricsDefaultTest() {}
54
55 protected:
Mirko Bonadeic14d9bb2018-07-16 15:44:28 +020056 void SetUp() override { metrics::Reset(); }
asapersson01d70a32016-05-20 06:29:46 -070057};
58
59TEST_F(MetricsDefaultTest, Reset) {
60 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
61 EXPECT_EQ(1, metrics::NumSamples(kName));
62 metrics::Reset();
63 EXPECT_EQ(0, metrics::NumSamples(kName));
64}
65
66TEST_F(MetricsDefaultTest, NumSamples) {
67 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
68 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
69 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
70 EXPECT_EQ(3, metrics::NumSamples(kName));
71 EXPECT_EQ(0, metrics::NumSamples("NonExisting"));
72}
73
74TEST_F(MetricsDefaultTest, NumEvents) {
75 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
76 RTC_HISTOGRAM_PERCENTAGE(kName, 5);
77 RTC_HISTOGRAM_PERCENTAGE(kName, 10);
78 EXPECT_EQ(2, metrics::NumEvents(kName, 5));
79 EXPECT_EQ(1, metrics::NumEvents(kName, 10));
80 EXPECT_EQ(0, metrics::NumEvents(kName, 11));
81 EXPECT_EQ(0, metrics::NumEvents("NonExisting", 5));
82}
83
84TEST_F(MetricsDefaultTest, MinSample) {
85 RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
86 RTC_HISTOGRAM_PERCENTAGE(kName, kSample + 1);
87 EXPECT_EQ(kSample, metrics::MinSample(kName));
88 EXPECT_EQ(-1, metrics::MinSample("NonExisting"));
89}
90
91TEST_F(MetricsDefaultTest, Overflow) {
92 const std::string kName = "Overflow";
93 // Samples should end up in overflow bucket.
94 RTC_HISTOGRAM_PERCENTAGE(kName, 101);
95 EXPECT_EQ(1, metrics::NumSamples(kName));
96 EXPECT_EQ(1, metrics::NumEvents(kName, 101));
97 RTC_HISTOGRAM_PERCENTAGE(kName, 102);
98 EXPECT_EQ(2, metrics::NumSamples(kName));
99 EXPECT_EQ(2, metrics::NumEvents(kName, 101));
100}
101
102TEST_F(MetricsDefaultTest, Underflow) {
103 const std::string kName = "Underflow";
104 // Samples should end up in underflow bucket.
105 RTC_HISTOGRAM_COUNTS_10000(kName, 0);
106 EXPECT_EQ(1, metrics::NumSamples(kName));
107 EXPECT_EQ(1, metrics::NumEvents(kName, 0));
108 RTC_HISTOGRAM_COUNTS_10000(kName, -1);
109 EXPECT_EQ(2, metrics::NumSamples(kName));
110 EXPECT_EQ(2, metrics::NumEvents(kName, 0));
111}
112
113TEST_F(MetricsDefaultTest, GetAndReset) {
114 std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
115 metrics::GetAndReset(&histograms);
116 EXPECT_EQ(0u, histograms.size());
117 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 4);
118 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
119 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
120 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 10);
121 EXPECT_EQ(3, metrics::NumSamples("Histogram1"));
122 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
123
124 metrics::GetAndReset(&histograms);
125 EXPECT_EQ(2u, histograms.size());
126 EXPECT_EQ(0, metrics::NumSamples("Histogram1"));
127 EXPECT_EQ(0, metrics::NumSamples("Histogram2"));
128
129 EXPECT_EQ(3, NumSamples("Histogram1", histograms));
130 EXPECT_EQ(1, NumSamples("Histogram2", histograms));
131 EXPECT_EQ(1, NumEvents("Histogram1", 4, histograms));
132 EXPECT_EQ(2, NumEvents("Histogram1", 5, histograms));
133 EXPECT_EQ(1, NumEvents("Histogram2", 10, histograms));
asapersson1731c9c2016-11-30 00:29:09 -0800134
135 // Add samples after reset.
136 metrics::GetAndReset(&histograms);
137 EXPECT_EQ(0u, histograms.size());
138 RTC_HISTOGRAM_PERCENTAGE("Histogram1", 50);
139 RTC_HISTOGRAM_PERCENTAGE("Histogram2", 8);
140 EXPECT_EQ(1, metrics::NumSamples("Histogram1"));
141 EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
142 EXPECT_EQ(1, metrics::NumEvents("Histogram1", 50));
143 EXPECT_EQ(1, metrics::NumEvents("Histogram2", 8));
asapersson01d70a32016-05-20 06:29:46 -0700144}
145
146TEST_F(MetricsDefaultTest, TestMinMaxBucket) {
147 const std::string kName = "MinMaxCounts100";
148 RTC_HISTOGRAM_COUNTS_100(kName, 4);
149
150 std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
151 metrics::GetAndReset(&histograms);
152 EXPECT_EQ(1u, histograms.size());
153 EXPECT_EQ(kName, histograms.begin()->second->name);
154 EXPECT_EQ(1, histograms.begin()->second->min);
155 EXPECT_EQ(100, histograms.begin()->second->max);
156 EXPECT_EQ(50u, histograms.begin()->second->bucket_count);
157 EXPECT_EQ(1u, histograms.begin()->second->samples.size());
158}
159
160} // namespace webrtc