/* * Copyright (c) 2023 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 "rtc_tools/rtc_event_log_visualizer/analyzer_bindings.h" #include #include #include "rtc_base/protobuf_utils.h" #include "rtc_base/system/file_wrapper.h" #include "test/gmock.h" #include "test/gtest.h" #include "test/testsupport/file_utils.h" #ifdef WEBRTC_ANDROID_PLATFORM_BUILD #include "external/webrtc/webrtc/rtc_tools/rtc_event_log_visualizer/proto/chart.pb.h" #else #include "rtc_tools/rtc_event_log_visualizer/proto/chart.pb.h" #endif class RtcEventLogAnalyzerBindingsTest : public ::testing::Test { void SetUp() override { // Read an RTC event log to a char buffer. std::string file_name = webrtc::test::ResourcePath( "rtc_event_log/rtc_event_log_500kbps", "binarypb"); webrtc::FileWrapper file = webrtc::FileWrapper::OpenReadOnly(file_name); ASSERT_TRUE(file.is_open()); absl::optional file_size = file.FileSize(); ASSERT_TRUE(file_size.has_value()); constexpr size_t kMaxFileSize = 1'000'000; ASSERT_GT(*file_size, 0u); ASSERT_LE(*file_size, kMaxFileSize); event_log_contents_.resize(*file_size); size_t read_size = file.Read(event_log_contents_.data(), event_log_contents_.size()); ASSERT_EQ(*file_size, read_size); } protected: std::vector event_log_contents_; }; TEST_F(RtcEventLogAnalyzerBindingsTest, OutgoingBitrateChart) { uint32_t kMaxOutputSize = 1'000'000; std::vector output(kMaxOutputSize); // Call analyzer. char selection[] = "outgoing_bitrate"; size_t selection_size = strlen(selection); uint32_t output_size = output.size(); analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(), selection, selection_size, output.data(), &output_size); ASSERT_GT(output_size, 0u); // Parse output as charts. webrtc::analytics::ChartCollection collection; bool success = collection.ParseFromArray(output.data(), static_cast(output_size)); ASSERT_TRUE(success); ASSERT_EQ(collection.charts().size(), 1); EXPECT_EQ(collection.charts(0).title(), "Outgoing RTP bitrate"); EXPECT_EQ(collection.charts(0).id(), "outgoing_bitrate"); } TEST_F(RtcEventLogAnalyzerBindingsTest, NetWorkDelayFeedbackChart) { uint32_t kMaxOutputSize = 1'000'000; std::vector output(kMaxOutputSize); // Call analyzer. char selection[] = "network_delay_feedback"; size_t selection_size = strlen(selection); uint32_t output_size = output.size(); analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(), selection, selection_size, output.data(), &output_size); ASSERT_GT(output_size, 0u); // Parse output as charts. webrtc::analytics::ChartCollection collection; bool success = collection.ParseFromArray(output.data(), static_cast(output_size)); ASSERT_TRUE(success); ASSERT_EQ(collection.charts().size(), 1); EXPECT_EQ(collection.charts(0).title(), "Outgoing network delay (based on per-packet feedback)"); EXPECT_EQ(collection.charts(0).id(), "network_delay_feedback"); } TEST_F(RtcEventLogAnalyzerBindingsTest, OutputbufferTooSmall) { uint32_t kMaxOutputSize = 100; std::vector output(kMaxOutputSize); // Call analyzer. char selection[] = "outgoing_bitrate"; size_t selection_size = strlen(selection); uint32_t output_size = output.size(); analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(), selection, selection_size, output.data(), &output_size); // No output since the buffer is too small. ASSERT_EQ(output_size, 0u); }