1 /*
2 * Copyright (c) 2022 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 #include "api/test/metrics/metrics_set_proto_file_exporter.h"
11
12 #include <fstream>
13 #include <map>
14 #include <string>
15 #include <vector>
16
17 #include "api/test/metrics/metric.h"
18 #include "api/test/metrics/proto/metric.pb.h"
19 #include "api/units/timestamp.h"
20 #include "rtc_base/protobuf_utils.h"
21 #include "test/gmock.h"
22 #include "test/gtest.h"
23 #include "test/testsupport/file_utils.h"
24
25 namespace webrtc {
26 namespace test {
27 namespace {
28
29 using ::testing::Eq;
30 using ::testing::Test;
31
32 namespace proto = ::webrtc::test_metrics;
33
ReadFileAsString(const std::string & filename)34 std::string ReadFileAsString(const std::string& filename) {
35 std::ifstream infile(filename, std::ios_base::binary);
36 auto buffer = std::vector<char>(std::istreambuf_iterator<char>(infile),
37 std::istreambuf_iterator<char>());
38 return std::string(buffer.begin(), buffer.end());
39 }
40
DefaultMetadata()41 std::map<std::string, std::string> DefaultMetadata() {
42 return std::map<std::string, std::string>{{"key", "value"}};
43 }
44
Sample(double value)45 Metric::TimeSeries::Sample Sample(double value) {
46 return Metric::TimeSeries::Sample{.timestamp = Timestamp::Seconds(1),
47 .value = value,
48 .sample_metadata = DefaultMetadata()};
49 }
50
AssertSamplesEqual(const proto::Metric::TimeSeries::Sample & actual_sample,const Metric::TimeSeries::Sample & expected_sample)51 void AssertSamplesEqual(const proto::Metric::TimeSeries::Sample& actual_sample,
52 const Metric::TimeSeries::Sample& expected_sample) {
53 EXPECT_THAT(actual_sample.value(), Eq(expected_sample.value));
54 EXPECT_THAT(actual_sample.timestamp_us(), Eq(expected_sample.timestamp.us()));
55 EXPECT_THAT(actual_sample.sample_metadata().size(),
56 Eq(expected_sample.sample_metadata.size()));
57 for (const auto& [key, value] : expected_sample.sample_metadata) {
58 EXPECT_THAT(actual_sample.sample_metadata().at(key), Eq(value));
59 }
60 }
61
62 class MetricsSetProtoFileExporterTest : public Test {
63 protected:
64 ~MetricsSetProtoFileExporterTest() override = default;
65
SetUp()66 void SetUp() override {
67 temp_filename_ = webrtc::test::TempFilename(
68 webrtc::test::OutputPath(), "metrics_set_proto_file_exporter_test");
69 }
70
TearDown()71 void TearDown() override {
72 ASSERT_TRUE(webrtc::test::RemoveFile(temp_filename_));
73 }
74
75 std::string temp_filename_;
76 };
77
TEST_F(MetricsSetProtoFileExporterTest,MetricsAreExportedCorrectly)78 TEST_F(MetricsSetProtoFileExporterTest, MetricsAreExportedCorrectly) {
79 MetricsSetProtoFileExporter::Options options(temp_filename_);
80 MetricsSetProtoFileExporter exporter(options);
81
82 Metric metric1{
83 .name = "test_metric1",
84 .unit = Unit::kMilliseconds,
85 .improvement_direction = ImprovementDirection::kBiggerIsBetter,
86 .test_case = "test_case_name1",
87 .metric_metadata = DefaultMetadata(),
88 .time_series =
89 Metric::TimeSeries{.samples = std::vector{Sample(10), Sample(20)}},
90 .stats =
91 Metric::Stats{.mean = 15.0, .stddev = 5.0, .min = 10.0, .max = 20.0}};
92 Metric metric2{
93 .name = "test_metric2",
94 .unit = Unit::kKilobitsPerSecond,
95 .improvement_direction = ImprovementDirection::kSmallerIsBetter,
96 .test_case = "test_case_name2",
97 .metric_metadata = DefaultMetadata(),
98 .time_series =
99 Metric::TimeSeries{.samples = std::vector{Sample(20), Sample(40)}},
100 .stats = Metric::Stats{
101 .mean = 30.0, .stddev = 10.0, .min = 20.0, .max = 40.0}};
102
103 ASSERT_TRUE(exporter.Export(std::vector<Metric>{metric1, metric2}));
104 webrtc::test_metrics::MetricsSet actual_metrics_set;
105 actual_metrics_set.ParseFromString(ReadFileAsString(temp_filename_));
106 EXPECT_THAT(actual_metrics_set.metrics().size(), Eq(2));
107
108 EXPECT_THAT(actual_metrics_set.metrics(0).name(), Eq("test_metric1"));
109 EXPECT_THAT(actual_metrics_set.metrics(0).test_case(), Eq("test_case_name1"));
110 EXPECT_THAT(actual_metrics_set.metrics(0).unit(),
111 Eq(proto::Unit::MILLISECONDS));
112 EXPECT_THAT(actual_metrics_set.metrics(0).improvement_direction(),
113 Eq(proto::ImprovementDirection::BIGGER_IS_BETTER));
114 EXPECT_THAT(actual_metrics_set.metrics(0).metric_metadata().size(), Eq(1lu));
115 EXPECT_THAT(actual_metrics_set.metrics(0).metric_metadata().at("key"),
116 Eq("value"));
117 EXPECT_THAT(actual_metrics_set.metrics(0).time_series().samples().size(),
118 Eq(2));
119 AssertSamplesEqual(actual_metrics_set.metrics(0).time_series().samples(0),
120 Sample(10.0));
121 AssertSamplesEqual(actual_metrics_set.metrics(0).time_series().samples(1),
122 Sample(20.0));
123 EXPECT_THAT(actual_metrics_set.metrics(0).stats().mean(), Eq(15.0));
124 EXPECT_THAT(actual_metrics_set.metrics(0).stats().stddev(), Eq(5.0));
125 EXPECT_THAT(actual_metrics_set.metrics(0).stats().min(), Eq(10.0));
126 EXPECT_THAT(actual_metrics_set.metrics(0).stats().max(), Eq(20.0));
127
128 EXPECT_THAT(actual_metrics_set.metrics(1).name(), Eq("test_metric2"));
129 EXPECT_THAT(actual_metrics_set.metrics(1).test_case(), Eq("test_case_name2"));
130 EXPECT_THAT(actual_metrics_set.metrics(1).unit(),
131 Eq(proto::Unit::KILOBITS_PER_SECOND));
132 EXPECT_THAT(actual_metrics_set.metrics(1).improvement_direction(),
133 Eq(proto::ImprovementDirection::SMALLER_IS_BETTER));
134 EXPECT_THAT(actual_metrics_set.metrics(1).metric_metadata().size(), Eq(1lu));
135 EXPECT_THAT(actual_metrics_set.metrics(1).metric_metadata().at("key"),
136 Eq("value"));
137 EXPECT_THAT(actual_metrics_set.metrics(1).time_series().samples().size(),
138 Eq(2));
139 AssertSamplesEqual(actual_metrics_set.metrics(1).time_series().samples(0),
140 Sample(20.0));
141 AssertSamplesEqual(actual_metrics_set.metrics(1).time_series().samples(1),
142 Sample(40.0));
143 EXPECT_THAT(actual_metrics_set.metrics(1).stats().mean(), Eq(30.0));
144 EXPECT_THAT(actual_metrics_set.metrics(1).stats().stddev(), Eq(10.0));
145 EXPECT_THAT(actual_metrics_set.metrics(1).stats().min(), Eq(20.0));
146 EXPECT_THAT(actual_metrics_set.metrics(1).stats().max(), Eq(40.0));
147 }
148
149 } // namespace
150 } // namespace test
151 } // namespace webrtc
152