diff --git a/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc b/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc index eb676a92bd..1ba31a3e32 100644 --- a/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc +++ b/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc @@ -67,6 +67,8 @@ std::map PopulateIpToPeer( std::map out; for (const auto& entry : peer_endpoints) { for (const EmulatedEndpoint* const endpoint : entry.second) { + RTC_CHECK(out.find(endpoint->GetPeerLocalAddress()) == out.end()) + << "Two peers can't share the same endpoint"; out.emplace(endpoint->GetPeerLocalAddress(), entry.first); } } @@ -85,6 +87,7 @@ StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: void StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: Start() { + MutexLock lock(&mutex_); // Check that network stats are clean before test execution. for (const auto& entry : peer_endpoints_) { std::unique_ptr stats = @@ -94,10 +97,26 @@ void StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: } } +void StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: + AddPeer(absl::string_view peer_name, + std::vector endpoints) { + MutexLock lock(&mutex_); + // When new peer is added not in the constructor, don't check if it has empty + // stats, because their endpoint could be used for traffic before. + peer_endpoints_.emplace(peer_name, std::move(endpoints)); + for (const EmulatedEndpoint* const endpoint : endpoints) { + RTC_CHECK(ip_to_peer_.find(endpoint->GetPeerLocalAddress()) == + ip_to_peer_.end()) + << "Two peers can't share the same endpoint"; + ip_to_peer_.emplace(endpoint->GetPeerLocalAddress(), peer_name); + } +} + std::map StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: GetStats() { + MutexLock lock(&mutex_); std::map peer_to_stats; std::map> sender_to_receivers; for (const auto& entry : peer_endpoints_) { @@ -125,6 +144,12 @@ StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector:: return peer_to_stats; } +void StatsBasedNetworkQualityMetricsReporter::AddPeer( + absl::string_view peer_name, + std::vector endpoints) { + collector_.AddPeer(peer_name, std::move(endpoints)); +} + void StatsBasedNetworkQualityMetricsReporter::Start( absl::string_view test_case_name, const TrackIdStreamInfoMap* reporter_helper) { diff --git a/test/pc/e2e/stats_based_network_quality_metrics_reporter.h b/test/pc/e2e/stats_based_network_quality_metrics_reporter.h index 733a40af94..709ba7c0e9 100644 --- a/test/pc/e2e/stats_based_network_quality_metrics_reporter.h +++ b/test/pc/e2e/stats_based_network_quality_metrics_reporter.h @@ -32,6 +32,7 @@ namespace webrtc { namespace webrtc_pc_e2e { +// TODO(titovartem): make this class testable and add tests. class StatsBasedNetworkQualityMetricsReporter : public PeerConnectionE2EQualityTestFixture::QualityMetricsReporter { public: @@ -44,6 +45,9 @@ class StatsBasedNetworkQualityMetricsReporter clock_(network_emulation->time_controller()->GetClock()) {} ~StatsBasedNetworkQualityMetricsReporter() override = default; + void AddPeer(absl::string_view peer_name, + std::vector endpoints); + // Network stats must be empty when this method will be invoked. void Start(absl::string_view test_case_name, const TrackIdStreamInfoMap* reporter_helper) override; @@ -79,11 +83,16 @@ class StatsBasedNetworkQualityMetricsReporter void Start(); + void AddPeer(absl::string_view peer_name, + std::vector endpoints); + std::map GetStats(); private: - const std::map> peer_endpoints_; - const std::map ip_to_peer_; + Mutex mutex_; + std::map> peer_endpoints_ + RTC_GUARDED_BY(mutex_); + std::map ip_to_peer_ RTC_GUARDED_BY(mutex_); NetworkEmulationManager* const network_emulation_; };