1 /*
2 * Copyright (c) 2020 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
11 #include "test/testsupport/perf_test_histogram_writer.h"
12
13 #include <memory>
14 #include <string>
15
16 #include "test/gtest.h"
17 #include "third_party/catapult/tracing/tracing/value/histogram.h"
18
19 namespace webrtc {
20 namespace test {
21
22 namespace proto = catapult::tracing::tracing::proto;
23
TEST(PerfHistogramWriterUnittest,TestSimpleHistogram)24 TEST(PerfHistogramWriterUnittest, TestSimpleHistogram) {
25 std::unique_ptr<PerfTestResultWriter> writer =
26 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
27
28 writer->LogResult("-", "-", 0, "ms", false, ImproveDirection::kNone);
29
30 proto::HistogramSet histogram_set;
31 EXPECT_TRUE(histogram_set.ParseFromString(writer->Serialize()))
32 << "Expected valid histogram set";
33
34 ASSERT_EQ(histogram_set.histograms_size(), 1);
35 }
36
TEST(PerfHistogramWriterUnittest,TestListOfValuesHistogram)37 TEST(PerfHistogramWriterUnittest, TestListOfValuesHistogram) {
38 std::unique_ptr<PerfTestResultWriter> writer =
39 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
40
41 std::vector<double> samples{0, 1, 2};
42 writer->LogResultList("-", "-", samples, "ms", false,
43 ImproveDirection::kNone);
44
45 proto::HistogramSet histogram_set;
46 EXPECT_TRUE(histogram_set.ParseFromString(writer->Serialize()))
47 << "Expected valid histogram set";
48
49 ASSERT_EQ(histogram_set.histograms_size(), 1);
50 ASSERT_EQ(histogram_set.histograms(0).sample_values_size(), 3);
51 EXPECT_EQ(histogram_set.histograms(0).sample_values(0), 0);
52 EXPECT_EQ(histogram_set.histograms(0).sample_values(1), 1);
53 EXPECT_EQ(histogram_set.histograms(0).sample_values(2), 2);
54 }
55
TEST(PerfHistogramWriterUnittest,WritesSamplesAndUserStory)56 TEST(PerfHistogramWriterUnittest, WritesSamplesAndUserStory) {
57 std::unique_ptr<PerfTestResultWriter> writer =
58 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
59
60 writer->LogResult("measurement", "user_story", 15e7, "Hz", false,
61 ImproveDirection::kBiggerIsBetter);
62
63 proto::HistogramSet histogram_set;
64 histogram_set.ParseFromString(writer->Serialize());
65 const proto::Histogram& hist1 = histogram_set.histograms(0);
66
67 EXPECT_EQ(hist1.name(), "measurement");
68
69 EXPECT_EQ(hist1.unit().unit(), proto::HERTZ);
70 EXPECT_EQ(hist1.unit().improvement_direction(), proto::BIGGER_IS_BETTER);
71
72 EXPECT_EQ(hist1.sample_values_size(), 1);
73 EXPECT_EQ(hist1.sample_values(0), 15e7);
74
75 EXPECT_EQ(hist1.diagnostics().diagnostic_map().count("stories"), 1u);
76 const proto::Diagnostic& stories =
77 hist1.diagnostics().diagnostic_map().at("stories");
78 ASSERT_EQ(stories.generic_set().values_size(), 1);
79 EXPECT_EQ(stories.generic_set().values(0), "\"user_story\"");
80 }
81
TEST(PerfHistogramWriterUnittest,WritesOneHistogramPerMeasurementAndStory)82 TEST(PerfHistogramWriterUnittest, WritesOneHistogramPerMeasurementAndStory) {
83 std::unique_ptr<PerfTestResultWriter> writer =
84 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
85
86 writer->LogResult("measurement", "story1", 1, "ms", false,
87 ImproveDirection::kNone);
88 writer->LogResult("measurement", "story1", 2, "ms", false,
89 ImproveDirection::kNone);
90 writer->LogResult("measurement", "story2", 2, "ms", false,
91 ImproveDirection::kNone);
92
93 proto::HistogramSet histogram_set;
94 histogram_set.ParseFromString(writer->Serialize());
95 ASSERT_EQ(histogram_set.histograms_size(), 2);
96
97 const proto::Histogram& hist1 = histogram_set.histograms(0);
98 const proto::Histogram& hist2 = histogram_set.histograms(1);
99
100 EXPECT_EQ(hist1.name(), "measurement");
101 EXPECT_EQ(hist2.name(), "measurement");
102
103 const proto::Diagnostic& stories1 =
104 hist1.diagnostics().diagnostic_map().at("stories");
105 EXPECT_EQ(stories1.generic_set().values(0), "\"story1\"");
106 EXPECT_EQ(hist1.sample_values_size(), 2);
107
108 const proto::Diagnostic& stories2 =
109 hist2.diagnostics().diagnostic_map().at("stories");
110 EXPECT_EQ(stories2.generic_set().values(0), "\"story2\"");
111 EXPECT_EQ(hist2.sample_values_size(), 1);
112 }
113
TEST(PerfHistogramWriterUnittest,IgnoresError)114 TEST(PerfHistogramWriterUnittest, IgnoresError) {
115 std::unique_ptr<PerfTestResultWriter> writer =
116 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
117
118 writer->LogResultMeanAndError("-", "-", 17, 12345, "ms", false,
119 ImproveDirection::kNone);
120
121 proto::HistogramSet histogram_set;
122 histogram_set.ParseFromString(writer->Serialize());
123 const proto::Histogram& hist1 = histogram_set.histograms(0);
124
125 EXPECT_EQ(hist1.running().mean(), 17);
126 EXPECT_EQ(hist1.running().variance(), 0) << "The error should be ignored.";
127 }
128
TEST(PerfHistogramWriterUnittest,WritesDecibelIntoMeasurementName)129 TEST(PerfHistogramWriterUnittest, WritesDecibelIntoMeasurementName) {
130 std::unique_ptr<PerfTestResultWriter> writer =
131 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
132
133 writer->LogResult("measurement", "-", 0, "dB", false,
134 ImproveDirection::kNone);
135
136 proto::HistogramSet histogram_set;
137 histogram_set.ParseFromString(writer->Serialize());
138 const proto::Histogram& hist1 = histogram_set.histograms(0);
139
140 EXPECT_EQ(hist1.unit().unit(), proto::UNITLESS)
141 << "dB should map to unitless";
142 EXPECT_EQ(hist1.name(), "measurement_dB") << "measurement should be renamed";
143 }
144
TEST(PerfHistogramWriterUnittest,WritesFpsIntoMeasurementName)145 TEST(PerfHistogramWriterUnittest, WritesFpsIntoMeasurementName) {
146 std::unique_ptr<PerfTestResultWriter> writer =
147 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
148
149 writer->LogResult("measurement", "-", 0, "fps", false,
150 ImproveDirection::kNone);
151
152 proto::HistogramSet histogram_set;
153 histogram_set.ParseFromString(writer->Serialize());
154 const proto::Histogram& hist1 = histogram_set.histograms(0);
155
156 EXPECT_EQ(hist1.unit().unit(), proto::HERTZ) << "fps should map to hertz";
157 EXPECT_EQ(hist1.name(), "measurement_fps") << "measurement should be renamed";
158 }
159
TEST(PerfHistogramWriterUnittest,WritesPercentIntoMeasurementName)160 TEST(PerfHistogramWriterUnittest, WritesPercentIntoMeasurementName) {
161 std::unique_ptr<PerfTestResultWriter> writer =
162 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
163
164 writer->LogResult("measurement", "-", 0, "%", false, ImproveDirection::kNone);
165
166 proto::HistogramSet histogram_set;
167 histogram_set.ParseFromString(writer->Serialize());
168 const proto::Histogram& hist1 = histogram_set.histograms(0);
169
170 EXPECT_EQ(hist1.unit().unit(), proto::UNITLESS)
171 << "percent should map to hertz";
172 EXPECT_EQ(hist1.name(), "measurement_%") << "measurement should be renamed";
173 }
174
TEST(PerfHistogramWriterUnittest,BitsPerSecondIsConvertedToBytes)175 TEST(PerfHistogramWriterUnittest, BitsPerSecondIsConvertedToBytes) {
176 std::unique_ptr<PerfTestResultWriter> writer =
177 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
178
179 writer->LogResult("-", "-", 1024, "bps", false, ImproveDirection::kNone);
180
181 proto::HistogramSet histogram_set;
182 histogram_set.ParseFromString(writer->Serialize());
183 const proto::Histogram& hist1 = histogram_set.histograms(0);
184
185 EXPECT_EQ(hist1.sample_values(0), 128) << "1024 bits = 128 bytes";
186 }
187
TEST(PerfHistogramWriterUnittest,ParsesDirection)188 TEST(PerfHistogramWriterUnittest, ParsesDirection) {
189 std::unique_ptr<PerfTestResultWriter> writer =
190 std::unique_ptr<PerfTestResultWriter>(CreateHistogramWriter());
191
192 writer->LogResult("measurement1", "-", 0, "bps", false,
193 ImproveDirection::kBiggerIsBetter);
194 writer->LogResult("measurement2", "-", 0, "frames", false,
195 ImproveDirection::kSmallerIsBetter);
196 writer->LogResult("measurement3", "-", 0, "sigma", false,
197 ImproveDirection::kNone);
198
199 proto::HistogramSet histogram_set;
200 histogram_set.ParseFromString(writer->Serialize());
201 const proto::Histogram& hist1 = histogram_set.histograms(0);
202 const proto::Histogram& hist2 = histogram_set.histograms(1);
203 const proto::Histogram& hist3 = histogram_set.histograms(2);
204
205 EXPECT_EQ(hist1.unit().unit(), proto::BYTES_PER_SECOND);
206 EXPECT_EQ(hist1.unit().improvement_direction(), proto::BIGGER_IS_BETTER);
207
208 EXPECT_EQ(hist2.unit().unit(), proto::COUNT);
209 EXPECT_EQ(hist2.unit().improvement_direction(), proto::SMALLER_IS_BETTER);
210
211 EXPECT_EQ(hist3.unit().unit(), proto::SIGMA);
212 EXPECT_EQ(hist3.unit().improvement_direction(), proto::NOT_SPECIFIED);
213 }
214
215 } // namespace test
216 } // namespace webrtc
217