Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Unified Diff: webrtc/call/call_unittest.cc

Issue 2838233002: Add PeerConnectionInterface::UpdateCallBitrate with call tests. (Closed)
Patch Set: Style/test coverage feedback. No clamping yet. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/call/call_unittest.cc
diff --git a/webrtc/call/call_unittest.cc b/webrtc/call/call_unittest.cc
index 27d23298112f13b4f4fec673a6a5d54550366040..9c3dee20c1d2b44e0f7bd09cc096a053d9ac9ab2 100644
--- a/webrtc/call/call_unittest.cc
+++ b/webrtc/call/call_unittest.cc
@@ -11,11 +11,14 @@
#include <list>
#include <map>
#include <memory>
+#include <utility>
+#include "webrtc/base/ptr_util.h"
#include "webrtc/call/audio_state.h"
#include "webrtc/call/call.h"
#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
+#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
#include "webrtc/test/gtest.h"
#include "webrtc/test/mock_audio_decoder_factory.h"
#include "webrtc/test/mock_transport.h"
@@ -305,4 +308,186 @@ TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
}
}
+// TODO(zstein): This probably belongs in webrtc/modules/congestion_controller/
+class MockSendSideCongestionController : public SendSideCongestionController {
+ public:
+ MockSendSideCongestionController(const Clock* clock,
+ Observer* observer,
+ RtcEventLog* event_log,
+ PacketRouter* packet_router)
+ : SendSideCongestionController(clock,
+ observer,
+ event_log,
+ packet_router) {}
+
+ MOCK_METHOD3(SetBweBitrates, void(int, int, int));
+};
+
+class FakeRtpTransportController : public RtpTransportControllerSendInterface {
+ public:
+ explicit FakeRtpTransportController(PacketRouter* r,
+ SendSideCongestionController* cc)
+ : packet_router_(r), send_side_cc_(cc) {}
+
+ PacketRouter* packet_router() override { return packet_router_; }
+
+ SendSideCongestionController* send_side_cc() override {
+ return send_side_cc_;
+ }
+
+ TransportFeedbackObserver* transport_feedback_observer() override {
+ return send_side_cc_;
+ }
+
+ RtpPacketSender* packet_sender() override { return nullptr; }
+
+ private:
+ PacketRouter* packet_router_;
+ SendSideCongestionController* send_side_cc_;
+};
+
+class CallBitrateTest : public testing::Test {
+ public:
+ void SetUp() {
+ Clock* clock = Clock::GetRealTimeClock(); // TODO(zstein): test clock?
+ mock_cc_ =
+ rtc::MakeUnique<testing::NiceMock<MockSendSideCongestionController>>(
+ clock, nullptr, &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<FakeRtpTransportController>(&packet_router_,
+ mock_cc_.get());
+ call_.reset(Call::Create(config, std::move(fake_controller)));
+ }
+
+ std::unique_ptr<testing::NiceMock<MockSendSideCongestionController>> mock_cc_;
+ std::unique_ptr<Call> call_;
+
+ webrtc::RtcEventLogNullImpl event_log_;
+
+ private:
+ PacketRouter packet_router_; // TODO(zstein): fake?
+};
+
+using testing::_;
+
+TEST_F(CallBitrateTest, MinMaskPreferred) {
+ CreateCall();
+ Call::Config::BitrateConfigMask mask;
+ mask.min_bitrate_bps = rtc::Optional<int>(1234);
+
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(*mask.min_bitrate_bps, _, _));
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+TEST_F(CallBitrateTest, StartMaskPreferred) {
+ CreateCall();
+ Call::Config::BitrateConfigMask mask;
+ mask.start_bitrate_bps = rtc::Optional<int>(1234);
+
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(_, *mask.start_bitrate_bps, _));
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+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(_, _, *mask.max_bitrate_bps));
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+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(_, _, _)).Times(0);
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+TEST_F(CallBitrateTest, MaskStartLessThanConfigMinFails) {
+ 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_FALSE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+TEST_F(CallBitrateTest, MaskMaxLessThanConfigStartFails) {
+ 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_FALSE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+TEST_F(CallBitrateTest, MaskMaxLessThanConfigMinFails) {
+ 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_FALSE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+TEST_F(CallBitrateTest, SettingStartForcesUpdate) {
+ CreateCall();
+
+ Call::Config::BitrateConfigMask mask;
+ mask.start_bitrate_bps = rtc::Optional<int>(1000);
+
+ // SetBweBitrates should be called twice with the same params when
+ // start_bitrate_bps is set.
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(_, 1000, _)).Times(2);
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+ EXPECT_TRUE(call_->SetBitrateConfigMask(mask).ok());
+}
+
+// TODO(zstein): Delete or rename.
+TEST_F(CallBitrateTest, TaylorCR) {
+ 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;
+
+ EXPECT_CALL(*mock_cc_, SetBweBitrates(0, 1000, -1));
+ call_->SetBitrateConfig(config1);
+ call_->SetBitrateConfig(config2);
+}
+
Taylor Brandstetter 2017/05/05 08:04:32 I have some other suggestions for tests. Can you t
Zach Stein 2017/05/09 00:41:26 Thanks, these are great test cases. Did you have t
Taylor Brandstetter 2017/05/09 15:51:54 One is passing, but two aren't. The issue is that
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698