[PCLF] Add ability to add peers on the fly into stats network reporter

Bug: b/198796179
Change-Id: I6dc92db7ebace008e56f376d895352da317c9e3e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231220
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34924}
This commit is contained in:
Artem Titov 2021-09-04 20:14:49 +02:00 committed by WebRTC LUCI CQ
parent cff2de42ba
commit 200cfd6c7d
2 changed files with 36 additions and 2 deletions

View File

@ -67,6 +67,8 @@ std::map<rtc::IPAddress, std::string> PopulateIpToPeer(
std::map<rtc::IPAddress, std::string> 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<EmulatedNetworkStats> stats =
@ -94,10 +97,26 @@ void StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector::
}
}
void StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector::
AddPeer(absl::string_view peer_name,
std::vector<EmulatedEndpoint*> 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<std::string,
StatsBasedNetworkQualityMetricsReporter::NetworkLayerStats>
StatsBasedNetworkQualityMetricsReporter::NetworkLayerStatsCollector::
GetStats() {
MutexLock lock(&mutex_);
std::map<std::string, NetworkLayerStats> peer_to_stats;
std::map<std::string, std::vector<std::string>> 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<EmulatedEndpoint*> endpoints) {
collector_.AddPeer(peer_name, std::move(endpoints));
}
void StatsBasedNetworkQualityMetricsReporter::Start(
absl::string_view test_case_name,
const TrackIdStreamInfoMap* reporter_helper) {

View File

@ -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<EmulatedEndpoint*> 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<EmulatedEndpoint*> endpoints);
std::map<std::string, NetworkLayerStats> GetStats();
private:
const std::map<std::string, std::vector<EmulatedEndpoint*>> peer_endpoints_;
const std::map<rtc::IPAddress, std::string> ip_to_peer_;
Mutex mutex_;
std::map<std::string, std::vector<EmulatedEndpoint*>> peer_endpoints_
RTC_GUARDED_BY(mutex_);
std::map<rtc::IPAddress, std::string> ip_to_peer_ RTC_GUARDED_BY(mutex_);
NetworkEmulationManager* const network_emulation_;
};