Index: webrtc/call/call_unittest.cc |
diff --git a/webrtc/call/call_unittest.cc b/webrtc/call/call_unittest.cc |
index 564f6bd0323e014771266f9ec432b099758ef18b..8a304d8e9667729876481e3d62ec0ebf4de2c823 100644 |
--- a/webrtc/call/call_unittest.cc |
+++ b/webrtc/call/call_unittest.cc |
@@ -309,28 +309,239 @@ 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); |
- |
- SimulatedClock clock(123456); |
- PacketRouter packet_router; |
- testing::NiceMock<test::MockSendSideCongestionController> mock_cc( |
- &clock, &event_log, &packet_router); |
- auto transport_send = |
- rtc::MakeUnique<FakeRtpTransportControllerSend>(&mock_cc); |
- std::unique_ptr<Call> call(Call::Create(config, std::move(transport_send))); |
- |
- 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)); |
- call->SetBitrateConfig(bitrate_config); |
+class CallBitrateTest : public testing::Test { |
+ public: |
+ void SetUp() { |
+ Clock* clock = Clock::GetRealTimeClock(); |
+ mock_cc_ = rtc::MakeUnique< |
+ testing::NiceMock<test::MockSendSideCongestionController>>( |
+ clock, &event_log_, &packet_router_); |
+ } |
+ |
+ void CreateCall() { |
+ Call::Config config(&event_log_); |
+ CreateCall(config); |
+ } |
+ |
+ void CreateCall(const Call::Config& config) { |
+ std::unique_ptr<RtpTransportControllerSendInterface> fake_controller = |
+ rtc::MakeUnique<FakeRtpTransportControllerSend>(&packet_router_, |
+ mock_cc_.get()); |
+ call_.reset(Call::Create(config, std::move(fake_controller))); |
+ } |
+ |
+ std::unique_ptr<testing::NiceMock<test::MockSendSideCongestionController>> |
+ mock_cc_; |
+ std::unique_ptr<Call> call_; |
+ |
+ webrtc::RtcEventLogNullImpl event_log_; |
+ |
+ private: |
+ PacketRouter packet_router_; |
+}; |
+ |
+TEST_F(CallBitrateTest, BiggerMaskMinUsed) { |
+ CreateCall(); |
+ Call::Config::BitrateConfigMask mask; |
+ mask.min_bitrate_bps = rtc::Optional<int>(1234); |
+ |
+ EXPECT_CALL(*mock_cc_, |
+ SetBweBitrates(*mask.min_bitrate_bps, testing::_, testing::_)); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, BiggerConfigMinUsed) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.min_bitrate_bps = rtc::Optional<int>(1000); |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(1000, testing::_, testing::_)); |
+ call_->SetBitrateConfigMask(mask); |
+ |
+ Call::Config::BitrateConfig config; |
+ config.min_bitrate_bps = 1234; |
+ |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(1234, testing::_, testing::_)); |
+ call_->SetBitrateConfig(config); |
+} |
+ |
+// The last call to set start should be used. |
+TEST_F(CallBitrateTest, LatestStartMaskPreferred) { |
+ CreateCall(); |
+ Call::Config::BitrateConfigMask mask; |
+ mask.start_bitrate_bps = rtc::Optional<int>(1300); |
+ |
+ EXPECT_CALL(*mock_cc_, |
+ SetBweBitrates(testing::_, *mask.start_bitrate_bps, testing::_)); |
+ call_->SetBitrateConfigMask(mask); |
+ |
+ Call::Config::BitrateConfig config; |
+ config.start_bitrate_bps = 1200; |
+ |
+ EXPECT_CALL(*mock_cc_, |
+ SetBweBitrates(testing::_, config.start_bitrate_bps, testing::_)); |
+ call_->SetBitrateConfig(config); |
+} |
+ |
+TEST_F(CallBitrateTest, SmallerMaskMaxUsed) { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.max_bitrate_bps = |
+ config.bitrate_config.start_bitrate_bps + 2000; |
+ CreateCall(config); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.max_bitrate_bps = |
+ rtc::Optional<int>(config.bitrate_config.start_bitrate_bps + 1000); |
+ |
+ EXPECT_CALL(*mock_cc_, |
+ SetBweBitrates(testing::_, testing::_, *mask.max_bitrate_bps)); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, SmallerConfigMaxUsed) { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.max_bitrate_bps = |
+ config.bitrate_config.start_bitrate_bps + 1000; |
+ CreateCall(config); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.max_bitrate_bps = |
+ rtc::Optional<int>(config.bitrate_config.start_bitrate_bps + 2000); |
+ |
+ // Expect no calls because nothing changes |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(testing::_, testing::_, testing::_)) |
+ .Times(0); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, MaskStartLessThanConfigMinClamped) { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.min_bitrate_bps = 2000; |
+ CreateCall(config); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.start_bitrate_bps = rtc::Optional<int>(1000); |
+ |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(2000, 2000, testing::_)); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, MaskStartGreaterThanConfigMaxClamped) { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.start_bitrate_bps = 2000; |
+ CreateCall(config); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.max_bitrate_bps = rtc::Optional<int>(1000); |
+ |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(testing::_, -1, 1000)); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, MaskMinGreaterThanConfigMaxClamped) { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.min_bitrate_bps = 2000; |
+ CreateCall(config); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.max_bitrate_bps = rtc::Optional<int>(1000); |
+ |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(1000, testing::_, 1000)); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, SettingMaskStartForcesUpdate) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.start_bitrate_bps = rtc::Optional<int>(1000); |
+ |
+ // SetBweBitrates should be called twice with the same params since |
+ // start_bitrate_bps is set. |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(testing::_, 1000, testing::_)).Times(2); |
+ call_->SetBitrateConfigMask(mask); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+TEST_F(CallBitrateTest, |
+ SetBitrateConfigWithNoChangesDoesNotCallSetBweBitrates) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfig config1; |
+ config1.min_bitrate_bps = 0; |
+ config1.start_bitrate_bps = 1000; |
+ config1.max_bitrate_bps = -1; |
+ |
+ Call::Config::BitrateConfig config2; |
+ config2.min_bitrate_bps = 0; |
+ config2.start_bitrate_bps = -1; |
+ config2.max_bitrate_bps = -1; |
+ |
+ // The second call should not call SetBweBitrates because it doesn't |
+ // change any values. |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, 1000, -1)); |
+ call_->SetBitrateConfig(config1); |
+ call_->SetBitrateConfig(config2); |
+} |
+ |
+// If SetBitrateConfig changes the max, but not the effective max, |
+// SetBweBitrates shouldn't be called, to avoid unnecessary encoder |
+// reconfigurations. |
+TEST_F(CallBitrateTest, SetBweBitratesNotCalledWhenEffectiveMaxUnchanged) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfig config; |
+ config.min_bitrate_bps = 0; |
+ config.start_bitrate_bps = -1; |
+ config.max_bitrate_bps = 2000; |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, -1, 2000)); |
+ call_->SetBitrateConfig(config); |
+ |
+ // Reduce effective max to 1000 with the mask. |
+ Call::Config::BitrateConfigMask mask; |
+ mask.max_bitrate_bps = rtc::Optional<int>(1000); |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, -1, 1000)); |
+ call_->SetBitrateConfigMask(mask); |
+ |
+ // This leaves the effective max unchanged, so SetBweBitrates shouldn't be |
+ // called again. |
+ config.max_bitrate_bps = 1000; |
+ call_->SetBitrateConfig(config); |
+} |
+ |
+// When the "start bitrate" mask is removed, SetBweBitrates shouldn't be called |
+// again, since nothing's changing. |
+TEST_F(CallBitrateTest, SetBweBitratesNotCalledWhenStartMaskRemoved) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.start_bitrate_bps = rtc::Optional<int>(1000); |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, 1000, -1)); |
+ call_->SetBitrateConfigMask(mask); |
+ |
+ mask.start_bitrate_bps.reset(); |
+ call_->SetBitrateConfigMask(mask); |
+} |
+ |
+// Test that if SetBitrateConfig is called after SetBitrateConfigMask applies a |
+// "start" value, the SetBitrateConfig call won't apply that start value a |
+// second time. |
+TEST_F(CallBitrateTest, SetBitrateConfigAfterSetBitrateConfigMaskWithStart) { |
+ CreateCall(); |
+ |
+ Call::Config::BitrateConfigMask mask; |
+ mask.start_bitrate_bps = rtc::Optional<int>(1000); |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, 1000, -1)); |
+ call_->SetBitrateConfigMask(mask); |
+ |
+ Call::Config::BitrateConfig config; |
+ config.min_bitrate_bps = 0; |
+ config.start_bitrate_bps = -1; |
+ config.max_bitrate_bps = 5000; |
+ // The start value isn't changing, so SetBweBitrates should be called with |
+ // -1. |
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, -1, 5000)); |
+ call_->SetBitrateConfig(config); |
} |
} // namespace webrtc |