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