/* * Copyright (c) 2022 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "api/test/metrics/print_result_proxy_metrics_exporter.h" #include #include #include #include "api/test/metrics/metric.h" #include "api/units/timestamp.h" #include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace test { namespace { using ::testing::TestWithParam; std::map DefaultMetadata() { return std::map{{"key", "value"}}; } Metric::TimeSeries::Sample Sample(double value) { return Metric::TimeSeries::Sample{.timestamp = Timestamp::Seconds(1), .value = value, .sample_metadata = DefaultMetadata()}; } TEST(PrintResultProxyMetricsExporterTest, ExportMetricsWithTimeSeriesFormatCorrect) { Metric metric1{ .name = "test_metric1", .unit = Unit::kMilliseconds, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case_name1", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = std::vector{Sample(10), Sample(20)}}, .stats = Metric::Stats{.mean = 15.0, .stddev = 5.0, .min = 10.0, .max = 20.0}}; Metric metric2{ .name = "test_metric2", .unit = Unit::kKilobitsPerSecond, .improvement_direction = ImprovementDirection::kSmallerIsBetter, .test_case = "test_case_name2", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = std::vector{Sample(20), Sample(40)}}, .stats = Metric::Stats{ .mean = 30.0, .stddev = 10.0, .min = 20.0, .max = 40.0}}; testing::internal::CaptureStdout(); PrintResultProxyMetricsExporter exporter; std::string expected = "RESULT test_metric1: test_case_name1= {15,5} " "msBestFitFormat_biggerIsBetter\n" "RESULT test_metric2: test_case_name2= {3750,1250} " "bytesPerSecond_smallerIsBetter\n"; EXPECT_TRUE(exporter.Export(std::vector{metric1, metric2})); EXPECT_EQ(expected, testing::internal::GetCapturedStdout()); } TEST(PrintResultProxyMetricsExporterTest, ExportMetricsTimeSeriesOfSingleValueBackwardCompatibleFormat) { // This should be printed as {mean, stddev} despite only being a single data // point. Metric metric1{ .name = "available_send_bandwidth", .unit = Unit::kKilobitsPerSecond, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case/alice", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = std::vector{Sample(1000)}}, .stats = Metric::Stats{ .mean = 1000.0, .stddev = 0.0, .min = 1000.0, .max = 1000.0}}; // This is a per-call metric that shouldn't have a stddev estimate. Metric metric2{ .name = "min_psnr_dB", .unit = Unit::kUnitless, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case/alice-video", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = std::vector{Sample(10)}}, .stats = Metric::Stats{.mean = 10.0, .stddev = 0.0, .min = 10.0, .max = 10.0}}; // This is a per-call metric that shouldn't have a stddev estimate. Metric metric3{ .name = "alice_connected", .unit = Unit::kUnitless, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = std::vector{Sample(1)}}, .stats = Metric::Stats{.mean = 1.0, .stddev = 0.0, .min = 1.0, .max = 1.0}}; testing::internal::CaptureStdout(); PrintResultProxyMetricsExporter exporter; std::string expected = "RESULT available_send_bandwidth: test_case/alice= {125000,0} " "bytesPerSecond_biggerIsBetter\n" "RESULT min_psnr_dB: test_case/alice-video= 10 " "unitless_biggerIsBetter\n" "RESULT alice_connected: test_case= 1 " "unitless_biggerIsBetter\n"; EXPECT_TRUE(exporter.Export(std::vector{metric1, metric2, metric3})); EXPECT_EQ(expected, testing::internal::GetCapturedStdout()); } TEST(PrintResultProxyMetricsExporterTest, ExportMetricsWithStatsOnlyFormatCorrect) { Metric metric1{.name = "test_metric1", .unit = Unit::kMilliseconds, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case_name1", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = {}}, .stats = Metric::Stats{ .mean = 15.0, .stddev = 5.0, .min = 10.0, .max = 20.0}}; Metric metric2{ .name = "test_metric2", .unit = Unit::kKilobitsPerSecond, .improvement_direction = ImprovementDirection::kSmallerIsBetter, .test_case = "test_case_name2", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = {}}, .stats = Metric::Stats{ .mean = 30.0, .stddev = 10.0, .min = 20.0, .max = 40.0}}; testing::internal::CaptureStdout(); PrintResultProxyMetricsExporter exporter; std::string expected = "RESULT test_metric1: test_case_name1= {15,5} " "msBestFitFormat_biggerIsBetter\n" "RESULT test_metric2: test_case_name2= {3750,1250} " "bytesPerSecond_smallerIsBetter\n"; EXPECT_TRUE(exporter.Export(std::vector{metric1, metric2})); EXPECT_EQ(expected, testing::internal::GetCapturedStdout()); } TEST(PrintResultProxyMetricsExporterTest, ExportEmptyMetricOnlyFormatCorrect) { Metric metric{.name = "test_metric", .unit = Unit::kMilliseconds, .improvement_direction = ImprovementDirection::kBiggerIsBetter, .test_case = "test_case_name", .metric_metadata = DefaultMetadata(), .time_series = Metric::TimeSeries{.samples = {}}, .stats = Metric::Stats{}}; testing::internal::CaptureStdout(); PrintResultProxyMetricsExporter exporter; std::string expected = "RESULT test_metric: test_case_name= 0 " "msBestFitFormat_biggerIsBetter\n"; EXPECT_TRUE(exporter.Export(std::vector{metric})); EXPECT_EQ(expected, testing::internal::GetCapturedStdout()); } } // namespace } // namespace test } // namespace webrtc