blob: 75e5008846df468f0327e6dd243eab5b122ce824 [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"
sprangdb2a9fc2017-08-09 06:42:32 -070026#include "webrtc/test/fake_encoder.h"
kwibergac9f8762016-09-30 22:29:43 -070027#include "webrtc/test/gtest.h"
kwiberg37e99fd2017-04-10 05:15:48 -070028#include "webrtc/test/mock_audio_decoder_factory.h"
brandtr8313a6f2017-01-13 07:41:19 -080029#include "webrtc/test/mock_transport.h"
Fredrik Solenberg0ccae132015-11-03 10:15:49 +010030#include "webrtc/test/mock_voice_engine.h"
solenbergc7a8b082015-10-16 14:35:07 -070031
32namespace {
33
34struct CallHelper {
ossu29b1a8d2016-06-13 07:34:51 -070035 explicit CallHelper(
36 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory = nullptr)
37 : voice_engine_(decoder_factory) {
solenberg566ef242015-11-06 15:34:49 -080038 webrtc::AudioState::Config audio_state_config;
39 audio_state_config.voice_engine = &voice_engine_;
aleloi10111bc2016-11-17 06:48:48 -080040 audio_state_config.audio_mixer = webrtc::AudioMixerImpl::Create();
peaha9cc40b2017-06-29 08:32:09 -070041 audio_state_config.audio_processing = webrtc::AudioProcessing::Create();
aleloidd310712016-11-17 06:28:59 -080042 EXPECT_CALL(voice_engine_, audio_device_module());
aleloidd310712016-11-17 06:28:59 -080043 EXPECT_CALL(voice_engine_, audio_transport());
skvlad11a9cbf2016-10-07 11:53:05 -070044 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080045 config.audio_state = webrtc::AudioState::Create(audio_state_config);
solenbergc7a8b082015-10-16 14:35:07 -070046 call_.reset(webrtc::Call::Create(config));
47 }
48
49 webrtc::Call* operator->() { return call_.get(); }
solenberg7602aab2016-11-14 11:30:07 -080050 webrtc::test::MockVoiceEngine* voice_engine() { return &voice_engine_; }
solenbergc7a8b082015-10-16 14:35:07 -070051
52 private:
solenberg3a941542015-11-16 07:34:50 -080053 testing::NiceMock<webrtc::test::MockVoiceEngine> voice_engine_;
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;
69 config.voe_channel_id = 123;
70 AudioSendStream* stream = call->CreateAudioSendStream(config);
71 EXPECT_NE(stream, nullptr);
72 call->DestroyAudioSendStream(stream);
73}
74
75TEST(CallTest, CreateDestroy_AudioReceiveStream) {
ossu29b1a8d2016-06-13 07:34:51 -070076 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
77 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
78 CallHelper call(decoder_factory);
solenbergc7a8b082015-10-16 14:35:07 -070079 AudioReceiveStream::Config config;
80 config.rtp.remote_ssrc = 42;
81 config.voe_channel_id = 123;
ossu29b1a8d2016-06-13 07:34:51 -070082 config.decoder_factory = decoder_factory;
solenbergc7a8b082015-10-16 14:35:07 -070083 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
84 EXPECT_NE(stream, nullptr);
85 call->DestroyAudioReceiveStream(stream);
86}
87
88TEST(CallTest, CreateDestroy_AudioSendStreams) {
89 CallHelper call;
90 AudioSendStream::Config config(nullptr);
91 config.voe_channel_id = 123;
92 std::list<AudioSendStream*> streams;
93 for (int i = 0; i < 2; ++i) {
94 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
95 config.rtp.ssrc = ssrc;
96 AudioSendStream* stream = call->CreateAudioSendStream(config);
97 EXPECT_NE(stream, nullptr);
98 if (ssrc & 1) {
99 streams.push_back(stream);
100 } else {
101 streams.push_front(stream);
102 }
103 }
104 for (auto s : streams) {
105 call->DestroyAudioSendStream(s);
106 }
107 streams.clear();
108 }
109}
110
111TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
ossu29b1a8d2016-06-13 07:34:51 -0700112 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
113 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
114 CallHelper call(decoder_factory);
solenbergc7a8b082015-10-16 14:35:07 -0700115 AudioReceiveStream::Config config;
116 config.voe_channel_id = 123;
ossu29b1a8d2016-06-13 07:34:51 -0700117 config.decoder_factory = decoder_factory;
solenbergc7a8b082015-10-16 14:35:07 -0700118 std::list<AudioReceiveStream*> streams;
119 for (int i = 0; i < 2; ++i) {
120 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
121 config.rtp.remote_ssrc = ssrc;
122 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
123 EXPECT_NE(stream, nullptr);
124 if (ssrc & 1) {
125 streams.push_back(stream);
126 } else {
127 streams.push_front(stream);
128 }
129 }
130 for (auto s : streams) {
131 call->DestroyAudioReceiveStream(s);
132 }
133 streams.clear();
134 }
135}
brandtr25445d32016-10-23 23:37:14 -0700136
solenberg7602aab2016-11-14 11:30:07 -0800137TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
138 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
139 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
140 CallHelper call(decoder_factory);
ossuc3d4b482017-05-23 06:07:11 -0700141 ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
solenberg7602aab2016-11-14 11:30:07 -0800142
143 constexpr int kRecvChannelId = 101;
144
145 // Set up the mock to create a channel proxy which we know of, so that we can
146 // add our expectations to it.
147 test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
148 EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
149 .WillRepeatedly(testing::Invoke([&](int channel_id) {
150 test::MockVoEChannelProxy* channel_proxy =
151 new testing::NiceMock<test::MockVoEChannelProxy>();
152 EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
153 .WillRepeatedly(testing::ReturnRef(decoder_factory));
kwiberg1c07c702017-03-27 07:15:49 -0700154 EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
155 .WillRepeatedly(testing::Invoke(
156 [](const std::map<int, SdpAudioFormat>& codecs) {
157 EXPECT_THAT(codecs, testing::IsEmpty());
158 }));
ossuc3d4b482017-05-23 06:07:11 -0700159 EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
160 .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
solenberg7602aab2016-11-14 11:30:07 -0800161 // If being called for the send channel, save a pointer to the channel
162 // proxy for later.
163 if (channel_id == kRecvChannelId) {
164 EXPECT_FALSE(recv_channel_proxy);
165 recv_channel_proxy = channel_proxy;
166 }
167 return channel_proxy;
168 }));
169
170 AudioReceiveStream::Config recv_config;
171 recv_config.rtp.remote_ssrc = 42;
172 recv_config.rtp.local_ssrc = 777;
173 recv_config.voe_channel_id = kRecvChannelId;
174 recv_config.decoder_factory = decoder_factory;
175 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
176 EXPECT_NE(recv_stream, nullptr);
177
178 EXPECT_CALL(*recv_channel_proxy, AssociateSendChannel(testing::_)).Times(1);
179 AudioSendStream::Config send_config(nullptr);
180 send_config.rtp.ssrc = 777;
181 send_config.voe_channel_id = 123;
182 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
183 EXPECT_NE(send_stream, nullptr);
184
185 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
186 call->DestroyAudioSendStream(send_stream);
187
188 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
189 call->DestroyAudioReceiveStream(recv_stream);
190}
191
192TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
193 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
194 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
195 CallHelper call(decoder_factory);
ossuc3d4b482017-05-23 06:07:11 -0700196 ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
solenberg7602aab2016-11-14 11:30:07 -0800197
198 constexpr int kRecvChannelId = 101;
199
200 // Set up the mock to create a channel proxy which we know of, so that we can
201 // add our expectations to it.
202 test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
203 EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
204 .WillRepeatedly(testing::Invoke([&](int channel_id) {
205 test::MockVoEChannelProxy* channel_proxy =
206 new testing::NiceMock<test::MockVoEChannelProxy>();
207 EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
208 .WillRepeatedly(testing::ReturnRef(decoder_factory));
kwiberg1c07c702017-03-27 07:15:49 -0700209 EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
210 .WillRepeatedly(testing::Invoke(
211 [](const std::map<int, SdpAudioFormat>& codecs) {
212 EXPECT_THAT(codecs, testing::IsEmpty());
213 }));
ossuc3d4b482017-05-23 06:07:11 -0700214 EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
215 .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
solenberg7602aab2016-11-14 11:30:07 -0800216 // If being called for the send channel, save a pointer to the channel
217 // proxy for later.
218 if (channel_id == kRecvChannelId) {
219 EXPECT_FALSE(recv_channel_proxy);
220 recv_channel_proxy = channel_proxy;
221 // We need to set this expectation here since the channel proxy is
222 // created as a side effect of CreateAudioReceiveStream().
223 EXPECT_CALL(*recv_channel_proxy,
224 AssociateSendChannel(testing::_)).Times(1);
225 }
226 return channel_proxy;
227 }));
228
229 AudioSendStream::Config send_config(nullptr);
230 send_config.rtp.ssrc = 777;
231 send_config.voe_channel_id = 123;
232 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
233 EXPECT_NE(send_stream, nullptr);
234
235 AudioReceiveStream::Config recv_config;
236 recv_config.rtp.remote_ssrc = 42;
237 recv_config.rtp.local_ssrc = 777;
238 recv_config.voe_channel_id = kRecvChannelId;
239 recv_config.decoder_factory = decoder_factory;
240 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
241 EXPECT_NE(recv_stream, nullptr);
242
243 EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
244 call->DestroyAudioReceiveStream(recv_stream);
245
246 call->DestroyAudioSendStream(send_stream);
247}
248
brandtr25445d32016-10-23 23:37:14 -0700249TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
250 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800251 MockTransport rtcp_send_transport;
252 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800253 config.payload_type = 118;
254 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700255 config.protected_media_ssrcs = {27273};
256
257 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
258 EXPECT_NE(stream, nullptr);
259 call->DestroyFlexfecReceiveStream(stream);
260}
261
262TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
263 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800264 MockTransport rtcp_send_transport;
265 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800266 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700267 std::list<FlexfecReceiveStream*> streams;
268
269 for (int i = 0; i < 2; ++i) {
270 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800271 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700272 config.protected_media_ssrcs = {ssrc + 1};
273 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
274 EXPECT_NE(stream, nullptr);
275 if (ssrc & 1) {
276 streams.push_back(stream);
277 } else {
278 streams.push_front(stream);
279 }
280 }
281 for (auto s : streams) {
282 call->DestroyFlexfecReceiveStream(s);
283 }
284 streams.clear();
285 }
286}
287
288TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
289 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800290 MockTransport rtcp_send_transport;
291 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800292 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700293 config.protected_media_ssrcs = {1324234};
294 FlexfecReceiveStream* stream;
295 std::list<FlexfecReceiveStream*> streams;
296
brandtr1cfbd602016-12-08 04:17:53 -0800297 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700298 stream = call->CreateFlexfecReceiveStream(config);
299 EXPECT_NE(stream, nullptr);
300 streams.push_back(stream);
301
brandtr1cfbd602016-12-08 04:17:53 -0800302 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700303 stream = call->CreateFlexfecReceiveStream(config);
304 EXPECT_NE(stream, nullptr);
305 streams.push_back(stream);
306
brandtr1cfbd602016-12-08 04:17:53 -0800307 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700308 stream = call->CreateFlexfecReceiveStream(config);
309 EXPECT_NE(stream, nullptr);
310 streams.push_back(stream);
311
brandtr1cfbd602016-12-08 04:17:53 -0800312 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700313 stream = call->CreateFlexfecReceiveStream(config);
314 EXPECT_NE(stream, nullptr);
315 streams.push_back(stream);
316
317 for (auto s : streams) {
318 call->DestroyFlexfecReceiveStream(s);
319 }
320}
321
zstein8c96a142017-05-17 11:49:12 -0700322namespace {
323struct CallBitrateHelper {
zstein4b979802017-06-02 14:37:37 -0700324 CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {}
zstein7cb69d52017-05-08 11:52:38 -0700325
zstein4b979802017-06-02 14:37:37 -0700326 explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config)
327 : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &packet_router_) {
328 Call::Config config(&event_log_);
329 config.bitrate_config = bitrate_config;
330 call_.reset(
331 Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>(
332 &packet_router_, &mock_cc_)));
333 }
zstein8c96a142017-05-17 11:49:12 -0700334
335 webrtc::Call* operator->() { return call_.get(); }
336 testing::NiceMock<test::MockSendSideCongestionController>& mock_cc() {
337 return mock_cc_;
338 }
339
340 private:
341 webrtc::RtcEventLogNullImpl event_log_;
342 PacketRouter packet_router_;
343 testing::NiceMock<test::MockSendSideCongestionController> mock_cc_;
344 std::unique_ptr<Call> call_;
345};
346} // namespace
347
348TEST(CallBitrateTest, SetBitrateConfigWithValidConfigCallsSetBweBitrates) {
349 CallBitrateHelper call;
zstein7cb69d52017-05-08 11:52:38 -0700350
351 Call::Config::BitrateConfig bitrate_config;
352 bitrate_config.min_bitrate_bps = 1;
353 bitrate_config.start_bitrate_bps = 2;
354 bitrate_config.max_bitrate_bps = 3;
355
zstein8c96a142017-05-17 11:49:12 -0700356 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3));
357 call->SetBitrateConfig(bitrate_config);
358}
359
360TEST(CallBitrateTest, SetBitrateConfigWithDifferentMinCallsSetBweBitrates) {
361 CallBitrateHelper call;
362
363 Call::Config::BitrateConfig bitrate_config;
364 bitrate_config.min_bitrate_bps = 10;
365 bitrate_config.start_bitrate_bps = 20;
366 bitrate_config.max_bitrate_bps = 30;
367 call->SetBitrateConfig(bitrate_config);
368
369 bitrate_config.min_bitrate_bps = 11;
zstein4b979802017-06-02 14:37:37 -0700370 EXPECT_CALL(call.mock_cc(), SetBweBitrates(11, -1, 30));
zstein8c96a142017-05-17 11:49:12 -0700371 call->SetBitrateConfig(bitrate_config);
372}
373
374TEST(CallBitrateTest, SetBitrateConfigWithDifferentStartCallsSetBweBitrates) {
375 CallBitrateHelper call;
376
377 Call::Config::BitrateConfig bitrate_config;
378 bitrate_config.min_bitrate_bps = 10;
379 bitrate_config.start_bitrate_bps = 20;
380 bitrate_config.max_bitrate_bps = 30;
381 call->SetBitrateConfig(bitrate_config);
382
383 bitrate_config.start_bitrate_bps = 21;
384 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 21, 30));
385 call->SetBitrateConfig(bitrate_config);
386}
387
388TEST(CallBitrateTest, SetBitrateConfigWithDifferentMaxCallsSetBweBitrates) {
389 CallBitrateHelper call;
390
391 Call::Config::BitrateConfig bitrate_config;
392 bitrate_config.min_bitrate_bps = 10;
393 bitrate_config.start_bitrate_bps = 20;
394 bitrate_config.max_bitrate_bps = 30;
395 call->SetBitrateConfig(bitrate_config);
396
397 bitrate_config.max_bitrate_bps = 31;
zstein4b979802017-06-02 14:37:37 -0700398 EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, -1, 31));
zstein8c96a142017-05-17 11:49:12 -0700399 call->SetBitrateConfig(bitrate_config);
400}
401
402TEST(CallBitrateTest, SetBitrateConfigWithSameConfigElidesSecondCall) {
403 CallBitrateHelper call;
zstein8c96a142017-05-17 11:49:12 -0700404 Call::Config::BitrateConfig bitrate_config;
405 bitrate_config.min_bitrate_bps = 1;
406 bitrate_config.start_bitrate_bps = 2;
407 bitrate_config.max_bitrate_bps = 3;
408
409 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
410 call->SetBitrateConfig(bitrate_config);
411 call->SetBitrateConfig(bitrate_config);
412}
413
414TEST(CallBitrateTest,
415 SetBitrateConfigWithSameMinMaxAndNegativeStartElidesSecondCall) {
416 CallBitrateHelper call;
417
418 Call::Config::BitrateConfig bitrate_config;
419 bitrate_config.min_bitrate_bps = 1;
420 bitrate_config.start_bitrate_bps = 2;
421 bitrate_config.max_bitrate_bps = 3;
422
423 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
424 call->SetBitrateConfig(bitrate_config);
425
426 bitrate_config.start_bitrate_bps = -1;
zstein7cb69d52017-05-08 11:52:38 -0700427 call->SetBitrateConfig(bitrate_config);
428}
429
ossuc3d4b482017-05-23 06:07:11 -0700430TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
431 constexpr uint32_t kSSRC = 12345;
432 testing::NiceMock<test::MockAudioDeviceModule> mock_adm;
433 // Reply with a 10ms timer every time TimeUntilNextProcess is called to
434 // avoid entering a tight loop on the process thread.
435 EXPECT_CALL(mock_adm, TimeUntilNextProcess())
436 .WillRepeatedly(testing::Return(10));
437 rtc::scoped_refptr<test::MockAudioMixer> mock_mixer(
438 new rtc::RefCountedObject<test::MockAudioMixer>);
439
440 // There's similar functionality in cricket::VoEWrapper but it's not reachable
441 // from here. Since we're working on removing VoE interfaces, I doubt it's
442 // worth making VoEWrapper more easily available.
443 struct ScopedVoiceEngine {
444 ScopedVoiceEngine()
445 : voe(VoiceEngine::Create()),
446 base(VoEBase::GetInterface(voe)) {}
447 ~ScopedVoiceEngine() {
448 base->Release();
449 EXPECT_TRUE(VoiceEngine::Delete(voe));
450 }
451
452 VoiceEngine* voe;
453 VoEBase* base;
454 };
455 ScopedVoiceEngine voice_engine;
456
ossuc3d4b482017-05-23 06:07:11 -0700457 AudioState::Config audio_state_config;
458 audio_state_config.voice_engine = voice_engine.voe;
459 audio_state_config.audio_mixer = mock_mixer;
peaha9cc40b2017-06-29 08:32:09 -0700460 audio_state_config.audio_processing = AudioProcessing::Create();
461 voice_engine.base->Init(&mock_adm, audio_state_config.audio_processing.get());
ossuc3d4b482017-05-23 06:07:11 -0700462 auto audio_state = AudioState::Create(audio_state_config);
peaha9cc40b2017-06-29 08:32:09 -0700463
ossuc3d4b482017-05-23 06:07:11 -0700464 RtcEventLogNullImpl event_log;
465 Call::Config call_config(&event_log);
466 call_config.audio_state = audio_state;
467 std::unique_ptr<Call> call(Call::Create(call_config));
468
469 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
470 AudioSendStream::Config config(nullptr);
471 config.rtp.ssrc = ssrc;
472 config.voe_channel_id = voice_engine.base->CreateChannel();
473 AudioSendStream* stream = call->CreateAudioSendStream(config);
474 VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine.voe);
475 auto channel_proxy = voe_impl->GetChannelProxy(config.voe_channel_id);
476 RtpRtcp* rtp_rtcp = nullptr;
477 RtpReceiver* rtp_receiver = nullptr; // Unused but required for call.
478 channel_proxy->GetRtpRtcp(&rtp_rtcp, &rtp_receiver);
479 const RtpState rtp_state = rtp_rtcp->GetRtpState();
480 call->DestroyAudioSendStream(stream);
481 voice_engine.base->DeleteChannel(config.voe_channel_id);
482 return rtp_state;
483 };
484
485 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
486 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
487
488 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
489 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
490 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
491 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
492 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
493 rtp_state2.last_timestamp_time_ms);
494 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
495}
zstein4b979802017-06-02 14:37:37 -0700496TEST(CallBitrateTest, BiggerMaskMinUsed) {
497 CallBitrateHelper call;
498 Call::Config::BitrateConfigMask mask;
499 mask.min_bitrate_bps = rtc::Optional<int>(1234);
500
501 EXPECT_CALL(call.mock_cc(),
502 SetBweBitrates(*mask.min_bitrate_bps, testing::_, testing::_));
503 call->SetBitrateConfigMask(mask);
504}
505
506TEST(CallBitrateTest, BiggerConfigMinUsed) {
507 CallBitrateHelper call;
508 Call::Config::BitrateConfigMask mask;
509 mask.min_bitrate_bps = rtc::Optional<int>(1000);
510 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, testing::_));
511 call->SetBitrateConfigMask(mask);
512
513 Call::Config::BitrateConfig config;
514 config.min_bitrate_bps = 1234;
515
516 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1234, testing::_, testing::_));
517 call->SetBitrateConfig(config);
518}
519
520// The last call to set start should be used.
521TEST(CallBitrateTest, LatestStartMaskPreferred) {
522 CallBitrateHelper call;
523 Call::Config::BitrateConfigMask mask;
524 mask.start_bitrate_bps = rtc::Optional<int>(1300);
525
526 EXPECT_CALL(call.mock_cc(),
527 SetBweBitrates(testing::_, *mask.start_bitrate_bps, testing::_));
528 call->SetBitrateConfigMask(mask);
529
530 Call::Config::BitrateConfig bitrate_config;
531 bitrate_config.start_bitrate_bps = 1200;
532
533 EXPECT_CALL(
534 call.mock_cc(),
535 SetBweBitrates(testing::_, bitrate_config.start_bitrate_bps, testing::_));
536 call->SetBitrateConfig(bitrate_config);
537}
538
539TEST(CallBitrateTest, SmallerMaskMaxUsed) {
540 Call::Config::BitrateConfig bitrate_config;
541 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 2000;
542 CallBitrateHelper call(bitrate_config);
543
544 Call::Config::BitrateConfigMask mask;
545 mask.max_bitrate_bps =
546 rtc::Optional<int>(bitrate_config.start_bitrate_bps + 1000);
547
548 EXPECT_CALL(call.mock_cc(),
549 SetBweBitrates(testing::_, testing::_, *mask.max_bitrate_bps));
550 call->SetBitrateConfigMask(mask);
551}
552
553TEST(CallBitrateTest, SmallerConfigMaxUsed) {
554 Call::Config::BitrateConfig bitrate_config;
555 bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 1000;
556 CallBitrateHelper call(bitrate_config);
557
558 Call::Config::BitrateConfigMask mask;
559 mask.max_bitrate_bps =
560 rtc::Optional<int>(bitrate_config.start_bitrate_bps + 2000);
561
562 // Expect no calls because nothing changes
563 EXPECT_CALL(call.mock_cc(),
564 SetBweBitrates(testing::_, testing::_, testing::_))
565 .Times(0);
566 call->SetBitrateConfigMask(mask);
567}
568
569TEST(CallBitrateTest, MaskStartLessThanConfigMinClamped) {
570 Call::Config::BitrateConfig bitrate_config;
571 bitrate_config.min_bitrate_bps = 2000;
572 CallBitrateHelper call(bitrate_config);
573
574 Call::Config::BitrateConfigMask mask;
575 mask.start_bitrate_bps = rtc::Optional<int>(1000);
576
577 EXPECT_CALL(call.mock_cc(), SetBweBitrates(2000, 2000, testing::_));
578 call->SetBitrateConfigMask(mask);
579}
580
581TEST(CallBitrateTest, MaskStartGreaterThanConfigMaxClamped) {
582 Call::Config::BitrateConfig bitrate_config;
583 bitrate_config.start_bitrate_bps = 2000;
584 CallBitrateHelper call(bitrate_config);
585
586 Call::Config::BitrateConfigMask mask;
587 mask.max_bitrate_bps = rtc::Optional<int>(1000);
588
589 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, -1, 1000));
590 call->SetBitrateConfigMask(mask);
591}
592
593TEST(CallBitrateTest, MaskMinGreaterThanConfigMaxClamped) {
594 Call::Config::BitrateConfig bitrate_config;
595 bitrate_config.min_bitrate_bps = 2000;
596 CallBitrateHelper call(bitrate_config);
597
598 Call::Config::BitrateConfigMask mask;
599 mask.max_bitrate_bps = rtc::Optional<int>(1000);
600
601 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, 1000));
602 call->SetBitrateConfigMask(mask);
603}
604
605TEST(CallBitrateTest, SettingMaskStartForcesUpdate) {
606 CallBitrateHelper call;
607
608 Call::Config::BitrateConfigMask mask;
609 mask.start_bitrate_bps = rtc::Optional<int>(1000);
610
611 // SetBweBitrates should be called twice with the same params since
612 // start_bitrate_bps is set.
613 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, 1000, testing::_))
614 .Times(2);
615 call->SetBitrateConfigMask(mask);
616 call->SetBitrateConfigMask(mask);
617}
618
619TEST(CallBitrateTest, SetBitrateConfigWithNoChangesDoesNotCallSetBweBitrates) {
620 CallBitrateHelper call;
621
622 Call::Config::BitrateConfig config1;
623 config1.min_bitrate_bps = 0;
624 config1.start_bitrate_bps = 1000;
625 config1.max_bitrate_bps = -1;
626
627 Call::Config::BitrateConfig config2;
628 config2.min_bitrate_bps = 0;
629 config2.start_bitrate_bps = -1;
630 config2.max_bitrate_bps = -1;
631
632 // The second call should not call SetBweBitrates because it doesn't
633 // change any values.
634 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
635 call->SetBitrateConfig(config1);
636 call->SetBitrateConfig(config2);
637}
638
639// If SetBitrateConfig changes the max, but not the effective max,
640// SetBweBitrates shouldn't be called, to avoid unnecessary encoder
641// reconfigurations.
642TEST(CallBitrateTest, SetBweBitratesNotCalledWhenEffectiveMaxUnchanged) {
643 CallBitrateHelper call;
644
645 Call::Config::BitrateConfig config;
646 config.min_bitrate_bps = 0;
647 config.start_bitrate_bps = -1;
648 config.max_bitrate_bps = 2000;
649 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 2000));
650 call->SetBitrateConfig(config);
651
652 // Reduce effective max to 1000 with the mask.
653 Call::Config::BitrateConfigMask mask;
654 mask.max_bitrate_bps = rtc::Optional<int>(1000);
655 EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 1000));
656 call->SetBitrateConfigMask(mask);
657
658 // This leaves the effective max unchanged, so SetBweBitrates shouldn't be
659 // called again.
660 config.max_bitrate_bps = 1000;
661 call->SetBitrateConfig(config);
662}
663
664// When the "start bitrate" mask is removed, SetBweBitrates shouldn't be called
665// again, since nothing's changing.
666TEST(CallBitrateTest, SetBweBitratesNotCalledWhenStartMaskRemoved) {
667 CallBitrateHelper call;
668
669 Call::Config::BitrateConfigMask mask;
670 mask.start_bitrate_bps = rtc::Optional<int>(1000);
671 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
672 call->SetBitrateConfigMask(mask);
673
674 mask.start_bitrate_bps.reset();
675 call->SetBitrateConfigMask(mask);
676}
677
678// Test that if SetBitrateConfig is called after SetBitrateConfigMask applies a
679// "start" value, the SetBitrateConfig call won't apply that start value a
680// second time.
681TEST(CallBitrateTest, SetBitrateConfigAfterSetBitrateConfigMaskWithStart) {
682 CallBitrateHelper call;
683
684 Call::Config::BitrateConfigMask mask;
685 mask.start_bitrate_bps = rtc::Optional<int>(1000);
686 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
687 call->SetBitrateConfigMask(mask);
688
689 Call::Config::BitrateConfig config;
690 config.min_bitrate_bps = 0;
691 config.start_bitrate_bps = -1;
692 config.max_bitrate_bps = 5000;
693 // The start value isn't changing, so SetBweBitrates should be called with
694 // -1.
695 EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, -1, 5000));
696 call->SetBitrateConfig(config);
697}
698
699TEST(CallBitrateTest, SetBweBitratesNotCalledWhenClampedMinUnchanged) {
700 Call::Config::BitrateConfig bitrate_config;
701 bitrate_config.start_bitrate_bps = 500;
702 bitrate_config.max_bitrate_bps = 1000;
703 CallBitrateHelper call(bitrate_config);
704
705 // Set min to 2000; it is clamped to the max (1000).
706 Call::Config::BitrateConfigMask mask;
707 mask.min_bitrate_bps = rtc::Optional<int>(2000);
708 EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, -1, 1000));
709 call->SetBitrateConfigMask(mask);
710
711 // Set min to 3000; the clamped value stays the same so nothing happens.
712 mask.min_bitrate_bps = rtc::Optional<int>(3000);
713 call->SetBitrateConfigMask(mask);
714}
ossuc3d4b482017-05-23 06:07:11 -0700715
solenbergc7a8b082015-10-16 14:35:07 -0700716} // namespace webrtc