/* * 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/global_metrics_logger_and_exporter.h" #include #include #include #include #include #include "absl/types/optional.h" #include "api/test/metrics/metric.h" #include "api/test/metrics/metrics_exporter.h" #include "api/test/metrics/metrics_logger.h" #include "system_wrappers/include/clock.h" #include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace test { namespace { using ::testing::Eq; using ::testing::IsEmpty; std::map DefaultMetadata() { return std::map{{"key", "value"}}; } struct TestMetricsExporterFactory { public: std::unique_ptr CreateExporter() { return std::make_unique(this, /*export_result=*/true); } std::unique_ptr CreateFailureExporter() { return std::make_unique(this, /*export_result=*/false); } std::vector exported_metrics; private: class TestMetricsExporter : public MetricsExporter { public: TestMetricsExporter(TestMetricsExporterFactory* factory, bool export_result) : factory_(factory), export_result_(export_result) {} ~TestMetricsExporter() override = default; bool Export(rtc::ArrayView metrics) override { factory_->exported_metrics = std::vector(metrics.begin(), metrics.end()); return export_result_; } TestMetricsExporterFactory* factory_; bool export_result_; }; }; TEST(ExportPerfMetricTest, CollectedMetricsAreExporter) { TestMetricsExporterFactory exporter_factory; DefaultMetricsLogger logger(Clock::GetRealTimeClock()); logger.LogSingleValueMetric( "metric_name", "test_case_name", /*value=*/10, Unit::kMilliseconds, ImprovementDirection::kBiggerIsBetter, std::map{{"key", "value"}}); std::vector> exporters; exporters.push_back(exporter_factory.CreateExporter()); ASSERT_TRUE(ExportPerfMetric(logger, std::move(exporters))); std::vector metrics = exporter_factory.exported_metrics; ASSERT_THAT(metrics.size(), Eq(1lu)); const Metric& metric = metrics[0]; EXPECT_THAT(metric.name, Eq("metric_name")); EXPECT_THAT(metric.test_case, Eq("test_case_name")); EXPECT_THAT(metric.unit, Eq(Unit::kMilliseconds)); EXPECT_THAT(metric.improvement_direction, Eq(ImprovementDirection::kBiggerIsBetter)); EXPECT_THAT(metric.metric_metadata, Eq(std::map{{"key", "value"}})); ASSERT_THAT(metric.time_series.samples.size(), Eq(1lu)); EXPECT_THAT(metric.time_series.samples[0].value, Eq(10.0)); EXPECT_THAT(metric.time_series.samples[0].sample_metadata, Eq(std::map{})); ASSERT_THAT(metric.stats.mean, absl::optional(10.0)); ASSERT_THAT(metric.stats.stddev, absl::nullopt); ASSERT_THAT(metric.stats.min, absl::optional(10.0)); ASSERT_THAT(metric.stats.max, absl::optional(10.0)); } TEST(ExportPerfMetricTest, OneFailedExporterDoesNotPreventExportToOthers) { TestMetricsExporterFactory exporter_factory1; TestMetricsExporterFactory exporter_factory2; TestMetricsExporterFactory exporter_factory3; DefaultMetricsLogger logger(Clock::GetRealTimeClock()); logger.LogSingleValueMetric("metric_name", "test_case_name", /*value=*/10, Unit::kMilliseconds, ImprovementDirection::kBiggerIsBetter, DefaultMetadata()); std::vector> exporters; exporters.push_back(exporter_factory1.CreateExporter()); exporters.push_back(exporter_factory2.CreateFailureExporter()); exporters.push_back(exporter_factory3.CreateExporter()); ASSERT_FALSE(ExportPerfMetric(logger, std::move(exporters))); std::vector metrics1 = exporter_factory1.exported_metrics; std::vector metrics2 = exporter_factory2.exported_metrics; std::vector metrics3 = exporter_factory3.exported_metrics; ASSERT_THAT(metrics1.size(), Eq(1lu)) << metrics1[0].name << "; " << metrics1[1].name; EXPECT_THAT(metrics1[0].name, Eq("metric_name")); ASSERT_THAT(metrics2.size(), Eq(1lu)); EXPECT_THAT(metrics2[0].name, Eq("metric_name")); ASSERT_THAT(metrics3.size(), Eq(1lu)); EXPECT_THAT(metrics3[0].name, Eq("metric_name")); } } // namespace } // namespace test } // namespace webrtc