diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc index c66efea674..69ac2e4cfa 100644 --- a/webrtc/audio/audio_send_stream_unittest.cc +++ b/webrtc/audio/audio_send_stream_unittest.cc @@ -134,7 +134,7 @@ struct ConfigHelper { nullptr /* observer */, &event_log_, &packet_router_)), - fake_transport_(send_side_cc_.get()), + fake_transport_(&packet_router_, send_side_cc_.get()), bitrate_allocator_(&limit_observer_), worker_queue_("ConfigHelper_worker_queue") { using testing::Invoke; diff --git a/webrtc/call/call_unittest.cc b/webrtc/call/call_unittest.cc index 564f6bd032..9576beb2ee 100644 --- a/webrtc/call/call_unittest.cc +++ b/webrtc/call/call_unittest.cc @@ -309,27 +309,110 @@ TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) { } } -// TODO(zstein): This is just a motivating example for -// MockSendSideCongestionController. It should be deleted once we have more -// meaningful tests. -TEST(CallTest, MockSendSideCongestionControllerExample) { - RtcEventLogNullImpl event_log; - Call::Config config(&event_log); +namespace { +struct CallBitrateHelper { + CallBitrateHelper() : CallBitrateHelper(Call::Config(&event_log_)) {} - SimulatedClock clock(123456); - PacketRouter packet_router; - testing::NiceMock mock_cc( - &clock, &event_log, &packet_router); - auto transport_send = - rtc::MakeUnique(&mock_cc); - std::unique_ptr call(Call::Create(config, std::move(transport_send))); + explicit CallBitrateHelper(const Call::Config& config) + : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &packet_router_), + call_(Call::Create( + config, + rtc::MakeUnique(&packet_router_, + &mock_cc_))) {} + + webrtc::Call* operator->() { return call_.get(); } + testing::NiceMock& mock_cc() { + return mock_cc_; + } + + private: + webrtc::RtcEventLogNullImpl event_log_; + PacketRouter packet_router_; + testing::NiceMock mock_cc_; + std::unique_ptr call_; +}; +} // namespace + +TEST(CallBitrateTest, SetBitrateConfigWithValidConfigCallsSetBweBitrates) { + CallBitrateHelper call; Call::Config::BitrateConfig bitrate_config; bitrate_config.min_bitrate_bps = 1; bitrate_config.start_bitrate_bps = 2; bitrate_config.max_bitrate_bps = 3; - EXPECT_CALL(mock_cc, SetBweBitrates(1, 2, 3)); + EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)); + call->SetBitrateConfig(bitrate_config); +} + +TEST(CallBitrateTest, SetBitrateConfigWithDifferentMinCallsSetBweBitrates) { + CallBitrateHelper call; + + Call::Config::BitrateConfig bitrate_config; + bitrate_config.min_bitrate_bps = 10; + bitrate_config.start_bitrate_bps = 20; + bitrate_config.max_bitrate_bps = 30; + call->SetBitrateConfig(bitrate_config); + + bitrate_config.min_bitrate_bps = 11; + EXPECT_CALL(call.mock_cc(), SetBweBitrates(11, 20, 30)); + call->SetBitrateConfig(bitrate_config); +} + +TEST(CallBitrateTest, SetBitrateConfigWithDifferentStartCallsSetBweBitrates) { + CallBitrateHelper call; + + Call::Config::BitrateConfig bitrate_config; + bitrate_config.min_bitrate_bps = 10; + bitrate_config.start_bitrate_bps = 20; + bitrate_config.max_bitrate_bps = 30; + call->SetBitrateConfig(bitrate_config); + + bitrate_config.start_bitrate_bps = 21; + EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 21, 30)); + call->SetBitrateConfig(bitrate_config); +} + +TEST(CallBitrateTest, SetBitrateConfigWithDifferentMaxCallsSetBweBitrates) { + CallBitrateHelper call; + + Call::Config::BitrateConfig bitrate_config; + bitrate_config.min_bitrate_bps = 10; + bitrate_config.start_bitrate_bps = 20; + bitrate_config.max_bitrate_bps = 30; + call->SetBitrateConfig(bitrate_config); + + bitrate_config.max_bitrate_bps = 31; + EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 20, 31)); + call->SetBitrateConfig(bitrate_config); +} + +TEST(CallBitrateTest, SetBitrateConfigWithSameConfigElidesSecondCall) { + CallBitrateHelper call; + + Call::Config::BitrateConfig bitrate_config; + bitrate_config.min_bitrate_bps = 1; + bitrate_config.start_bitrate_bps = 2; + bitrate_config.max_bitrate_bps = 3; + + EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1); + call->SetBitrateConfig(bitrate_config); + call->SetBitrateConfig(bitrate_config); +} + +TEST(CallBitrateTest, + SetBitrateConfigWithSameMinMaxAndNegativeStartElidesSecondCall) { + CallBitrateHelper call; + + Call::Config::BitrateConfig bitrate_config; + bitrate_config.min_bitrate_bps = 1; + bitrate_config.start_bitrate_bps = 2; + bitrate_config.max_bitrate_bps = 3; + + EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1); + call->SetBitrateConfig(bitrate_config); + + bitrate_config.start_bitrate_bps = -1; call->SetBitrateConfig(bitrate_config); } diff --git a/webrtc/call/fake_rtp_transport_controller_send.h b/webrtc/call/fake_rtp_transport_controller_send.h index 42462d9062..2456228f53 100644 --- a/webrtc/call/fake_rtp_transport_controller_send.h +++ b/webrtc/call/fake_rtp_transport_controller_send.h @@ -21,12 +21,13 @@ class FakeRtpTransportControllerSend : public RtpTransportControllerSendInterface { public: explicit FakeRtpTransportControllerSend( + PacketRouter* packet_router, SendSideCongestionController* send_side_cc) - : send_side_cc_(send_side_cc) { + : packet_router_(packet_router), send_side_cc_(send_side_cc) { RTC_DCHECK(send_side_cc); } - PacketRouter* packet_router() override { return &packet_router_; } + PacketRouter* packet_router() override { return packet_router_; } SendSideCongestionController* send_side_cc() override { return send_side_cc_; @@ -39,7 +40,7 @@ class FakeRtpTransportControllerSend RtpPacketSender* packet_sender() override { return send_side_cc_->pacer(); } private: - PacketRouter packet_router_; + PacketRouter* packet_router_; SendSideCongestionController* send_side_cc_; };