xref: /aosp_15_r20/external/webrtc/test/testsupport/perf_test_histogram_writer_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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