blob: 2524de6d19b1ef794077d43225ca03135d5cc43f [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
ossuc3d4b482017-05-23 06:07:11 -070016#include "webrtc/api/test/mock_audio_mixer.h"
ossuf515ab82016-12-07 04:52:58 -080017#include "webrtc/call/audio_state.h"
18#include "webrtc/call/call.h"
zstein7cb69d52017-05-08 11:52:38 -070019#include "webrtc/call/fake_rtp_transport_controller_send.h"
skvlad11a9cbf2016-10-07 11:53:05 -070020#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
ossuc3d4b482017-05-23 06:07:11 -070021#include "webrtc/modules/audio_device/include/mock_audio_device.h"
ossuf515ab82016-12-07 04:52:58 -080022#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
zstein7cb69d52017-05-08 11:52:38 -070023#include "webrtc/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h"
ossuc3d4b482017-05-23 06:07:11 -070024#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020025#include "webrtc/rtc_base/ptr_util.h"
kwibergac9f8762016-09-30 22:29:43 -070026#include "webrtc/test/gtest.h"
kwiberg37e99fd2017-04-10 05:15:48 -070027#include "webrtc/test/mock_audio_decoder_factory.h"
brandtr8313a6f2017-01-13 07:41:19 -080028#include "webrtc/test/mock_transport.h"
Fredrik Solenberg0ccae132015-11-03 10:15:49 +010029#include "webrtc/test/mock_voice_engine.h"
solenbergc7a8b082015-10-16 14:35:07 -070030
31namespace {
32
33struct CallHelper {
ossu29b1a8d2016-06-13 07:34:51 -070034 explicit CallHelper(
35 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory = nullptr)
36 : voice_engine_(decoder_factory) {
solenberg566ef242015-11-06 15:34:49 -080037 webrtc::AudioState::Config audio_state_config;
38 audio_state_config.voice_engine = &voice_engine_;
aleloi10111bc2016-11-17 06:48:48 -080039 audio_state_config.audio_mixer = webrtc::AudioMixerImpl::Create();
peaha9cc40b2017-06-29 08:32:09 -070040 audio_state_config.audio_processing = webrtc::AudioProcessing::Create();
aleloidd310712016-11-17 06:28:59 -080041 EXPECT_CALL(voice_engine_, audio_device_module());
aleloidd310712016-11-17 06:28:59 -080042 EXPECT_CALL(voice_engine_, audio_transport());
skvlad11a9cbf2016-10-07 11:53:05 -070043 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080044 config.audio_state = webrtc::AudioState::Create(audio_state_config);
solenbergc7a8b082015-10-16 14:35:07 -070045 call_.reset(webrtc::Call::Create(config));
46 }
47
48 webrtc::Call* operator->() { return call_.get(); }
solenberg7602aab2016-11-14 11:30:07 -080049 webrtc::test::MockVoiceEngine* voice_engine() { return &voice_engine_; }
solenbergc7a8b082015-10-16 14:35:07 -070050
51 private:
solenberg3a941542015-11-16 07:34:50 -080052 testing::NiceMock<webrtc::test::MockVoiceEngine> voice_engine_;
skvlad11a9cbf2016-10-07 11:53:05 -070053 webrtc::RtcEventLogNullImpl event_log_;
kwibergb25345e2016-03-12 06:10:44 -080054 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070055};
56} // namespace
57
58namespace webrtc {
59
60TEST(CallTest, ConstructDestruct) {
61 CallHelper call;
62}
63
64TEST(CallTest, CreateDestroy_AudioSendStream) {
65 CallHelper call;
66 AudioSendStream::Config config(nullptr);
67 config.rtp.ssrc = 42;
68 config.voe_channel_id = 123;
69 AudioSendStream* stream = call->CreateAudioSendStream(config);
70 EXPECT_NE(stream, nullptr);
71 call->DestroyAudioSendStream(stream);
72}
73
74TEST(CallTest, CreateDestroy_AudioReceiveStream) {
ossu29b1a8d2016-06-13 07:34:51 -070075 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
76 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
77 CallHelper call(decoder_factory);
solenbergc7a8b082015-10-16 14:35:07 -070078 AudioReceiveStream::Config config;
79 config.rtp.remote_ssrc = 42;
80 config.voe_channel_id = 123;
ossu29b1a8d2016-06-13 07:34:51 -070081 config.decoder_factory = decoder_factory;
solenbergc7a8b082015-10-16 14:35:07 -070082 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
83 EXPECT_NE(stream, nullptr);
84 call->DestroyAudioReceiveStream(stream);
85}
86
87TEST(CallTest, CreateDestroy_AudioSendStreams) {
88 CallHelper call;
89 AudioSendStream::Config config(nullptr);
90 config.voe_channel_id = 123;
91 std::list<AudioSendStream*> streams;
92 for (int i = 0; i < 2; ++i) {
93 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
94 config.rtp.ssrc = ssrc;
95 AudioSendStream* stream = call->CreateAudioSendStream(config);
96 EXPECT_NE(stream, nullptr);
97 if (ssrc & 1) {
98 streams.push_back(stream);
99 } else {
100 streams.push_front(stream);
101 }
102 }
103 for (auto s : streams) {
104 call->DestroyAudioSendStream(s);
105 }
106 streams.clear();
107 }
108}
109
110TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
ossu29b1a8d2016-06-13 07:34:51 -0700111 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
112 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
113 CallHelper call(decoder_factory);
solenbergc7a8b082015-10-16 14:35:07 -0700114 AudioReceiveStream::Config config;
115 config.voe_channel_id = 123;
ossu29b1a8d2016-06-13 07:34:51 -0700116 config.decoder_factory = decoder_factory;
solenbergc7a8b082015-10-16 14:35:07 -0700117 std::list<AudioReceiveStream*> streams;
118 for (int i = 0; i < 2; ++i) {
119 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
120 config.rtp.remote_ssrc = ssrc;
121 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
122 EXPECT_NE(stream, nullptr);
123 if (ssrc & 1) {
124 streams.push_back(stream);
125 } else {
126 streams.push_front(stream);
127 }
128 }
129 for (auto s : streams) {
130 call->DestroyAudioReceiveStream(s);
131 }
132 streams.clear();
133 }
134}
brandtr25445d32016-10-23 23:37:14 -0700135
solenberg7602aab2016-11-14 11:30:07 -0800136TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
137 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
138 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
139 CallHelper call(decoder_factory);
ossuc3d4b482017-05-23 06:07:11 -0700140 ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
solenberg7602aab2016-11-14 11:30:07 -0800141
142 constexpr int kRecvChannelId = 101;
143
144 // Set up the mock to create a channel proxy which we know of, so that we can
145 // add our expectations to it.
146 test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
147 EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
148 .WillRepeatedly(testing::Invoke([&](int channel_id) {
149 test::MockVoEChannelProxy* channel_proxy =
150 new testing::NiceMock<test::MockVoEChannelProxy>();
151 EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
152 .WillRepeatedly(testing::ReturnRef(decoder_factory));
kwiberg1c07c702017-03-27 07:15:49 -0700153 EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
154 .WillRepeatedly(testing::Invoke(
155 [](const std::map<int, SdpAudioFormat>& codecs) {
156 EXPECT_THAT(codecs, testing::IsEmpty());
157 }));
ossuc3d4b482017-05-23 06:07:11 -0700158 EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
159 .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
solenberg7602aab2016-11-14 11:30:07 -0800160 // If being called for the send channel, save a pointer to the channel
161 // proxy for later.
162 if (channel_id == kRecvChannelId) {
163 EXPECT_FALSE(recv_channel_proxy);
164 recv_channel_proxy = channel_proxy;
165 }
166 return channel_proxy;
167 }));
168
169 AudioReceiveStream::Config recv_config;
170 recv_config.rtp.remote_ssrc = 42;
171 recv_config.rtp.local_ssrc = 777;
172 recv_config.voe_channel_id = kRecvChannelId;
173 recv_config.decoder_factory = decoder_factory;
174 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
175 EXPECT_NE(recv_stream, nullptr);
176
177 EXPECT_CALL(*recv_channel_proxy, AssociateSendChannel(testing::_)).Times(1);
178 AudioSendStream::Config send_config(nullptr);
179 send_config.rtp.ssrc = 777;
180 send_config.voe_channel_id = 123;
181 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
182 EXPECT_NE(send_stream, nullptr);
183
184 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
185 call->DestroyAudioSendStream(send_stream);
186
187 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
188 call->DestroyAudioReceiveStream(recv_stream);
189}
190
191TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
192 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
193 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
194 CallHelper call(decoder_factory);
ossuc3d4b482017-05-23 06:07:11 -0700195 ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
solenberg7602aab2016-11-14 11:30:07 -0800196
197 constexpr int kRecvChannelId = 101;
198
199 // Set up the mock to create a channel proxy which we know of, so that we can
200 // add our expectations to it.
201 test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
202 EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
203 .WillRepeatedly(testing::Invoke([&](int channel_id) {
204 test::MockVoEChannelProxy* channel_proxy =
205 new testing::NiceMock<test::MockVoEChannelProxy>();
206 EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
207 .WillRepeatedly(testing::ReturnRef(decoder_factory));
kwiberg1c07c702017-03-27 07:15:49 -0700208 EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
209 .WillRepeatedly(testing::Invoke(
210 [](const std::map<int, SdpAudioFormat>& codecs) {
211 EXPECT_THAT(codecs, testing::IsEmpty());
212 }));
ossuc3d4b482017-05-23 06:07:11 -0700213 EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
214 .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
solenberg7602aab2016-11-14 11:30:07 -0800215 // If being called for the send channel, save a pointer to the channel
216 // proxy for later.
217 if (channel_id == kRecvChannelId) {
218 EXPECT_FALSE(recv_channel_proxy);
219 recv_channel_proxy = channel_proxy;
220 // We need to set this expectation here since the channel proxy is
221 // created as a side effect of CreateAudioReceiveStream().
222 EXPECT_CALL(*recv_channel_proxy,
223 AssociateSendChannel(testing::_)).Times(1);
224 }
225 return channel_proxy;
226 }));
227
228 AudioSendStream::Config send_config(nullptr);
229 send_config.rtp.ssrc = 777;
230 send_config.voe_channel_id = 123;
231 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
232 EXPECT_NE(send_stream, nullptr);
233
234 AudioReceiveStream::Config recv_config;
235 recv_config.rtp.remote_ssrc = 42;
236 recv_config.rtp.local_ssrc = 777;
237 recv_config.voe_channel_id = kRecvChannelId;
238 recv_config.decoder_factory = decoder_factory;
239 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
240 EXPECT_NE(recv_stream, nullptr);
241
242 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
243 call->DestroyAudioReceiveStream(recv_stream);
244
245 call->DestroyAudioSendStream(send_stream);
246}
247
brandtr25445d32016-10-23 23:37:14 -0700248TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
249 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800250 MockTransport rtcp_send_transport;
251 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800252 config.payload_type = 118;
253 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700254 config.protected_media_ssrcs = {27273};
255
256 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
257 EXPECT_NE(stream, nullptr);
258 call->DestroyFlexfecReceiveStream(stream);
259}
260
261TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
262 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800263 MockTransport rtcp_send_transport;
264 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800265 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700266 std::list<FlexfecReceiveStream*> streams;
267
268 for (int i = 0; i < 2; ++i) {
269 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800270 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700271 config.protected_media_ssrcs = {ssrc + 1};
272 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
273 EXPECT_NE(stream, nullptr);
274 if (ssrc & 1) {
275 streams.push_back(stream);
276 } else {
277 streams.push_front(stream);
278 }
279 }
280 for (auto s : streams) {
281 call->DestroyFlexfecReceiveStream(s);
282 }
283 streams.clear();
284 }
285}
286
287TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
288 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800289 MockTransport rtcp_send_transport;
290 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800291 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700292 config.protected_media_ssrcs = {1324234};
293 FlexfecReceiveStream* stream;
294 std::list<FlexfecReceiveStream*> streams;
295
brandtr1cfbd602016-12-08 04:17:53 -0800296 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700297 stream = call->CreateFlexfecReceiveStream(config);
298 EXPECT_NE(stream, nullptr);
299 streams.push_back(stream);
300
brandtr1cfbd602016-12-08 04:17:53 -0800301 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700302 stream = call->CreateFlexfecReceiveStream(config);
303 EXPECT_NE(stream, nullptr);
304 streams.push_back(stream);
305
brandtr1cfbd602016-12-08 04:17:53 -0800306 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700307 stream = call->CreateFlexfecReceiveStream(config);
308 EXPECT_NE(stream, nullptr);
309 streams.push_back(stream);
310
brandtr1cfbd602016-12-08 04:17:53 -0800311 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700312 stream = call->CreateFlexfecReceiveStream(config);
313 EXPECT_NE(stream, nullptr);
314 streams.push_back(stream);
315
316 for (auto s : streams) {
317 call->DestroyFlexfecReceiveStream(s);
318 }
319}
320
zstein8c96a142017-05-17 11:49:12 -0700321namespace {
322struct CallBitrateHelper {
zstein4b979802017-06-02 14:37:37 -0700323 CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {}
zstein7cb69d52017-05-08 11:52:38 -0700324
zstein4b979802017-06-02 14:37:37 -0700325 explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config)
326 : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &packet_router_) {
327 Call::Config config(&event_log_);
328 config.bitrate_config = bitrate_config;
329 call_.reset(
330 Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>(
331 &packet_router_, &mock_cc_)));
332 }
zstein8c96a142017-05-17 11:49:12 -0700333
334 webrtc::Call* operator->() { return call_.get(); }
335 testing::NiceMock<test::MockSendSideCongestionController>& mock_cc() {
336 return mock_cc_;
337 }
338
339 private:
340 webrtc::RtcEventLogNullImpl event_log_;
341 PacketRouter packet_router_;
342 testing::NiceMock<test::MockSendSideCongestionController> mock_cc_;
343 std::unique_ptr<Call> call_;
344};
345} // namespace
346
347TEST(CallBitrateTest, SetBitrateConfigWithValidConfigCallsSetBweBitrates) {
348 CallBitrateHelper call;
zstein7cb69d52017-05-08 11:52:38 -0700349
350 Call::Config::BitrateConfig bitrate_config;
351 bitrate_config.min_bitrate_bps = 1;
352 bitrate_config.start_bitrate_bps = 2;
353 bitrate_config.max_bitrate_bps = 3;
354
zstein8c96a142017-05-17 11:49:12 -0700355 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3));
356 call->SetBitrateConfig(bitrate_config);
357}
358
359TEST(CallBitrateTest, SetBitrateConfigWithDifferentMinCallsSetBweBitrates) {
360 CallBitrateHelper call;
361
362 Call::Config::BitrateConfig bitrate_config;
363 bitrate_config.min_bitrate_bps = 10;
364 bitrate_config.start_bitrate_bps = 20;
365 bitrate_config.max_bitrate_bps = 30;
366 call->SetBitrateConfig(bitrate_config);
367
368 bitrate_config.min_bitrate_bps = 11;
zstein4b979802017-06-02 14:37:37 -0700369 EXPECT_CALL(call.mock_cc(), SetBweBitrates(11, -1, 30));
zstein8c96a142017-05-17 11:49:12 -0700370 call->SetBitrateConfig(bitrate_config);
371}
372
373TEST(CallBitrateTest, SetBitrateConfigWithDifferentStartCallsSetBweBitrates) {
374 CallBitrateHelper call;
375
376 Call::Config::BitrateConfig bitrate_config;
377 bitrate_config.min_bitrate_bps = 10;
378 bitrate_config.start_bitrate_bps = 20;
379 bitrate_config.max_bitrate_bps = 30;
380 call->SetBitrateConfig(bitrate_config);
381
382 bitrate_config.start_bitrate_bps = 21;
383 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 21, 30));
384 call->SetBitrateConfig(bitrate_config);
385}
386
387TEST(CallBitrateTest, SetBitrateConfigWithDifferentMaxCallsSetBweBitrates) {
388 CallBitrateHelper call;
389
390 Call::Config::BitrateConfig bitrate_config;
391 bitrate_config.min_bitrate_bps = 10;
392 bitrate_config.start_bitrate_bps = 20;
393 bitrate_config.max_bitrate_bps = 30;
394 call->SetBitrateConfig(bitrate_config);
395
396 bitrate_config.max_bitrate_bps = 31;
zstein4b979802017-06-02 14:37:37 -0700397 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, -1, 31));
zstein8c96a142017-05-17 11:49:12 -0700398 call->SetBitrateConfig(bitrate_config);
399}
400
401TEST(CallBitrateTest, SetBitrateConfigWithSameConfigElidesSecondCall) {
402 CallBitrateHelper call;
zstein8c96a142017-05-17 11:49:12 -0700403 Call::Config::BitrateConfig bitrate_config;
404 bitrate_config.min_bitrate_bps = 1;
405 bitrate_config.start_bitrate_bps = 2;
406 bitrate_config.max_bitrate_bps = 3;
407
408 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
409 call->SetBitrateConfig(bitrate_config);
410 call->SetBitrateConfig(bitrate_config);
411}
412
413TEST(CallBitrateTest,
414 SetBitrateConfigWithSameMinMaxAndNegativeStartElidesSecondCall) {
415 CallBitrateHelper call;
416
417 Call::Config::BitrateConfig bitrate_config;
418 bitrate_config.min_bitrate_bps = 1;
419 bitrate_config.start_bitrate_bps = 2;
420 bitrate_config.max_bitrate_bps = 3;
421
422 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
423 call->SetBitrateConfig(bitrate_config);
424
425 bitrate_config.start_bitrate_bps = -1;
zstein7cb69d52017-05-08 11:52:38 -0700426 call->SetBitrateConfig(bitrate_config);
427}
428
ossuc3d4b482017-05-23 06:07:11 -0700429TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
430 constexpr uint32_t kSSRC = 12345;
431 testing::NiceMock<test::MockAudioDeviceModule> mock_adm;
432 // Reply with a 10ms timer every time TimeUntilNextProcess is called to
433 // avoid entering a tight loop on the process thread.
434 EXPECT_CALL(mock_adm, TimeUntilNextProcess())
435 .WillRepeatedly(testing::Return(10));
436 rtc::scoped_refptr<test::MockAudioMixer> mock_mixer(
437 new rtc::RefCountedObject<test::MockAudioMixer>);
438
439 // There's similar functionality in cricket::VoEWrapper but it's not reachable
440 // from here. Since we're working on removing VoE interfaces, I doubt it's
441 // worth making VoEWrapper more easily available.
442 struct ScopedVoiceEngine {
443 ScopedVoiceEngine()
444 : voe(VoiceEngine::Create()),
445 base(VoEBase::GetInterface(voe)) {}
446 ~ScopedVoiceEngine() {
447 base->Release();
448 EXPECT_TRUE(VoiceEngine::Delete(voe));
449 }
450
451 VoiceEngine* voe;
452 VoEBase* base;
453 };
454 ScopedVoiceEngine voice_engine;
455
ossuc3d4b482017-05-23 06:07:11 -0700456 AudioState::Config audio_state_config;
457 audio_state_config.voice_engine = voice_engine.voe;
458 audio_state_config.audio_mixer = mock_mixer;
peaha9cc40b2017-06-29 08:32:09 -0700459 audio_state_config.audio_processing = AudioProcessing::Create();
460 voice_engine.base->Init(&mock_adm, audio_state_config.audio_processing.get());
ossuc3d4b482017-05-23 06:07:11 -0700461 auto audio_state = AudioState::Create(audio_state_config);
peaha9cc40b2017-06-29 08:32:09 -0700462
ossuc3d4b482017-05-23 06:07:11 -0700463 RtcEventLogNullImpl event_log;
464 Call::Config call_config(&event_log);
465 call_config.audio_state = audio_state;
466 std::unique_ptr<Call> call(Call::Create(call_config));
467
468 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
469 AudioSendStream::Config config(nullptr);
470 config.rtp.ssrc = ssrc;
471 config.voe_channel_id = voice_engine.base->CreateChannel();
472 AudioSendStream* stream = call->CreateAudioSendStream(config);
473 VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine.voe);
474 auto channel_proxy = voe_impl->GetChannelProxy(config.voe_channel_id);
475 RtpRtcp* rtp_rtcp = nullptr;
476 RtpReceiver* rtp_receiver = nullptr; // Unused but required for call.
477 channel_proxy->GetRtpRtcp(&rtp_rtcp, &rtp_receiver);
478 const RtpState rtp_state = rtp_rtcp->GetRtpState();
479 call->DestroyAudioSendStream(stream);
480 voice_engine.base->DeleteChannel(config.voe_channel_id);
481 return rtp_state;
482 };
483
484 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
485 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
486
487 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
488 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
489 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
490 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
491 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
492 rtp_state2.last_timestamp_time_ms);
493 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
494}
zstein4b979802017-06-02 14:37:37 -0700495TEST(CallBitrateTest, BiggerMaskMinUsed) {
496 CallBitrateHelper call;
497 Call::Config::BitrateConfigMask mask;
498 mask.min_bitrate_bps = rtc::Optional<int>(1234);
499
500 EXPECT_CALL(call.mock_cc(),
501 SetBweBitrates(*mask.min_bitrate_bps, testing::_, testing::_));
502 call->SetBitrateConfigMask(mask);
503}
504
505TEST(CallBitrateTest, BiggerConfigMinUsed) {
506 CallBitrateHelper call;
507 Call::Config::BitrateConfigMask mask;
508 mask.min_bitrate_bps = rtc::Optional<int>(1000);
509 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, testing::_));
510 call->SetBitrateConfigMask(mask);
511
512 Call::Config::BitrateConfig config;
513 config.min_bitrate_bps = 1234;
514
515 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1234, testing::_, testing::_));
516 call->SetBitrateConfig(config);
517}
518
519// The last call to set start should be used.
520TEST(CallBitrateTest, LatestStartMaskPreferred) {
521 CallBitrateHelper call;
522 Call::Config::BitrateConfigMask mask;
523 mask.start_bitrate_bps = rtc::Optional<int>(1300);
524
525 EXPECT_CALL(call.mock_cc(),
526 SetBweBitrates(testing::_, *mask.start_bitrate_bps, testing::_));
527 call->SetBitrateConfigMask(mask);
528
529 Call::Config::BitrateConfig bitrate_config;
530 bitrate_config.start_bitrate_bps = 1200;
531
532 EXPECT_CALL(
533 call.mock_cc(),
534 SetBweBitrates(testing::_, bitrate_config.start_bitrate_bps, testing::_));
535 call->SetBitrateConfig(bitrate_config);
536}
537
538TEST(CallBitrateTest, SmallerMaskMaxUsed) {
539 Call::Config::BitrateConfig bitrate_config;
540 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 2000;
541 CallBitrateHelper call(bitrate_config);
542
543 Call::Config::BitrateConfigMask mask;
544 mask.max_bitrate_bps =
545 rtc::Optional<int>(bitrate_config.start_bitrate_bps + 1000);
546
547 EXPECT_CALL(call.mock_cc(),
548 SetBweBitrates(testing::_, testing::_, *mask.max_bitrate_bps));
549 call->SetBitrateConfigMask(mask);
550}
551
552TEST(CallBitrateTest, SmallerConfigMaxUsed) {
553 Call::Config::BitrateConfig bitrate_config;
554 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 1000;
555 CallBitrateHelper call(bitrate_config);
556
557 Call::Config::BitrateConfigMask mask;
558 mask.max_bitrate_bps =
559 rtc::Optional<int>(bitrate_config.start_bitrate_bps + 2000);
560
561 // Expect no calls because nothing changes
562 EXPECT_CALL(call.mock_cc(),
563 SetBweBitrates(testing::_, testing::_, testing::_))
564 .Times(0);
565 call->SetBitrateConfigMask(mask);
566}
567
568TEST(CallBitrateTest, MaskStartLessThanConfigMinClamped) {
569 Call::Config::BitrateConfig bitrate_config;
570 bitrate_config.min_bitrate_bps = 2000;
571 CallBitrateHelper call(bitrate_config);
572
573 Call::Config::BitrateConfigMask mask;
574 mask.start_bitrate_bps = rtc::Optional<int>(1000);
575
576 EXPECT_CALL(call.mock_cc(), SetBweBitrates(2000, 2000, testing::_));
577 call->SetBitrateConfigMask(mask);
578}
579
580TEST(CallBitrateTest, MaskStartGreaterThanConfigMaxClamped) {
581 Call::Config::BitrateConfig bitrate_config;
582 bitrate_config.start_bitrate_bps = 2000;
583 CallBitrateHelper call(bitrate_config);
584
585 Call::Config::BitrateConfigMask mask;
586 mask.max_bitrate_bps = rtc::Optional<int>(1000);
587
588 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, -1, 1000));
589 call->SetBitrateConfigMask(mask);
590}
591
592TEST(CallBitrateTest, MaskMinGreaterThanConfigMaxClamped) {
593 Call::Config::BitrateConfig bitrate_config;
594 bitrate_config.min_bitrate_bps = 2000;
595 CallBitrateHelper call(bitrate_config);
596
597 Call::Config::BitrateConfigMask mask;
598 mask.max_bitrate_bps = rtc::Optional<int>(1000);
599
600 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, 1000));
601 call->SetBitrateConfigMask(mask);
602}
603
604TEST(CallBitrateTest, SettingMaskStartForcesUpdate) {
605 CallBitrateHelper call;
606
607 Call::Config::BitrateConfigMask mask;
608 mask.start_bitrate_bps = rtc::Optional<int>(1000);
609
610 // SetBweBitrates should be called twice with the same params since
611 // start_bitrate_bps is set.
612 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, 1000, testing::_))
613 .Times(2);
614 call->SetBitrateConfigMask(mask);
615 call->SetBitrateConfigMask(mask);
616}
617
618TEST(CallBitrateTest, SetBitrateConfigWithNoChangesDoesNotCallSetBweBitrates) {
619 CallBitrateHelper call;
620
621 Call::Config::BitrateConfig config1;
622 config1.min_bitrate_bps = 0;
623 config1.start_bitrate_bps = 1000;
624 config1.max_bitrate_bps = -1;
625
626 Call::Config::BitrateConfig config2;
627 config2.min_bitrate_bps = 0;
628 config2.start_bitrate_bps = -1;
629 config2.max_bitrate_bps = -1;
630
631 // The second call should not call SetBweBitrates because it doesn't
632 // change any values.
633 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
634 call->SetBitrateConfig(config1);
635 call->SetBitrateConfig(config2);
636}
637
638// If SetBitrateConfig changes the max, but not the effective max,
639// SetBweBitrates shouldn't be called, to avoid unnecessary encoder
640// reconfigurations.
641TEST(CallBitrateTest, SetBweBitratesNotCalledWhenEffectiveMaxUnchanged) {
642 CallBitrateHelper call;
643
644 Call::Config::BitrateConfig config;
645 config.min_bitrate_bps = 0;
646 config.start_bitrate_bps = -1;
647 config.max_bitrate_bps = 2000;
648 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 2000));
649 call->SetBitrateConfig(config);
650
651 // Reduce effective max to 1000 with the mask.
652 Call::Config::BitrateConfigMask mask;
653 mask.max_bitrate_bps = rtc::Optional<int>(1000);
654 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 1000));
655 call->SetBitrateConfigMask(mask);
656
657 // This leaves the effective max unchanged, so SetBweBitrates shouldn't be
658 // called again.
659 config.max_bitrate_bps = 1000;
660 call->SetBitrateConfig(config);
661}
662
663// When the "start bitrate" mask is removed, SetBweBitrates shouldn't be called
664// again, since nothing's changing.
665TEST(CallBitrateTest, SetBweBitratesNotCalledWhenStartMaskRemoved) {
666 CallBitrateHelper call;
667
668 Call::Config::BitrateConfigMask mask;
669 mask.start_bitrate_bps = rtc::Optional<int>(1000);
670 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
671 call->SetBitrateConfigMask(mask);
672
673 mask.start_bitrate_bps.reset();
674 call->SetBitrateConfigMask(mask);
675}
676
677// Test that if SetBitrateConfig is called after SetBitrateConfigMask applies a
678// "start" value, the SetBitrateConfig call won't apply that start value a
679// second time.
680TEST(CallBitrateTest, SetBitrateConfigAfterSetBitrateConfigMaskWithStart) {
681 CallBitrateHelper call;
682
683 Call::Config::BitrateConfigMask mask;
684 mask.start_bitrate_bps = rtc::Optional<int>(1000);
685 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
686 call->SetBitrateConfigMask(mask);
687
688 Call::Config::BitrateConfig config;
689 config.min_bitrate_bps = 0;
690 config.start_bitrate_bps = -1;
691 config.max_bitrate_bps = 5000;
692 // The start value isn't changing, so SetBweBitrates should be called with
693 // -1.
694 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, -1, 5000));
695 call->SetBitrateConfig(config);
696}
697
698TEST(CallBitrateTest, SetBweBitratesNotCalledWhenClampedMinUnchanged) {
699 Call::Config::BitrateConfig bitrate_config;
700 bitrate_config.start_bitrate_bps = 500;
701 bitrate_config.max_bitrate_bps = 1000;
702 CallBitrateHelper call(bitrate_config);
703
704 // Set min to 2000; it is clamped to the max (1000).
705 Call::Config::BitrateConfigMask mask;
706 mask.min_bitrate_bps = rtc::Optional<int>(2000);
707 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, -1, 1000));
708 call->SetBitrateConfigMask(mask);
709
710 // Set min to 3000; the clamped value stays the same so nothing happens.
711 mask.min_bitrate_bps = rtc::Optional<int>(3000);
712 call->SetBitrateConfigMask(mask);
713}
ossuc3d4b482017-05-23 06:07:11 -0700714
solenbergc7a8b082015-10-16 14:35:07 -0700715} // namespace webrtc