diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc index 5cbb73d284..51f3cd723b 100644 --- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc +++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc @@ -803,9 +803,7 @@ TEST_F(GoogCcNetworkControllerTest, IsFairToTCP) { auto* route = s.CreateRoutes( client, send_net, s.CreateClient("return", CallClientConfig()), ret_net); s.CreateVideoStream(route->forward(), VideoStreamConfig()); - s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net), - s.net()->CreateRoute(ret_net), - FakeTcpConfig()); + s.net()->StartFakeTcpCrossTraffic(send_net, ret_net, FakeTcpConfig()); s.RunFor(TimeDelta::seconds(10)); // Currently only testing for the upper limit as we in practice back out diff --git a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc index a9827b2928..5473497633 100644 --- a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc +++ b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc @@ -107,9 +107,7 @@ TEST(ReceiveSideCongestionControllerTest, IsFairToTCP) { VideoStreamConfig video; video.stream.packet_feedback = false; s.CreateVideoStream(route->forward(), video); - s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net), - s.net()->CreateRoute(ret_net), - FakeTcpConfig()); + s.net()->StartFakeTcpCrossTraffic(send_net, ret_net, FakeTcpConfig()); s.RunFor(TimeDelta::seconds(30)); // For some reason we get outcompeted by TCP here, this should probably be // fixed and a lower bound should be added to the test. diff --git a/test/network/cross_traffic.cc b/test/network/cross_traffic.cc index 63982a1372..0d1937f9eb 100644 --- a/test/network/cross_traffic.cc +++ b/test/network/cross_traffic.cc @@ -115,10 +115,22 @@ ColumnPrinter PulsedPeaksCrossTraffic::StatsPrinter() { 32); } -FakeTcpCrossTraffic::FakeTcpCrossTraffic(FakeTcpConfig config, +FakeTcpCrossTraffic::FakeTcpCrossTraffic(Clock* clock, + FakeTcpConfig config, EmulatedRoute* send_route, EmulatedRoute* ret_route) - : conf_(config), route_(this, send_route, ret_route) {} + : clock_(clock), conf_(config), route_(this, send_route, ret_route) {} + +void FakeTcpCrossTraffic::Start(TaskQueueBase* task_queue) { + repeating_task_handle_ = RepeatingTaskHandle::Start(task_queue, [this] { + Process(clock_->CurrentTime()); + return conf_.process_interval; + }); +} + +void FakeTcpCrossTraffic::Stop() { + repeating_task_handle_.Stop(); +} void FakeTcpCrossTraffic::Process(Timestamp at_time) { SendPackets(at_time); diff --git a/test/network/cross_traffic.h b/test/network/cross_traffic.h index 6a01a4e07e..98e56d6fad 100644 --- a/test/network/cross_traffic.h +++ b/test/network/cross_traffic.h @@ -95,7 +95,6 @@ class PulsedPeaksCrossTraffic { struct FakeTcpConfig { DataSize packet_size = DataSize::bytes(1200); DataSize send_limit = DataSize::PlusInfinity(); - int packet_window; TimeDelta process_interval = TimeDelta::ms(200); TimeDelta packet_timeout = TimeDelta::seconds(1); }; @@ -103,9 +102,12 @@ struct FakeTcpConfig { class FakeTcpCrossTraffic : public TwoWayFakeTrafficRoute::TrafficHandlerInterface { public: - FakeTcpCrossTraffic(FakeTcpConfig config, + FakeTcpCrossTraffic(Clock* clock, + FakeTcpConfig config, EmulatedRoute* send_route, EmulatedRoute* ret_route); + void Start(TaskQueueBase* task_queue); + void Stop(); void Process(Timestamp at_time); void OnRequest(int sequence_number, Timestamp at_time) override; void OnResponse(int sequence_number, Timestamp at_time) override; @@ -115,6 +117,7 @@ class FakeTcpCrossTraffic void SendPackets(Timestamp at_time); private: + Clock* const clock_; const FakeTcpConfig conf_; TwoWayFakeTrafficRoute route_; @@ -127,6 +130,7 @@ class FakeTcpCrossTraffic Timestamp last_reduction_time_ = Timestamp::MinusInfinity(); TimeDelta last_rtt_ = TimeDelta::Zero(); DataSize total_sent_ = DataSize::Zero(); + RepeatingTaskHandle repeating_task_handle_; }; } // namespace test diff --git a/test/network/network_emulation.h b/test/network/network_emulation.h index f23f575027..2051216a40 100644 --- a/test/network/network_emulation.h +++ b/test/network/network_emulation.h @@ -268,6 +268,8 @@ class FakePacketRoute : public EmulatedNetworkReceiverInterface { recv_addr_(route_->to->GetPeerLocalAddress(), *route_->to->BindReceiver(0, this)) {} + ~FakePacketRoute() { route_->to->UnbindReceiver(recv_addr_.port()); } + void SendPacket(size_t size, FakePacketType packet) { RTC_CHECK_GE(size, sizeof(int)); sent_.emplace(next_packet_id_, packet); diff --git a/test/network/network_emulation_manager.cc b/test/network/network_emulation_manager.cc index 73f10214f7..b0caac33f4 100644 --- a/test/network/network_emulation_manager.cc +++ b/test/network/network_emulation_manager.cc @@ -212,21 +212,28 @@ NetworkEmulationManagerImpl::CreatePulsedPeaksCrossTraffic( return out; } -void NetworkEmulationManagerImpl::StartFakeTcpCrossTraffic( - EmulatedRoute* send_route, - EmulatedRoute* ret_route, +FakeTcpCrossTraffic* NetworkEmulationManagerImpl::StartFakeTcpCrossTraffic( + std::vector send_link, + std::vector ret_link, FakeTcpConfig config) { - task_queue_.PostTask([=]() { - auto traffic = - std::make_unique(config, send_route, ret_route); - auto* traffic_ptr = traffic.get(); + auto traffic = std::make_unique( + clock_, config, CreateRoute(send_link), CreateRoute(ret_link)); + auto* traffic_ptr = traffic.get(); + task_queue_.PostTask([this, traffic = std::move(traffic)]() mutable { + traffic->Start(task_queue_.Get()); tcp_cross_traffics_.push_back(std::move(traffic)); - TimeDelta process_interval = config.process_interval; - RepeatingTaskHandle::Start(task_queue_.Get(), - [this, process_interval, traffic_ptr] { - traffic_ptr->Process(Now()); - return process_interval; - }); + }); + return traffic_ptr; +} + +void NetworkEmulationManagerImpl::StopCrossTraffic( + FakeTcpCrossTraffic* traffic) { + task_queue_.PostTask([=]() { + traffic->Stop(); + tcp_cross_traffics_.remove_if( + [=](const std::unique_ptr& ptr) { + return ptr.get() == traffic; + }); }); } diff --git a/test/network/network_emulation_manager.h b/test/network/network_emulation_manager.h index fbe8a23ca9..b4e06ce12d 100644 --- a/test/network/network_emulation_manager.h +++ b/test/network/network_emulation_manager.h @@ -72,9 +72,11 @@ class NetworkEmulationManagerImpl : public NetworkEmulationManager { PulsedPeaksCrossTraffic* CreatePulsedPeaksCrossTraffic( TrafficRoute* traffic_route, PulsedPeaksConfig config); - void StartFakeTcpCrossTraffic(EmulatedRoute* send_route, - EmulatedRoute* ret_route, - FakeTcpConfig config); + FakeTcpCrossTraffic* StartFakeTcpCrossTraffic( + std::vector send_link, + std::vector ret_link, + FakeTcpConfig config); + void StopCrossTraffic(FakeTcpCrossTraffic* traffic); EmulatedNetworkManagerInterface* CreateEmulatedNetworkManagerInterface( const std::vector& endpoints) override; @@ -98,7 +100,7 @@ class NetworkEmulationManagerImpl : public NetworkEmulationManager { std::vector> traffic_routes_; std::vector> random_cross_traffics_; std::vector> pulsed_cross_traffics_; - std::vector> tcp_cross_traffics_; + std::list> tcp_cross_traffics_; std::vector> endpoints_containers_; std::vector> network_managers_;