blob: dc36ce20720414e9985c06bb493978aa53cc9f50 [file] [log] [blame]
solenbergc7a8b082015-10-16 14:35:07 -07001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <list>
kwiberg1c07c702017-03-27 07:15:49 -070012#include <map>
kwibergb25345e2016-03-12 06:10:44 -080013#include <memory>
zstein7cb69d52017-05-08 11:52:38 -070014#include <utility>
solenbergc7a8b082015-10-16 14:35:07 -070015
Karl Wibergf3850f62017-11-02 13:04:41 +010016#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/test/mock_audio_mixer.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010018#include "audio/audio_send_stream.h"
19#include "audio/audio_receive_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "call/audio_state.h"
21#include "call/call.h"
22#include "call/fake_rtp_transport_controller_send.h"
23#include "logging/rtc_event_log/rtc_event_log.h"
24#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010025#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h"
27#include "modules/pacing/mock/mock_paced_sender.h"
28#include "modules/rtp_rtcp/include/rtp_rtcp.h"
29#include "rtc_base/ptr_util.h"
30#include "test/fake_encoder.h"
31#include "test/gtest.h"
32#include "test/mock_audio_decoder_factory.h"
33#include "test/mock_transport.h"
solenbergc7a8b082015-10-16 14:35:07 -070034
35namespace {
36
37struct CallHelper {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010038 CallHelper() {
solenberg566ef242015-11-06 15:34:49 -080039 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010040 audio_state_config.audio_mixer =
41 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
42 audio_state_config.audio_processing =
43 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
44 audio_state_config.audio_device_module =
45 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070046 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080047 config.audio_state = webrtc::AudioState::Create(audio_state_config);
solenbergc7a8b082015-10-16 14:35:07 -070048 call_.reset(webrtc::Call::Create(config));
49 }
50
51 webrtc::Call* operator->() { return call_.get(); }
52
53 private:
skvlad11a9cbf2016-10-07 11:53:05 -070054 webrtc::RtcEventLogNullImpl event_log_;
kwibergb25345e2016-03-12 06:10:44 -080055 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070056};
57} // namespace
58
59namespace webrtc {
60
61TEST(CallTest, ConstructDestruct) {
62 CallHelper call;
63}
64
65TEST(CallTest, CreateDestroy_AudioSendStream) {
66 CallHelper call;
67 AudioSendStream::Config config(nullptr);
68 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070069 AudioSendStream* stream = call->CreateAudioSendStream(config);
70 EXPECT_NE(stream, nullptr);
71 call->DestroyAudioSendStream(stream);
72}
73
74TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010075 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070076 AudioReceiveStream::Config config;
77 config.rtp.remote_ssrc = 42;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010078 config.decoder_factory =
79 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070080 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
81 EXPECT_NE(stream, nullptr);
82 call->DestroyAudioReceiveStream(stream);
83}
84
85TEST(CallTest, CreateDestroy_AudioSendStreams) {
86 CallHelper call;
87 AudioSendStream::Config config(nullptr);
solenbergc7a8b082015-10-16 14:35:07 -070088 std::list<AudioSendStream*> streams;
89 for (int i = 0; i < 2; ++i) {
90 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
91 config.rtp.ssrc = ssrc;
92 AudioSendStream* stream = call->CreateAudioSendStream(config);
93 EXPECT_NE(stream, nullptr);
94 if (ssrc & 1) {
95 streams.push_back(stream);
96 } else {
97 streams.push_front(stream);
98 }
99 }
100 for (auto s : streams) {
101 call->DestroyAudioSendStream(s);
102 }
103 streams.clear();
104 }
105}
106
107TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100108 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700109 AudioReceiveStream::Config config;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100110 config.decoder_factory =
111 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700112 std::list<AudioReceiveStream*> streams;
113 for (int i = 0; i < 2; ++i) {
114 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
115 config.rtp.remote_ssrc = ssrc;
116 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
117 EXPECT_NE(stream, nullptr);
118 if (ssrc & 1) {
119 streams.push_back(stream);
120 } else {
121 streams.push_front(stream);
122 }
123 }
124 for (auto s : streams) {
125 call->DestroyAudioReceiveStream(s);
126 }
127 streams.clear();
128 }
129}
brandtr25445d32016-10-23 23:37:14 -0700130
solenberg7602aab2016-11-14 11:30:07 -0800131TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100132 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800133 AudioReceiveStream::Config recv_config;
134 recv_config.rtp.remote_ssrc = 42;
135 recv_config.rtp.local_ssrc = 777;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100136 recv_config.decoder_factory =
137 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800138 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
139 EXPECT_NE(recv_stream, nullptr);
140
solenberg7602aab2016-11-14 11:30:07 -0800141 AudioSendStream::Config send_config(nullptr);
142 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800143 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
144 EXPECT_NE(send_stream, nullptr);
145
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100146 internal::AudioReceiveStream* internal_recv_stream =
147 static_cast<internal::AudioReceiveStream*>(recv_stream);
148 EXPECT_EQ(send_stream,
149 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800150
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100151 call->DestroyAudioSendStream(send_stream);
152 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
153
solenberg7602aab2016-11-14 11:30:07 -0800154 call->DestroyAudioReceiveStream(recv_stream);
155}
156
157TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100158 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800159 AudioSendStream::Config send_config(nullptr);
160 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800161 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
162 EXPECT_NE(send_stream, nullptr);
163
164 AudioReceiveStream::Config recv_config;
165 recv_config.rtp.remote_ssrc = 42;
166 recv_config.rtp.local_ssrc = 777;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100167 recv_config.decoder_factory =
168 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800169 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
170 EXPECT_NE(recv_stream, nullptr);
171
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100172 internal::AudioReceiveStream* internal_recv_stream =
173 static_cast<internal::AudioReceiveStream*>(recv_stream);
174 EXPECT_EQ(send_stream,
175 internal_recv_stream->GetAssociatedSendStreamForTesting());
176
solenberg7602aab2016-11-14 11:30:07 -0800177 call->DestroyAudioReceiveStream(recv_stream);
178
179 call->DestroyAudioSendStream(send_stream);
180}
181
brandtr25445d32016-10-23 23:37:14 -0700182TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
183 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800184 MockTransport rtcp_send_transport;
185 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800186 config.payload_type = 118;
187 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700188 config.protected_media_ssrcs = {27273};
189
190 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
191 EXPECT_NE(stream, nullptr);
192 call->DestroyFlexfecReceiveStream(stream);
193}
194
195TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
196 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800197 MockTransport rtcp_send_transport;
198 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800199 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700200 std::list<FlexfecReceiveStream*> streams;
201
202 for (int i = 0; i < 2; ++i) {
203 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800204 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700205 config.protected_media_ssrcs = {ssrc + 1};
206 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
207 EXPECT_NE(stream, nullptr);
208 if (ssrc & 1) {
209 streams.push_back(stream);
210 } else {
211 streams.push_front(stream);
212 }
213 }
214 for (auto s : streams) {
215 call->DestroyFlexfecReceiveStream(s);
216 }
217 streams.clear();
218 }
219}
220
221TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
222 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800223 MockTransport rtcp_send_transport;
224 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800225 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700226 config.protected_media_ssrcs = {1324234};
227 FlexfecReceiveStream* stream;
228 std::list<FlexfecReceiveStream*> streams;
229
brandtr1cfbd602016-12-08 04:17:53 -0800230 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700231 stream = call->CreateFlexfecReceiveStream(config);
232 EXPECT_NE(stream, nullptr);
233 streams.push_back(stream);
234
brandtr1cfbd602016-12-08 04:17:53 -0800235 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700236 stream = call->CreateFlexfecReceiveStream(config);
237 EXPECT_NE(stream, nullptr);
238 streams.push_back(stream);
239
brandtr1cfbd602016-12-08 04:17:53 -0800240 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700241 stream = call->CreateFlexfecReceiveStream(config);
242 EXPECT_NE(stream, nullptr);
243 streams.push_back(stream);
244
brandtr1cfbd602016-12-08 04:17:53 -0800245 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700246 stream = call->CreateFlexfecReceiveStream(config);
247 EXPECT_NE(stream, nullptr);
248 streams.push_back(stream);
249
250 for (auto s : streams) {
251 call->DestroyFlexfecReceiveStream(s);
252 }
253}
254
zstein8c96a142017-05-17 11:49:12 -0700255namespace {
256struct CallBitrateHelper {
zstein4b979802017-06-02 14:37:37 -0700257 CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {}
zstein7cb69d52017-05-08 11:52:38 -0700258
zstein4b979802017-06-02 14:37:37 -0700259 explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config)
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200260 : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &pacer_) {
zstein4b979802017-06-02 14:37:37 -0700261 Call::Config config(&event_log_);
262 config.bitrate_config = bitrate_config;
263 call_.reset(
264 Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>(
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200265 &packet_router_, &pacer_, &mock_cc_)));
zstein4b979802017-06-02 14:37:37 -0700266 }
zstein8c96a142017-05-17 11:49:12 -0700267
268 webrtc::Call* operator->() { return call_.get(); }
269 testing::NiceMock<test::MockSendSideCongestionController>& mock_cc() {
270 return mock_cc_;
271 }
272
273 private:
274 webrtc::RtcEventLogNullImpl event_log_;
275 PacketRouter packet_router_;
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200276 testing::NiceMock<MockPacedSender> pacer_;
zstein8c96a142017-05-17 11:49:12 -0700277 testing::NiceMock<test::MockSendSideCongestionController> mock_cc_;
278 std::unique_ptr<Call> call_;
279};
280} // namespace
281
282TEST(CallBitrateTest, SetBitrateConfigWithValidConfigCallsSetBweBitrates) {
283 CallBitrateHelper call;
zstein7cb69d52017-05-08 11:52:38 -0700284
285 Call::Config::BitrateConfig bitrate_config;
286 bitrate_config.min_bitrate_bps = 1;
287 bitrate_config.start_bitrate_bps = 2;
288 bitrate_config.max_bitrate_bps = 3;
289
zstein8c96a142017-05-17 11:49:12 -0700290 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3));
291 call->SetBitrateConfig(bitrate_config);
292}
293
294TEST(CallBitrateTest, SetBitrateConfigWithDifferentMinCallsSetBweBitrates) {
295 CallBitrateHelper call;
296
297 Call::Config::BitrateConfig bitrate_config;
298 bitrate_config.min_bitrate_bps = 10;
299 bitrate_config.start_bitrate_bps = 20;
300 bitrate_config.max_bitrate_bps = 30;
301 call->SetBitrateConfig(bitrate_config);
302
303 bitrate_config.min_bitrate_bps = 11;
zstein4b979802017-06-02 14:37:37 -0700304 EXPECT_CALL(call.mock_cc(), SetBweBitrates(11, -1, 30));
zstein8c96a142017-05-17 11:49:12 -0700305 call->SetBitrateConfig(bitrate_config);
306}
307
308TEST(CallBitrateTest, SetBitrateConfigWithDifferentStartCallsSetBweBitrates) {
309 CallBitrateHelper call;
310
311 Call::Config::BitrateConfig bitrate_config;
312 bitrate_config.min_bitrate_bps = 10;
313 bitrate_config.start_bitrate_bps = 20;
314 bitrate_config.max_bitrate_bps = 30;
315 call->SetBitrateConfig(bitrate_config);
316
317 bitrate_config.start_bitrate_bps = 21;
318 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 21, 30));
319 call->SetBitrateConfig(bitrate_config);
320}
321
322TEST(CallBitrateTest, SetBitrateConfigWithDifferentMaxCallsSetBweBitrates) {
323 CallBitrateHelper call;
324
325 Call::Config::BitrateConfig bitrate_config;
326 bitrate_config.min_bitrate_bps = 10;
327 bitrate_config.start_bitrate_bps = 20;
328 bitrate_config.max_bitrate_bps = 30;
329 call->SetBitrateConfig(bitrate_config);
330
331 bitrate_config.max_bitrate_bps = 31;
zstein4b979802017-06-02 14:37:37 -0700332 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, -1, 31));
zstein8c96a142017-05-17 11:49:12 -0700333 call->SetBitrateConfig(bitrate_config);
334}
335
336TEST(CallBitrateTest, SetBitrateConfigWithSameConfigElidesSecondCall) {
337 CallBitrateHelper call;
zstein8c96a142017-05-17 11:49:12 -0700338 Call::Config::BitrateConfig bitrate_config;
339 bitrate_config.min_bitrate_bps = 1;
340 bitrate_config.start_bitrate_bps = 2;
341 bitrate_config.max_bitrate_bps = 3;
342
343 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
344 call->SetBitrateConfig(bitrate_config);
345 call->SetBitrateConfig(bitrate_config);
346}
347
348TEST(CallBitrateTest,
349 SetBitrateConfigWithSameMinMaxAndNegativeStartElidesSecondCall) {
350 CallBitrateHelper call;
351
352 Call::Config::BitrateConfig bitrate_config;
353 bitrate_config.min_bitrate_bps = 1;
354 bitrate_config.start_bitrate_bps = 2;
355 bitrate_config.max_bitrate_bps = 3;
356
357 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
358 call->SetBitrateConfig(bitrate_config);
359
360 bitrate_config.start_bitrate_bps = -1;
zstein7cb69d52017-05-08 11:52:38 -0700361 call->SetBitrateConfig(bitrate_config);
362}
363
ossuc3d4b482017-05-23 06:07:11 -0700364TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
365 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100366 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700367
368 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
369 AudioSendStream::Config config(nullptr);
370 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700371 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100372 const RtpState rtp_state =
373 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700374 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700375 return rtp_state;
376 };
377
378 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
379 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
380
381 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
382 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
383 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
384 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
385 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
386 rtp_state2.last_timestamp_time_ms);
387 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
388}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100389
zstein4b979802017-06-02 14:37:37 -0700390TEST(CallBitrateTest, BiggerMaskMinUsed) {
391 CallBitrateHelper call;
392 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100393 mask.min_bitrate_bps = 1234;
zstein4b979802017-06-02 14:37:37 -0700394
395 EXPECT_CALL(call.mock_cc(),
396 SetBweBitrates(*mask.min_bitrate_bps, testing::_, testing::_));
397 call->SetBitrateConfigMask(mask);
398}
399
400TEST(CallBitrateTest, BiggerConfigMinUsed) {
401 CallBitrateHelper call;
402 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100403 mask.min_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700404 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, testing::_));
405 call->SetBitrateConfigMask(mask);
406
407 Call::Config::BitrateConfig config;
408 config.min_bitrate_bps = 1234;
409
410 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1234, testing::_, testing::_));
411 call->SetBitrateConfig(config);
412}
413
414// The last call to set start should be used.
415TEST(CallBitrateTest, LatestStartMaskPreferred) {
416 CallBitrateHelper call;
417 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100418 mask.start_bitrate_bps = 1300;
zstein4b979802017-06-02 14:37:37 -0700419
420 EXPECT_CALL(call.mock_cc(),
421 SetBweBitrates(testing::_, *mask.start_bitrate_bps, testing::_));
422 call->SetBitrateConfigMask(mask);
423
424 Call::Config::BitrateConfig bitrate_config;
425 bitrate_config.start_bitrate_bps = 1200;
426
427 EXPECT_CALL(
428 call.mock_cc(),
429 SetBweBitrates(testing::_, bitrate_config.start_bitrate_bps, testing::_));
430 call->SetBitrateConfig(bitrate_config);
431}
432
433TEST(CallBitrateTest, SmallerMaskMaxUsed) {
434 Call::Config::BitrateConfig bitrate_config;
435 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 2000;
436 CallBitrateHelper call(bitrate_config);
437
438 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100439 mask.max_bitrate_bps = bitrate_config.start_bitrate_bps + 1000;
zstein4b979802017-06-02 14:37:37 -0700440
441 EXPECT_CALL(call.mock_cc(),
442 SetBweBitrates(testing::_, testing::_, *mask.max_bitrate_bps));
443 call->SetBitrateConfigMask(mask);
444}
445
446TEST(CallBitrateTest, SmallerConfigMaxUsed) {
447 Call::Config::BitrateConfig bitrate_config;
448 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 1000;
449 CallBitrateHelper call(bitrate_config);
450
451 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100452 mask.max_bitrate_bps = bitrate_config.start_bitrate_bps + 2000;
zstein4b979802017-06-02 14:37:37 -0700453
454 // Expect no calls because nothing changes
455 EXPECT_CALL(call.mock_cc(),
456 SetBweBitrates(testing::_, testing::_, testing::_))
457 .Times(0);
458 call->SetBitrateConfigMask(mask);
459}
460
461TEST(CallBitrateTest, MaskStartLessThanConfigMinClamped) {
462 Call::Config::BitrateConfig bitrate_config;
463 bitrate_config.min_bitrate_bps = 2000;
464 CallBitrateHelper call(bitrate_config);
465
466 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100467 mask.start_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700468
469 EXPECT_CALL(call.mock_cc(), SetBweBitrates(2000, 2000, testing::_));
470 call->SetBitrateConfigMask(mask);
471}
472
473TEST(CallBitrateTest, MaskStartGreaterThanConfigMaxClamped) {
474 Call::Config::BitrateConfig bitrate_config;
475 bitrate_config.start_bitrate_bps = 2000;
476 CallBitrateHelper call(bitrate_config);
477
478 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100479 mask.max_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700480
481 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, -1, 1000));
482 call->SetBitrateConfigMask(mask);
483}
484
485TEST(CallBitrateTest, MaskMinGreaterThanConfigMaxClamped) {
486 Call::Config::BitrateConfig bitrate_config;
487 bitrate_config.min_bitrate_bps = 2000;
488 CallBitrateHelper call(bitrate_config);
489
490 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100491 mask.max_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700492
493 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, 1000));
494 call->SetBitrateConfigMask(mask);
495}
496
497TEST(CallBitrateTest, SettingMaskStartForcesUpdate) {
498 CallBitrateHelper call;
499
500 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100501 mask.start_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700502
503 // SetBweBitrates should be called twice with the same params since
504 // start_bitrate_bps is set.
505 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, 1000, testing::_))
506 .Times(2);
507 call->SetBitrateConfigMask(mask);
508 call->SetBitrateConfigMask(mask);
509}
510
511TEST(CallBitrateTest, SetBitrateConfigWithNoChangesDoesNotCallSetBweBitrates) {
512 CallBitrateHelper call;
513
514 Call::Config::BitrateConfig config1;
515 config1.min_bitrate_bps = 0;
516 config1.start_bitrate_bps = 1000;
517 config1.max_bitrate_bps = -1;
518
519 Call::Config::BitrateConfig config2;
520 config2.min_bitrate_bps = 0;
521 config2.start_bitrate_bps = -1;
522 config2.max_bitrate_bps = -1;
523
524 // The second call should not call SetBweBitrates because it doesn't
525 // change any values.
526 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
527 call->SetBitrateConfig(config1);
528 call->SetBitrateConfig(config2);
529}
530
531// If SetBitrateConfig changes the max, but not the effective max,
532// SetBweBitrates shouldn't be called, to avoid unnecessary encoder
533// reconfigurations.
534TEST(CallBitrateTest, SetBweBitratesNotCalledWhenEffectiveMaxUnchanged) {
535 CallBitrateHelper call;
536
537 Call::Config::BitrateConfig config;
538 config.min_bitrate_bps = 0;
539 config.start_bitrate_bps = -1;
540 config.max_bitrate_bps = 2000;
541 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 2000));
542 call->SetBitrateConfig(config);
543
544 // Reduce effective max to 1000 with the mask.
545 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100546 mask.max_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700547 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 1000));
548 call->SetBitrateConfigMask(mask);
549
550 // This leaves the effective max unchanged, so SetBweBitrates shouldn't be
551 // called again.
552 config.max_bitrate_bps = 1000;
553 call->SetBitrateConfig(config);
554}
555
556// When the "start bitrate" mask is removed, SetBweBitrates shouldn't be called
557// again, since nothing's changing.
558TEST(CallBitrateTest, SetBweBitratesNotCalledWhenStartMaskRemoved) {
559 CallBitrateHelper call;
560
561 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100562 mask.start_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700563 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
564 call->SetBitrateConfigMask(mask);
565
566 mask.start_bitrate_bps.reset();
567 call->SetBitrateConfigMask(mask);
568}
569
570// Test that if SetBitrateConfig is called after SetBitrateConfigMask applies a
571// "start" value, the SetBitrateConfig call won't apply that start value a
572// second time.
573TEST(CallBitrateTest, SetBitrateConfigAfterSetBitrateConfigMaskWithStart) {
574 CallBitrateHelper call;
575
576 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100577 mask.start_bitrate_bps = 1000;
zstein4b979802017-06-02 14:37:37 -0700578 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
579 call->SetBitrateConfigMask(mask);
580
581 Call::Config::BitrateConfig config;
582 config.min_bitrate_bps = 0;
583 config.start_bitrate_bps = -1;
584 config.max_bitrate_bps = 5000;
585 // The start value isn't changing, so SetBweBitrates should be called with
586 // -1.
587 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, -1, 5000));
588 call->SetBitrateConfig(config);
589}
590
591TEST(CallBitrateTest, SetBweBitratesNotCalledWhenClampedMinUnchanged) {
592 Call::Config::BitrateConfig bitrate_config;
593 bitrate_config.start_bitrate_bps = 500;
594 bitrate_config.max_bitrate_bps = 1000;
595 CallBitrateHelper call(bitrate_config);
596
597 // Set min to 2000; it is clamped to the max (1000).
598 Call::Config::BitrateConfigMask mask;
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100599 mask.min_bitrate_bps = 2000;
zstein4b979802017-06-02 14:37:37 -0700600 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, -1, 1000));
601 call->SetBitrateConfigMask(mask);
602
603 // Set min to 3000; the clamped value stays the same so nothing happens.
Oskar Sundbomfedc00c2017-11-16 10:55:08 +0100604 mask.min_bitrate_bps = 3000;
zstein4b979802017-06-02 14:37:37 -0700605 call->SetBitrateConfigMask(mask);
606}
ossuc3d4b482017-05-23 06:07:11 -0700607
solenbergc7a8b082015-10-16 14:35:07 -0700608} // namespace webrtc