xref: /aosp_15_r20/external/webrtc/media/engine/webrtc_voice_engine_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2008 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 "media/engine/webrtc_voice_engine.h"
12 
13 #include <memory>
14 #include <utility>
15 
16 #include "absl/memory/memory.h"
17 #include "absl/strings/match.h"
18 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
19 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
20 #include "api/rtc_event_log/rtc_event_log.h"
21 #include "api/rtp_parameters.h"
22 #include "api/scoped_refptr.h"
23 #include "api/task_queue/default_task_queue_factory.h"
24 #include "api/transport/field_trial_based_config.h"
25 #include "call/call.h"
26 #include "media/base/fake_media_engine.h"
27 #include "media/base/fake_network_interface.h"
28 #include "media/base/fake_rtp.h"
29 #include "media/base/media_constants.h"
30 #include "media/engine/fake_webrtc_call.h"
31 #include "modules/audio_device/include/mock_audio_device.h"
32 #include "modules/audio_mixer/audio_mixer_impl.h"
33 #include "modules/audio_processing/include/mock_audio_processing.h"
34 #include "rtc_base/arraysize.h"
35 #include "rtc_base/byte_order.h"
36 #include "rtc_base/numerics/safe_conversions.h"
37 #include "test/gtest.h"
38 #include "test/mock_audio_decoder_factory.h"
39 #include "test/mock_audio_encoder_factory.h"
40 #include "test/scoped_key_value_config.h"
41 
42 using ::testing::_;
43 using ::testing::ContainerEq;
44 using ::testing::Contains;
45 using ::testing::Field;
46 using ::testing::Return;
47 using ::testing::ReturnPointee;
48 using ::testing::SaveArg;
49 using ::testing::StrictMock;
50 
51 namespace {
52 using webrtc::BitrateConstraints;
53 
54 constexpr uint32_t kMaxUnsignaledRecvStreams = 4;
55 
56 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
57 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 32000, 2);
58 const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
59 const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
60 const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
61 const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
62 const cricket::AudioCodec kRed48000Codec(112, "RED", 48000, 32000, 2);
63 const cricket::AudioCodec kTelephoneEventCodec1(106,
64                                                 "telephone-event",
65                                                 8000,
66                                                 0,
67                                                 1);
68 const cricket::AudioCodec kTelephoneEventCodec2(107,
69                                                 "telephone-event",
70                                                 32000,
71                                                 0,
72                                                 1);
73 
74 const uint32_t kSsrc0 = 0;
75 const uint32_t kSsrc1 = 1;
76 const uint32_t kSsrcX = 0x99;
77 const uint32_t kSsrcY = 0x17;
78 const uint32_t kSsrcZ = 0x42;
79 const uint32_t kSsrcW = 0x02;
80 const uint32_t kSsrcs4[] = {11, 200, 30, 44};
81 
82 constexpr int kRtpHistoryMs = 5000;
83 
84 constexpr webrtc::AudioProcessing::Config::GainController1::Mode
85     kDefaultAgcMode =
86 #if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
87         webrtc::AudioProcessing::Config::GainController1::kFixedDigital;
88 #else
89         webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog;
90 #endif
91 
92 constexpr webrtc::AudioProcessing::Config::NoiseSuppression::Level
93     kDefaultNsLevel =
94         webrtc::AudioProcessing::Config::NoiseSuppression::Level::kHigh;
95 
AdmSetupExpectations(webrtc::test::MockAudioDeviceModule * adm)96 void AdmSetupExpectations(webrtc::test::MockAudioDeviceModule* adm) {
97   RTC_DCHECK(adm);
98 
99   // Setup.
100   EXPECT_CALL(*adm, Init()).WillOnce(Return(0));
101   EXPECT_CALL(*adm, RegisterAudioCallback(_)).WillOnce(Return(0));
102 #if defined(WEBRTC_WIN)
103   EXPECT_CALL(
104       *adm,
105       SetPlayoutDevice(
106           ::testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
107               webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
108       .WillOnce(Return(0));
109 #else
110   EXPECT_CALL(*adm, SetPlayoutDevice(0)).WillOnce(Return(0));
111 #endif  // #if defined(WEBRTC_WIN)
112   EXPECT_CALL(*adm, InitSpeaker()).WillOnce(Return(0));
113   EXPECT_CALL(*adm, StereoPlayoutIsAvailable(::testing::_)).WillOnce(Return(0));
114   EXPECT_CALL(*adm, SetStereoPlayout(false)).WillOnce(Return(0));
115 #if defined(WEBRTC_WIN)
116   EXPECT_CALL(
117       *adm,
118       SetRecordingDevice(
119           ::testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
120               webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
121       .WillOnce(Return(0));
122 #else
123   EXPECT_CALL(*adm, SetRecordingDevice(0)).WillOnce(Return(0));
124 #endif  // #if defined(WEBRTC_WIN)
125   EXPECT_CALL(*adm, InitMicrophone()).WillOnce(Return(0));
126   EXPECT_CALL(*adm, StereoRecordingIsAvailable(::testing::_))
127       .WillOnce(Return(0));
128   EXPECT_CALL(*adm, SetStereoRecording(false)).WillOnce(Return(0));
129   EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
130   EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
131   EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
132 
133   // Teardown.
134   EXPECT_CALL(*adm, StopPlayout()).WillOnce(Return(0));
135   EXPECT_CALL(*adm, StopRecording()).WillOnce(Return(0));
136   EXPECT_CALL(*adm, RegisterAudioCallback(nullptr)).WillOnce(Return(0));
137   EXPECT_CALL(*adm, Terminate()).WillOnce(Return(0));
138 }
139 }  // namespace
140 
141 // Tests that our stub library "works".
TEST(WebRtcVoiceEngineTestStubLibrary,StartupShutdown)142 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
143   for (bool use_null_apm : {false, true}) {
144     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
145         webrtc::CreateDefaultTaskQueueFactory();
146     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
147         webrtc::test::MockAudioDeviceModule::CreateStrict();
148     AdmSetupExpectations(adm.get());
149     rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm =
150         use_null_apm ? nullptr
151                      : rtc::make_ref_counted<
152                            StrictMock<webrtc::test::MockAudioProcessing>>();
153 
154     webrtc::AudioProcessing::Config apm_config;
155     if (!use_null_apm) {
156       EXPECT_CALL(*apm, GetConfig()).WillRepeatedly(ReturnPointee(&apm_config));
157       EXPECT_CALL(*apm, ApplyConfig(_)).WillRepeatedly(SaveArg<0>(&apm_config));
158       EXPECT_CALL(*apm, DetachAecDump());
159     }
160     {
161       webrtc::FieldTrialBasedConfig trials;
162       cricket::WebRtcVoiceEngine engine(
163           task_queue_factory.get(), adm.get(),
164           webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
165           webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
166           nullptr, trials);
167       engine.Init();
168     }
169   }
170 }
171 
172 class FakeAudioSink : public webrtc::AudioSinkInterface {
173  public:
OnData(const Data & audio)174   void OnData(const Data& audio) override {}
175 };
176 
177 class FakeAudioSource : public cricket::AudioSource {
SetSink(Sink * sink)178   void SetSink(Sink* sink) override {}
179 };
180 
181 class WebRtcVoiceEngineTestFake : public ::testing::TestWithParam<bool> {
182  public:
WebRtcVoiceEngineTestFake()183   WebRtcVoiceEngineTestFake()
184       : use_null_apm_(GetParam()),
185         task_queue_factory_(webrtc::CreateDefaultTaskQueueFactory()),
186         adm_(webrtc::test::MockAudioDeviceModule::CreateStrict()),
187         apm_(use_null_apm_
188                  ? nullptr
189                  : rtc::make_ref_counted<
190                        StrictMock<webrtc::test::MockAudioProcessing>>()),
191         call_(&field_trials_) {
192     // AudioDeviceModule.
193     AdmSetupExpectations(adm_.get());
194 
195     if (!use_null_apm_) {
196       // AudioProcessing.
197       EXPECT_CALL(*apm_, GetConfig())
198           .WillRepeatedly(ReturnPointee(&apm_config_));
199       EXPECT_CALL(*apm_, ApplyConfig(_))
200           .WillRepeatedly(SaveArg<0>(&apm_config_));
201       EXPECT_CALL(*apm_, DetachAecDump());
202     }
203 
204     // Default Options.
205     // TODO(kwiberg): We should use mock factories here, but a bunch of
206     // the tests here probe the specific set of codecs provided by the builtin
207     // factories. Those tests should probably be moved elsewhere.
208     auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
209     auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();
210     engine_.reset(new cricket::WebRtcVoiceEngine(
211         task_queue_factory_.get(), adm_.get(), encoder_factory, decoder_factory,
212         nullptr, apm_, nullptr, field_trials_));
213     engine_->Init();
214     send_parameters_.codecs.push_back(kPcmuCodec);
215     recv_parameters_.codecs.push_back(kPcmuCodec);
216 
217     if (!use_null_apm_) {
218       // Default Options.
219       VerifyEchoCancellationSettings(/*enabled=*/true);
220       EXPECT_TRUE(IsHighPassFilterEnabled());
221       EXPECT_TRUE(apm_config_.noise_suppression.enabled);
222       EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
223       VerifyGainControlEnabledCorrectly();
224       VerifyGainControlDefaultSettings();
225     }
226   }
227 
SetupChannel()228   bool SetupChannel() {
229     channel_ = engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
230                                            cricket::AudioOptions(),
231                                            webrtc::CryptoOptions());
232     return (channel_ != nullptr);
233   }
234 
SetupRecvStream()235   bool SetupRecvStream() {
236     if (!SetupChannel()) {
237       return false;
238     }
239     return AddRecvStream(kSsrcX);
240   }
241 
SetupSendStream()242   bool SetupSendStream() {
243     return SetupSendStream(cricket::StreamParams::CreateLegacy(kSsrcX));
244   }
245 
SetupSendStream(const cricket::StreamParams & sp)246   bool SetupSendStream(const cricket::StreamParams& sp) {
247     if (!SetupChannel()) {
248       return false;
249     }
250     if (!channel_->AddSendStream(sp)) {
251       return false;
252     }
253     if (!use_null_apm_) {
254       EXPECT_CALL(*apm_, set_output_will_be_muted(false));
255     }
256     return channel_->SetAudioSend(kSsrcX, true, nullptr, &fake_source_);
257   }
258 
AddRecvStream(uint32_t ssrc)259   bool AddRecvStream(uint32_t ssrc) {
260     EXPECT_TRUE(channel_);
261     return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
262   }
263 
SetupForMultiSendStream()264   void SetupForMultiSendStream() {
265     EXPECT_TRUE(SetupSendStream());
266     // Remove stream added in Setup.
267     EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
268     EXPECT_TRUE(channel_->RemoveSendStream(kSsrcX));
269     // Verify the channel does not exist.
270     EXPECT_FALSE(call_.GetAudioSendStream(kSsrcX));
271   }
272 
DeliverPacket(const void * data,int len)273   void DeliverPacket(const void* data, int len) {
274     rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
275     channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
276     rtc::Thread::Current()->ProcessMessages(0);
277   }
278 
TearDown()279   void TearDown() override { delete channel_; }
280 
GetSendStream(uint32_t ssrc)281   const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
282     const auto* send_stream = call_.GetAudioSendStream(ssrc);
283     EXPECT_TRUE(send_stream);
284     return *send_stream;
285   }
286 
GetRecvStream(uint32_t ssrc)287   const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
288     const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
289     EXPECT_TRUE(recv_stream);
290     return *recv_stream;
291   }
292 
GetSendStreamConfig(uint32_t ssrc)293   const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
294     return GetSendStream(ssrc).GetConfig();
295   }
296 
GetRecvStreamConfig(uint32_t ssrc)297   const webrtc::AudioReceiveStreamInterface::Config& GetRecvStreamConfig(
298       uint32_t ssrc) {
299     return GetRecvStream(ssrc).GetConfig();
300   }
301 
SetSend(bool enable)302   void SetSend(bool enable) {
303     ASSERT_TRUE(channel_);
304     if (enable) {
305       EXPECT_CALL(*adm_, RecordingIsInitialized())
306           .Times(::testing::AtMost(1))
307           .WillOnce(Return(false));
308       EXPECT_CALL(*adm_, Recording())
309           .Times(::testing::AtMost(1))
310           .WillOnce(Return(false));
311       EXPECT_CALL(*adm_, InitRecording())
312           .Times(::testing::AtMost(1))
313           .WillOnce(Return(0));
314     }
315     channel_->SetSend(enable);
316   }
317 
SetSendParameters(const cricket::AudioSendParameters & params)318   void SetSendParameters(const cricket::AudioSendParameters& params) {
319     ASSERT_TRUE(channel_);
320     EXPECT_TRUE(channel_->SetSendParameters(params));
321   }
322 
SetAudioSend(uint32_t ssrc,bool enable,cricket::AudioSource * source,const cricket::AudioOptions * options=nullptr)323   void SetAudioSend(uint32_t ssrc,
324                     bool enable,
325                     cricket::AudioSource* source,
326                     const cricket::AudioOptions* options = nullptr) {
327     ASSERT_TRUE(channel_);
328     if (!use_null_apm_) {
329       EXPECT_CALL(*apm_, set_output_will_be_muted(!enable));
330     }
331     EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
332   }
333 
TestInsertDtmf(uint32_t ssrc,bool caller,const cricket::AudioCodec & codec)334   void TestInsertDtmf(uint32_t ssrc,
335                       bool caller,
336                       const cricket::AudioCodec& codec) {
337     EXPECT_TRUE(SetupChannel());
338     if (caller) {
339       // If this is a caller, local description will be applied and add the
340       // send stream.
341       EXPECT_TRUE(
342           channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
343     }
344 
345     // Test we can only InsertDtmf when the other side supports telephone-event.
346     SetSendParameters(send_parameters_);
347     SetSend(true);
348     EXPECT_FALSE(channel_->CanInsertDtmf());
349     EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
350     send_parameters_.codecs.push_back(codec);
351     SetSendParameters(send_parameters_);
352     EXPECT_TRUE(channel_->CanInsertDtmf());
353 
354     if (!caller) {
355       // If this is callee, there's no active send channel yet.
356       EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
357       EXPECT_TRUE(
358           channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
359     }
360 
361     // Check we fail if the ssrc is invalid.
362     EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
363 
364     // Test send.
365     cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
366         GetSendStream(kSsrcX).GetLatestTelephoneEvent();
367     EXPECT_EQ(-1, telephone_event.payload_type);
368     EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
369     telephone_event = GetSendStream(kSsrcX).GetLatestTelephoneEvent();
370     EXPECT_EQ(codec.id, telephone_event.payload_type);
371     EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
372     EXPECT_EQ(2, telephone_event.event_code);
373     EXPECT_EQ(123, telephone_event.duration_ms);
374   }
375 
TestExtmapAllowMixedCaller(bool extmap_allow_mixed)376   void TestExtmapAllowMixedCaller(bool extmap_allow_mixed) {
377     // For a caller, the answer will be applied in set remote description
378     // where SetSendParameters() is called.
379     EXPECT_TRUE(SetupChannel());
380     EXPECT_TRUE(
381         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
382     send_parameters_.extmap_allow_mixed = extmap_allow_mixed;
383     SetSendParameters(send_parameters_);
384     const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
385     EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed);
386   }
387 
TestExtmapAllowMixedCallee(bool extmap_allow_mixed)388   void TestExtmapAllowMixedCallee(bool extmap_allow_mixed) {
389     // For a callee, the answer will be applied in set local description
390     // where SetExtmapAllowMixed() and AddSendStream() are called.
391     EXPECT_TRUE(SetupChannel());
392     channel_->SetExtmapAllowMixed(extmap_allow_mixed);
393     EXPECT_TRUE(
394         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
395 
396     const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
397     EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed);
398   }
399 
400   // Test that send bandwidth is set correctly.
401   // `codec` is the codec under test.
402   // `max_bitrate` is a parameter to set to SetMaxSendBandwidth().
403   // `expected_result` is the expected result from SetMaxSendBandwidth().
404   // `expected_bitrate` is the expected audio bitrate afterward.
TestMaxSendBandwidth(const cricket::AudioCodec & codec,int max_bitrate,bool expected_result,int expected_bitrate)405   void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
406                             int max_bitrate,
407                             bool expected_result,
408                             int expected_bitrate) {
409     cricket::AudioSendParameters parameters;
410     parameters.codecs.push_back(codec);
411     parameters.max_bandwidth_bps = max_bitrate;
412     if (expected_result) {
413       SetSendParameters(parameters);
414     } else {
415       EXPECT_FALSE(channel_->SetSendParameters(parameters));
416     }
417     EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrcX));
418   }
419 
420   // Sets the per-stream maximum bitrate limit for the specified SSRC.
SetMaxBitrateForStream(int32_t ssrc,int bitrate)421   bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
422     webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
423     EXPECT_EQ(1UL, parameters.encodings.size());
424 
425     parameters.encodings[0].max_bitrate_bps = bitrate;
426     return channel_->SetRtpSendParameters(ssrc, parameters).ok();
427   }
428 
SetGlobalMaxBitrate(const cricket::AudioCodec & codec,int bitrate)429   void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
430     cricket::AudioSendParameters send_parameters;
431     send_parameters.codecs.push_back(codec);
432     send_parameters.max_bandwidth_bps = bitrate;
433     SetSendParameters(send_parameters);
434   }
435 
CheckSendCodecBitrate(int32_t ssrc,const char expected_name[],int expected_bitrate)436   void CheckSendCodecBitrate(int32_t ssrc,
437                              const char expected_name[],
438                              int expected_bitrate) {
439     const auto& spec = GetSendStreamConfig(ssrc).send_codec_spec;
440     EXPECT_EQ(expected_name, spec->format.name);
441     EXPECT_EQ(expected_bitrate, spec->target_bitrate_bps);
442   }
443 
GetCodecBitrate(int32_t ssrc)444   absl::optional<int> GetCodecBitrate(int32_t ssrc) {
445     return GetSendStreamConfig(ssrc).send_codec_spec->target_bitrate_bps;
446   }
447 
GetMaxBitrate(int32_t ssrc)448   int GetMaxBitrate(int32_t ssrc) {
449     return GetSendStreamConfig(ssrc).max_bitrate_bps;
450   }
451 
GetAudioNetworkAdaptorConfig(int32_t ssrc)452   const absl::optional<std::string>& GetAudioNetworkAdaptorConfig(
453       int32_t ssrc) {
454     return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
455   }
456 
SetAndExpectMaxBitrate(const cricket::AudioCodec & codec,int global_max,int stream_max,bool expected_result,int expected_codec_bitrate)457   void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
458                               int global_max,
459                               int stream_max,
460                               bool expected_result,
461                               int expected_codec_bitrate) {
462     // Clear the bitrate limit from the previous test case.
463     EXPECT_TRUE(SetMaxBitrateForStream(kSsrcX, -1));
464 
465     // Attempt to set the requested bitrate limits.
466     SetGlobalMaxBitrate(codec, global_max);
467     EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrcX, stream_max));
468 
469     // Verify that reading back the parameters gives results
470     // consistent with the Set() result.
471     webrtc::RtpParameters resulting_parameters =
472         channel_->GetRtpSendParameters(kSsrcX);
473     EXPECT_EQ(1UL, resulting_parameters.encodings.size());
474     EXPECT_EQ(expected_result ? stream_max : -1,
475               resulting_parameters.encodings[0].max_bitrate_bps);
476 
477     // Verify that the codec settings have the expected bitrate.
478     EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrcX));
479     EXPECT_EQ(expected_codec_bitrate, GetMaxBitrate(kSsrcX));
480   }
481 
SetSendCodecsShouldWorkForBitrates(const char * min_bitrate_kbps,int expected_min_bitrate_bps,const char * start_bitrate_kbps,int expected_start_bitrate_bps,const char * max_bitrate_kbps,int expected_max_bitrate_bps)482   void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
483                                           int expected_min_bitrate_bps,
484                                           const char* start_bitrate_kbps,
485                                           int expected_start_bitrate_bps,
486                                           const char* max_bitrate_kbps,
487                                           int expected_max_bitrate_bps) {
488     EXPECT_TRUE(SetupSendStream());
489     auto& codecs = send_parameters_.codecs;
490     codecs.clear();
491     codecs.push_back(kOpusCodec);
492     codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
493     codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
494     codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
495     EXPECT_CALL(*call_.GetMockTransportControllerSend(),
496                 SetSdpBitrateParameters(
497                     AllOf(Field(&BitrateConstraints::min_bitrate_bps,
498                                 expected_min_bitrate_bps),
499                           Field(&BitrateConstraints::start_bitrate_bps,
500                                 expected_start_bitrate_bps),
501                           Field(&BitrateConstraints::max_bitrate_bps,
502                                 expected_max_bitrate_bps))));
503 
504     SetSendParameters(send_parameters_);
505   }
506 
TestSetSendRtpHeaderExtensions(const std::string & ext)507   void TestSetSendRtpHeaderExtensions(const std::string& ext) {
508     EXPECT_TRUE(SetupSendStream());
509 
510     // Ensure extensions are off by default.
511     EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
512 
513     // Ensure unknown extensions won't cause an error.
514     send_parameters_.extensions.push_back(
515         webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
516     SetSendParameters(send_parameters_);
517     EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
518 
519     // Ensure extensions stay off with an empty list of headers.
520     send_parameters_.extensions.clear();
521     SetSendParameters(send_parameters_);
522     EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
523 
524     // Ensure extension is set properly.
525     const int id = 1;
526     send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
527     SetSendParameters(send_parameters_);
528     EXPECT_EQ(1u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
529     EXPECT_EQ(ext, GetSendStreamConfig(kSsrcX).rtp.extensions[0].uri);
530     EXPECT_EQ(id, GetSendStreamConfig(kSsrcX).rtp.extensions[0].id);
531 
532     // Ensure extension is set properly on new stream.
533     EXPECT_TRUE(
534         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY)));
535     EXPECT_NE(call_.GetAudioSendStream(kSsrcX),
536               call_.GetAudioSendStream(kSsrcY));
537     EXPECT_EQ(1u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
538     EXPECT_EQ(ext, GetSendStreamConfig(kSsrcY).rtp.extensions[0].uri);
539     EXPECT_EQ(id, GetSendStreamConfig(kSsrcY).rtp.extensions[0].id);
540 
541     // Ensure all extensions go back off with an empty list.
542     send_parameters_.codecs.push_back(kPcmuCodec);
543     send_parameters_.extensions.clear();
544     SetSendParameters(send_parameters_);
545     EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
546     EXPECT_EQ(0u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
547   }
548 
TestSetRecvRtpHeaderExtensions(const std::string & ext)549   void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
550     EXPECT_TRUE(SetupRecvStream());
551 
552     // Ensure extensions are off by default.
553     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
554 
555     // Ensure unknown extensions won't cause an error.
556     recv_parameters_.extensions.push_back(
557         webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
558     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
559     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
560 
561     // Ensure extensions stay off with an empty list of headers.
562     recv_parameters_.extensions.clear();
563     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
564     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
565 
566     // Ensure extension is set properly.
567     const int id = 2;
568     recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
569     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
570     EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
571     EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].uri);
572     EXPECT_EQ(id, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].id);
573 
574     // Ensure extension is set properly on new stream.
575     EXPECT_TRUE(AddRecvStream(kSsrcY));
576     EXPECT_NE(call_.GetAudioReceiveStream(kSsrcX),
577               call_.GetAudioReceiveStream(kSsrcY));
578     EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
579     EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].uri);
580     EXPECT_EQ(id, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].id);
581 
582     // Ensure all extensions go back off with an empty list.
583     recv_parameters_.extensions.clear();
584     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
585     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
586     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
587   }
588 
GetAudioSendStreamStats() const589   webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
590     webrtc::AudioSendStream::Stats stats;
591     stats.local_ssrc = 12;
592     stats.payload_bytes_sent = 345;
593     stats.header_and_padding_bytes_sent = 56;
594     stats.packets_sent = 678;
595     stats.packets_lost = 9012;
596     stats.fraction_lost = 34.56f;
597     stats.codec_name = "codec_name_send";
598     stats.codec_payload_type = 42;
599     stats.jitter_ms = 12;
600     stats.rtt_ms = 345;
601     stats.audio_level = 678;
602     stats.apm_statistics.delay_median_ms = 234;
603     stats.apm_statistics.delay_standard_deviation_ms = 567;
604     stats.apm_statistics.echo_return_loss = 890;
605     stats.apm_statistics.echo_return_loss_enhancement = 1234;
606     stats.apm_statistics.residual_echo_likelihood = 0.432f;
607     stats.apm_statistics.residual_echo_likelihood_recent_max = 0.6f;
608     stats.ana_statistics.bitrate_action_counter = 321;
609     stats.ana_statistics.channel_action_counter = 432;
610     stats.ana_statistics.dtx_action_counter = 543;
611     stats.ana_statistics.fec_action_counter = 654;
612     stats.ana_statistics.frame_length_increase_counter = 765;
613     stats.ana_statistics.frame_length_decrease_counter = 876;
614     stats.ana_statistics.uplink_packet_loss_fraction = 987.0;
615     return stats;
616   }
SetAudioSendStreamStats()617   void SetAudioSendStreamStats() {
618     for (auto* s : call_.GetAudioSendStreams()) {
619       s->SetStats(GetAudioSendStreamStats());
620     }
621   }
VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo & info,bool is_sending)622   void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
623                              bool is_sending) {
624     const auto stats = GetAudioSendStreamStats();
625     EXPECT_EQ(info.ssrc(), stats.local_ssrc);
626     EXPECT_EQ(info.payload_bytes_sent, stats.payload_bytes_sent);
627     EXPECT_EQ(info.header_and_padding_bytes_sent,
628               stats.header_and_padding_bytes_sent);
629     EXPECT_EQ(info.packets_sent, stats.packets_sent);
630     EXPECT_EQ(info.packets_lost, stats.packets_lost);
631     EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
632     EXPECT_EQ(info.codec_name, stats.codec_name);
633     EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
634     EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
635     EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
636     EXPECT_EQ(info.audio_level, stats.audio_level);
637     EXPECT_EQ(info.apm_statistics.delay_median_ms,
638               stats.apm_statistics.delay_median_ms);
639     EXPECT_EQ(info.apm_statistics.delay_standard_deviation_ms,
640               stats.apm_statistics.delay_standard_deviation_ms);
641     EXPECT_EQ(info.apm_statistics.echo_return_loss,
642               stats.apm_statistics.echo_return_loss);
643     EXPECT_EQ(info.apm_statistics.echo_return_loss_enhancement,
644               stats.apm_statistics.echo_return_loss_enhancement);
645     EXPECT_EQ(info.apm_statistics.residual_echo_likelihood,
646               stats.apm_statistics.residual_echo_likelihood);
647     EXPECT_EQ(info.apm_statistics.residual_echo_likelihood_recent_max,
648               stats.apm_statistics.residual_echo_likelihood_recent_max);
649     EXPECT_EQ(info.ana_statistics.bitrate_action_counter,
650               stats.ana_statistics.bitrate_action_counter);
651     EXPECT_EQ(info.ana_statistics.channel_action_counter,
652               stats.ana_statistics.channel_action_counter);
653     EXPECT_EQ(info.ana_statistics.dtx_action_counter,
654               stats.ana_statistics.dtx_action_counter);
655     EXPECT_EQ(info.ana_statistics.fec_action_counter,
656               stats.ana_statistics.fec_action_counter);
657     EXPECT_EQ(info.ana_statistics.frame_length_increase_counter,
658               stats.ana_statistics.frame_length_increase_counter);
659     EXPECT_EQ(info.ana_statistics.frame_length_decrease_counter,
660               stats.ana_statistics.frame_length_decrease_counter);
661     EXPECT_EQ(info.ana_statistics.uplink_packet_loss_fraction,
662               stats.ana_statistics.uplink_packet_loss_fraction);
663   }
664 
GetAudioReceiveStreamStats() const665   webrtc::AudioReceiveStreamInterface::Stats GetAudioReceiveStreamStats()
666       const {
667     webrtc::AudioReceiveStreamInterface::Stats stats;
668     stats.remote_ssrc = 123;
669     stats.payload_bytes_rcvd = 456;
670     stats.header_and_padding_bytes_rcvd = 67;
671     stats.packets_rcvd = 768;
672     stats.packets_lost = 101;
673     stats.codec_name = "codec_name_recv";
674     stats.codec_payload_type = 42;
675     stats.jitter_ms = 901;
676     stats.jitter_buffer_ms = 234;
677     stats.jitter_buffer_preferred_ms = 567;
678     stats.delay_estimate_ms = 890;
679     stats.audio_level = 1234;
680     stats.total_samples_received = 5678901;
681     stats.concealed_samples = 234;
682     stats.concealment_events = 12;
683     stats.jitter_buffer_delay_seconds = 34;
684     stats.jitter_buffer_emitted_count = 77;
685     stats.expand_rate = 5.67f;
686     stats.speech_expand_rate = 8.90f;
687     stats.secondary_decoded_rate = 1.23f;
688     stats.secondary_discarded_rate = 0.12f;
689     stats.accelerate_rate = 4.56f;
690     stats.preemptive_expand_rate = 7.89f;
691     stats.decoding_calls_to_silence_generator = 12;
692     stats.decoding_calls_to_neteq = 345;
693     stats.decoding_normal = 67890;
694     stats.decoding_plc = 1234;
695     stats.decoding_codec_plc = 1236;
696     stats.decoding_cng = 5678;
697     stats.decoding_plc_cng = 9012;
698     stats.decoding_muted_output = 3456;
699     stats.capture_start_ntp_time_ms = 7890;
700     return stats;
701   }
SetAudioReceiveStreamStats()702   void SetAudioReceiveStreamStats() {
703     for (auto* s : call_.GetAudioReceiveStreams()) {
704       s->SetStats(GetAudioReceiveStreamStats());
705     }
706   }
VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo & info)707   void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
708     const auto stats = GetAudioReceiveStreamStats();
709     EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
710     EXPECT_EQ(info.payload_bytes_rcvd, stats.payload_bytes_rcvd);
711     EXPECT_EQ(info.header_and_padding_bytes_rcvd,
712               stats.header_and_padding_bytes_rcvd);
713     EXPECT_EQ(rtc::checked_cast<unsigned int>(info.packets_rcvd),
714               stats.packets_rcvd);
715     EXPECT_EQ(info.packets_lost, stats.packets_lost);
716     EXPECT_EQ(info.codec_name, stats.codec_name);
717     EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
718     EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_ms), stats.jitter_ms);
719     EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_buffer_ms),
720               stats.jitter_buffer_ms);
721     EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_buffer_preferred_ms),
722               stats.jitter_buffer_preferred_ms);
723     EXPECT_EQ(rtc::checked_cast<unsigned int>(info.delay_estimate_ms),
724               stats.delay_estimate_ms);
725     EXPECT_EQ(info.audio_level, stats.audio_level);
726     EXPECT_EQ(info.total_samples_received, stats.total_samples_received);
727     EXPECT_EQ(info.concealed_samples, stats.concealed_samples);
728     EXPECT_EQ(info.concealment_events, stats.concealment_events);
729     EXPECT_EQ(info.jitter_buffer_delay_seconds,
730               stats.jitter_buffer_delay_seconds);
731     EXPECT_EQ(info.jitter_buffer_emitted_count,
732               stats.jitter_buffer_emitted_count);
733     EXPECT_EQ(info.expand_rate, stats.expand_rate);
734     EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
735     EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
736     EXPECT_EQ(info.secondary_discarded_rate, stats.secondary_discarded_rate);
737     EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
738     EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
739     EXPECT_EQ(info.decoding_calls_to_silence_generator,
740               stats.decoding_calls_to_silence_generator);
741     EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
742     EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
743     EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
744     EXPECT_EQ(info.decoding_codec_plc, stats.decoding_codec_plc);
745     EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
746     EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
747     EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
748     EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
749   }
VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo & info) const750   void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
751     EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
752     for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
753       ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
754       EXPECT_EQ(info.send_codecs.find(codec.id)->second,
755                 codec.ToCodecParameters());
756     }
757     EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
758     for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
759       ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
760       EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
761                 codec.ToCodecParameters());
762     }
763   }
764 
VerifyGainControlEnabledCorrectly()765   void VerifyGainControlEnabledCorrectly() {
766     EXPECT_TRUE(apm_config_.gain_controller1.enabled);
767     EXPECT_EQ(kDefaultAgcMode, apm_config_.gain_controller1.mode);
768   }
769 
VerifyGainControlDefaultSettings()770   void VerifyGainControlDefaultSettings() {
771     EXPECT_EQ(3, apm_config_.gain_controller1.target_level_dbfs);
772     EXPECT_EQ(9, apm_config_.gain_controller1.compression_gain_db);
773     EXPECT_TRUE(apm_config_.gain_controller1.enable_limiter);
774   }
775 
VerifyEchoCancellationSettings(bool enabled)776   void VerifyEchoCancellationSettings(bool enabled) {
777     constexpr bool kDefaultUseAecm =
778 #if defined(WEBRTC_ANDROID)
779         true;
780 #else
781         false;
782 #endif
783     EXPECT_EQ(apm_config_.echo_canceller.enabled, enabled);
784     EXPECT_EQ(apm_config_.echo_canceller.mobile_mode, kDefaultUseAecm);
785   }
786 
IsHighPassFilterEnabled()787   bool IsHighPassFilterEnabled() {
788     return apm_config_.high_pass_filter.enabled;
789   }
790 
791  protected:
792   rtc::AutoThread main_thread_;
793   const bool use_null_apm_;
794   webrtc::test::ScopedKeyValueConfig field_trials_;
795   std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
796   rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm_;
797   rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm_;
798   cricket::FakeCall call_;
799   std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
800   cricket::VoiceMediaChannel* channel_ = nullptr;
801   cricket::AudioSendParameters send_parameters_;
802   cricket::AudioRecvParameters recv_parameters_;
803   FakeAudioSource fake_source_;
804   webrtc::AudioProcessing::Config apm_config_;
805 };
806 
807 INSTANTIATE_TEST_SUITE_P(TestBothWithAndWithoutNullApm,
808                          WebRtcVoiceEngineTestFake,
809                          ::testing::Values(false, true));
810 
811 // Tests that we can create and destroy a channel.
TEST_P(WebRtcVoiceEngineTestFake,CreateMediaChannel)812 TEST_P(WebRtcVoiceEngineTestFake, CreateMediaChannel) {
813   EXPECT_TRUE(SetupChannel());
814 }
815 
816 // Test that we can add a send stream and that it has the correct defaults.
TEST_P(WebRtcVoiceEngineTestFake,CreateSendStream)817 TEST_P(WebRtcVoiceEngineTestFake, CreateSendStream) {
818   EXPECT_TRUE(SetupChannel());
819   EXPECT_TRUE(
820       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
821   const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
822   EXPECT_EQ(kSsrcX, config.rtp.ssrc);
823   EXPECT_EQ("", config.rtp.c_name);
824   EXPECT_EQ(0u, config.rtp.extensions.size());
825   EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
826             config.send_transport);
827 }
828 
829 // Test that we can add a receive stream and that it has the correct defaults.
TEST_P(WebRtcVoiceEngineTestFake,CreateRecvStream)830 TEST_P(WebRtcVoiceEngineTestFake, CreateRecvStream) {
831   EXPECT_TRUE(SetupChannel());
832   EXPECT_TRUE(AddRecvStream(kSsrcX));
833   const webrtc::AudioReceiveStreamInterface::Config& config =
834       GetRecvStreamConfig(kSsrcX);
835   EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc);
836   EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
837   EXPECT_FALSE(config.rtp.transport_cc);
838   EXPECT_EQ(0u, config.rtp.extensions.size());
839   EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
840             config.rtcp_send_transport);
841   EXPECT_EQ("", config.sync_group);
842 }
843 
TEST_P(WebRtcVoiceEngineTestFake,OpusSupportsTransportCc)844 TEST_P(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
845   const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
846   bool opus_found = false;
847   for (const cricket::AudioCodec& codec : codecs) {
848     if (codec.name == "opus") {
849       EXPECT_TRUE(HasTransportCc(codec));
850       opus_found = true;
851     }
852   }
853   EXPECT_TRUE(opus_found);
854 }
855 
856 // Test that we set our inbound codecs properly, including changing PT.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecs)857 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
858   EXPECT_TRUE(SetupChannel());
859   cricket::AudioRecvParameters parameters;
860   parameters.codecs.push_back(kOpusCodec);
861   parameters.codecs.push_back(kPcmuCodec);
862   parameters.codecs.push_back(kTelephoneEventCodec1);
863   parameters.codecs.push_back(kTelephoneEventCodec2);
864   parameters.codecs[0].id = 106;  // collide with existing CN 32k
865   parameters.codecs[2].id = 126;
866   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
867   EXPECT_TRUE(AddRecvStream(kSsrcX));
868   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
869               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
870                   {{0, {"PCMU", 8000, 1}},
871                    {106, {"OPUS", 48000, 2}},
872                    {126, {"telephone-event", 8000, 1}},
873                    {107, {"telephone-event", 32000, 1}}})));
874 }
875 
876 // Test that we fail to set an unknown inbound codec.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsUnsupportedCodec)877 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
878   EXPECT_TRUE(SetupChannel());
879   cricket::AudioRecvParameters parameters;
880   parameters.codecs.push_back(kOpusCodec);
881   parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
882   EXPECT_FALSE(channel_->SetRecvParameters(parameters));
883 }
884 
885 // Test that we fail if we have duplicate types in the inbound list.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsDuplicatePayloadType)886 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
887   EXPECT_TRUE(SetupChannel());
888   cricket::AudioRecvParameters parameters;
889   parameters.codecs.push_back(kOpusCodec);
890   parameters.codecs.push_back(kCn16000Codec);
891   parameters.codecs[1].id = kOpusCodec.id;
892   EXPECT_FALSE(channel_->SetRecvParameters(parameters));
893 }
894 
895 // Test that we can decode OPUS without stereo parameters.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpusNoStereo)896 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
897   EXPECT_TRUE(SetupChannel());
898   cricket::AudioRecvParameters parameters;
899   parameters.codecs.push_back(kPcmuCodec);
900   parameters.codecs.push_back(kOpusCodec);
901   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
902   EXPECT_TRUE(AddRecvStream(kSsrcX));
903   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
904               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
905                   {{0, {"PCMU", 8000, 1}}, {111, {"opus", 48000, 2}}})));
906 }
907 
908 // Test that we can decode OPUS with stereo = 0.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpus0Stereo)909 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
910   EXPECT_TRUE(SetupChannel());
911   cricket::AudioRecvParameters parameters;
912   parameters.codecs.push_back(kPcmuCodec);
913   parameters.codecs.push_back(kOpusCodec);
914   parameters.codecs[1].params["stereo"] = "0";
915   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
916   EXPECT_TRUE(AddRecvStream(kSsrcX));
917   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
918               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
919                   {{0, {"PCMU", 8000, 1}},
920                    {111, {"opus", 48000, 2, {{"stereo", "0"}}}}})));
921 }
922 
923 // Test that we can decode OPUS with stereo = 1.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpus1Stereo)924 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
925   EXPECT_TRUE(SetupChannel());
926   cricket::AudioRecvParameters parameters;
927   parameters.codecs.push_back(kPcmuCodec);
928   parameters.codecs.push_back(kOpusCodec);
929   parameters.codecs[1].params["stereo"] = "1";
930   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
931   EXPECT_TRUE(AddRecvStream(kSsrcX));
932   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
933               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
934                   {{0, {"PCMU", 8000, 1}},
935                    {111, {"opus", 48000, 2, {{"stereo", "1"}}}}})));
936 }
937 
938 // Test that changes to recv codecs are applied to all streams.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithMultipleStreams)939 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
940   EXPECT_TRUE(SetupChannel());
941   cricket::AudioRecvParameters parameters;
942   parameters.codecs.push_back(kOpusCodec);
943   parameters.codecs.push_back(kPcmuCodec);
944   parameters.codecs.push_back(kTelephoneEventCodec1);
945   parameters.codecs.push_back(kTelephoneEventCodec2);
946   parameters.codecs[0].id = 106;  // collide with existing CN 32k
947   parameters.codecs[2].id = 126;
948   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
949   for (const auto& ssrc : {kSsrcX, kSsrcY}) {
950     EXPECT_TRUE(AddRecvStream(ssrc));
951     EXPECT_THAT(GetRecvStreamConfig(ssrc).decoder_map,
952                 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
953                     {{0, {"PCMU", 8000, 1}},
954                      {106, {"OPUS", 48000, 2}},
955                      {126, {"telephone-event", 8000, 1}},
956                      {107, {"telephone-event", 32000, 1}}})));
957   }
958 }
959 
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsAfterAddingStreams)960 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
961   EXPECT_TRUE(SetupRecvStream());
962   cricket::AudioRecvParameters parameters;
963   parameters.codecs.push_back(kOpusCodec);
964   parameters.codecs[0].id = 106;  // collide with existing CN 32k
965   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
966 
967   const auto& dm = GetRecvStreamConfig(kSsrcX).decoder_map;
968   ASSERT_EQ(1u, dm.count(106));
969   EXPECT_EQ(webrtc::SdpAudioFormat("opus", 48000, 2), dm.at(106));
970 }
971 
972 // Test that we can apply the same set of codecs again while playing.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWhilePlaying)973 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
974   EXPECT_TRUE(SetupRecvStream());
975   cricket::AudioRecvParameters parameters;
976   parameters.codecs.push_back(kPcmuCodec);
977   parameters.codecs.push_back(kCn16000Codec);
978   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
979   channel_->SetPlayout(true);
980   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
981 
982   // Remapping a payload type to a different codec should fail.
983   parameters.codecs[0] = kOpusCodec;
984   parameters.codecs[0].id = kPcmuCodec.id;
985   EXPECT_FALSE(channel_->SetRecvParameters(parameters));
986   EXPECT_TRUE(GetRecvStream(kSsrcX).started());
987 }
988 
989 // Test that we can add a codec while playing.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvCodecsWhilePlaying)990 TEST_P(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
991   EXPECT_TRUE(SetupRecvStream());
992   cricket::AudioRecvParameters parameters;
993   parameters.codecs.push_back(kPcmuCodec);
994   parameters.codecs.push_back(kCn16000Codec);
995   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
996   channel_->SetPlayout(true);
997 
998   parameters.codecs.push_back(kOpusCodec);
999   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1000   EXPECT_TRUE(GetRecvStream(kSsrcX).started());
1001 }
1002 
1003 // Test that we accept adding the same codec with a different payload type.
1004 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5847
TEST_P(WebRtcVoiceEngineTestFake,ChangeRecvCodecPayloadType)1005 TEST_P(WebRtcVoiceEngineTestFake, ChangeRecvCodecPayloadType) {
1006   EXPECT_TRUE(SetupRecvStream());
1007   cricket::AudioRecvParameters parameters;
1008   parameters.codecs.push_back(kOpusCodec);
1009   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1010 
1011   ++parameters.codecs[0].id;
1012   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1013 }
1014 
1015 // Test that we do allow setting Opus/Red by default.
TEST_P(WebRtcVoiceEngineTestFake,RecvRedDefault)1016 TEST_P(WebRtcVoiceEngineTestFake, RecvRedDefault) {
1017   EXPECT_TRUE(SetupRecvStream());
1018   cricket::AudioRecvParameters parameters;
1019   parameters.codecs.push_back(kOpusCodec);
1020   parameters.codecs.push_back(kRed48000Codec);
1021   parameters.codecs[1].params[""] = "111/111";
1022   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1023   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
1024               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
1025                   {{111, {"opus", 48000, 2}},
1026                    {112, {"red", 48000, 2, {{"", "111/111"}}}}})));
1027 }
1028 
TEST_P(WebRtcVoiceEngineTestFake,SetSendBandwidthAuto)1029 TEST_P(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
1030   EXPECT_TRUE(SetupSendStream());
1031 
1032   // Test that when autobw is enabled, bitrate is kept as the default
1033   // value. autobw is enabled for the following tests because the target
1034   // bitrate is <= 0.
1035 
1036   // PCMU, default bitrate == 64000.
1037   TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
1038 
1039   // opus, default bitrate == 32000 in mono.
1040   TestMaxSendBandwidth(kOpusCodec, -1, true, 32000);
1041 }
1042 
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthMultiRateAsCaller)1043 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
1044   EXPECT_TRUE(SetupSendStream());
1045 
1046   // opus, default bitrate == 64000.
1047   TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
1048   TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
1049   // Rates above the max (510000) should be capped.
1050   TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
1051 }
1052 
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthFixedRateAsCaller)1053 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
1054   EXPECT_TRUE(SetupSendStream());
1055 
1056   // Test that we can only set a maximum bitrate for a fixed-rate codec
1057   // if it's bigger than the fixed rate.
1058 
1059   // PCMU, fixed bitrate == 64000.
1060   TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
1061   TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
1062   TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
1063   TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
1064   TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
1065   TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
1066   TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
1067 }
1068 
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthMultiRateAsCallee)1069 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
1070   EXPECT_TRUE(SetupChannel());
1071   const int kDesiredBitrate = 128000;
1072   cricket::AudioSendParameters parameters;
1073   parameters.codecs = engine_->send_codecs();
1074   parameters.max_bandwidth_bps = kDesiredBitrate;
1075   SetSendParameters(parameters);
1076 
1077   EXPECT_TRUE(
1078       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
1079 
1080   EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrcX));
1081 }
1082 
1083 // Test that bitrate cannot be set for CBR codecs.
1084 // Bitrate is ignored if it is higher than the fixed bitrate.
1085 // Bitrate less then the fixed bitrate is an error.
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthCbr)1086 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
1087   EXPECT_TRUE(SetupSendStream());
1088 
1089   // PCMU, default bitrate == 64000.
1090   SetSendParameters(send_parameters_);
1091   EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1092 
1093   send_parameters_.max_bandwidth_bps = 128000;
1094   SetSendParameters(send_parameters_);
1095   EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1096 
1097   send_parameters_.max_bandwidth_bps = 128;
1098   EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
1099   EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1100 }
1101 
1102 // Test that the per-stream bitrate limit and the global
1103 // bitrate limit both apply.
TEST_P(WebRtcVoiceEngineTestFake,SetMaxBitratePerStream)1104 TEST_P(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1105   EXPECT_TRUE(SetupSendStream());
1106 
1107   // opus, default bitrate == 32000.
1108   SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 32000);
1109   SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1110   SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1111   SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1112 
1113   // CBR codecs allow both maximums to exceed the bitrate.
1114   SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1115   SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1116   SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1117   SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1118 
1119   // CBR codecs don't allow per stream maximums to be too low.
1120   SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1121   SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1122 }
1123 
1124 // Test that an attempt to set RtpParameters for a stream that does not exist
1125 // fails.
TEST_P(WebRtcVoiceEngineTestFake,CannotSetMaxBitrateForNonexistentStream)1126 TEST_P(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1127   EXPECT_TRUE(SetupChannel());
1128   webrtc::RtpParameters nonexistent_parameters =
1129       channel_->GetRtpSendParameters(kSsrcX);
1130   EXPECT_EQ(0u, nonexistent_parameters.encodings.size());
1131 
1132   nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
1133   EXPECT_FALSE(
1134       channel_->SetRtpSendParameters(kSsrcX, nonexistent_parameters).ok());
1135 }
1136 
TEST_P(WebRtcVoiceEngineTestFake,CannotSetRtpSendParametersWithIncorrectNumberOfEncodings)1137 TEST_P(WebRtcVoiceEngineTestFake,
1138        CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
1139   // This test verifies that setting RtpParameters succeeds only if
1140   // the structure contains exactly one encoding.
1141   // TODO(skvlad): Update this test when we start supporting setting parameters
1142   // for each encoding individually.
1143 
1144   EXPECT_TRUE(SetupSendStream());
1145   webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1146   // Two or more encodings should result in failure.
1147   parameters.encodings.push_back(webrtc::RtpEncodingParameters());
1148   EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1149   // Zero encodings should also fail.
1150   parameters.encodings.clear();
1151   EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1152 }
1153 
1154 // Changing the SSRC through RtpParameters is not allowed.
TEST_P(WebRtcVoiceEngineTestFake,CannotSetSsrcInRtpSendParameters)1155 TEST_P(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
1156   EXPECT_TRUE(SetupSendStream());
1157   webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1158   parameters.encodings[0].ssrc = 0xdeadbeef;
1159   EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1160 }
1161 
1162 // Test that a stream will not be sending if its encoding is made
1163 // inactive through SetRtpSendParameters.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpParametersEncodingsActive)1164 TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1165   EXPECT_TRUE(SetupSendStream());
1166   SetSend(true);
1167   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
1168   // Get current parameters and change "active" to false.
1169   webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1170   ASSERT_EQ(1u, parameters.encodings.size());
1171   ASSERT_TRUE(parameters.encodings[0].active);
1172   parameters.encodings[0].active = false;
1173   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1174   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
1175 
1176   // Now change it back to active and verify we resume sending.
1177   // This should occur even when other parameters are updated.
1178   parameters.encodings[0].active = true;
1179   parameters.encodings[0].max_bitrate_bps = absl::optional<int>(6000);
1180   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1181   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
1182 }
1183 
TEST_P(WebRtcVoiceEngineTestFake,SetRtpParametersAdaptivePtime)1184 TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersAdaptivePtime) {
1185   EXPECT_TRUE(SetupSendStream());
1186   // Get current parameters and change "adaptive_ptime" to true.
1187   webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1188   ASSERT_EQ(1u, parameters.encodings.size());
1189   ASSERT_FALSE(parameters.encodings[0].adaptive_ptime);
1190   parameters.encodings[0].adaptive_ptime = true;
1191   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1192   EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
1193   EXPECT_EQ(16000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
1194 
1195   parameters.encodings[0].adaptive_ptime = false;
1196   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1197   EXPECT_FALSE(GetAudioNetworkAdaptorConfig(kSsrcX));
1198   EXPECT_EQ(32000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
1199 }
1200 
TEST_P(WebRtcVoiceEngineTestFake,DisablingAdaptivePtimeDoesNotRemoveAudioNetworkAdaptorFromOptions)1201 TEST_P(WebRtcVoiceEngineTestFake,
1202        DisablingAdaptivePtimeDoesNotRemoveAudioNetworkAdaptorFromOptions) {
1203   EXPECT_TRUE(SetupSendStream());
1204   send_parameters_.options.audio_network_adaptor = true;
1205   send_parameters_.options.audio_network_adaptor_config = {"1234"};
1206   SetSendParameters(send_parameters_);
1207   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
1208             GetAudioNetworkAdaptorConfig(kSsrcX));
1209 
1210   webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1211   parameters.encodings[0].adaptive_ptime = false;
1212   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1213   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
1214             GetAudioNetworkAdaptorConfig(kSsrcX));
1215 }
1216 
TEST_P(WebRtcVoiceEngineTestFake,AdaptivePtimeFieldTrial)1217 TEST_P(WebRtcVoiceEngineTestFake, AdaptivePtimeFieldTrial) {
1218   webrtc::test::ScopedKeyValueConfig override_field_trials(
1219       field_trials_, "WebRTC-Audio-AdaptivePtime/enabled:true/");
1220   EXPECT_TRUE(SetupSendStream());
1221   EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
1222 }
1223 
1224 // Test that SetRtpSendParameters configures the correct encoding channel for
1225 // each SSRC.
TEST_P(WebRtcVoiceEngineTestFake,RtpParametersArePerStream)1226 TEST_P(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1227   SetupForMultiSendStream();
1228   // Create send streams.
1229   for (uint32_t ssrc : kSsrcs4) {
1230     EXPECT_TRUE(
1231         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1232   }
1233   // Configure one stream to be limited by the stream config, another to be
1234   // limited by the global max, and the third one with no per-stream limit
1235   // (still subject to the global limit).
1236   SetGlobalMaxBitrate(kOpusCodec, 32000);
1237   EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 24000));
1238   EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 48000));
1239   EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1240 
1241   EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1242   EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[1]));
1243   EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1244 
1245   // Remove the global cap; the streams should switch to their respective
1246   // maximums (or remain unchanged if there was no other limit on them.)
1247   SetGlobalMaxBitrate(kOpusCodec, -1);
1248   EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1249   EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[1]));
1250   EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1251 }
1252 
1253 // Test that GetRtpSendParameters returns the currently configured codecs.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersCodecs)1254 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
1255   EXPECT_TRUE(SetupSendStream());
1256   cricket::AudioSendParameters parameters;
1257   parameters.codecs.push_back(kOpusCodec);
1258   parameters.codecs.push_back(kPcmuCodec);
1259   SetSendParameters(parameters);
1260 
1261   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1262   ASSERT_EQ(2u, rtp_parameters.codecs.size());
1263   EXPECT_EQ(kOpusCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1264   EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1265 }
1266 
1267 // Test that GetRtpSendParameters returns the currently configured RTCP CNAME.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersRtcpCname)1268 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersRtcpCname) {
1269   cricket::StreamParams params = cricket::StreamParams::CreateLegacy(kSsrcX);
1270   params.cname = "rtcpcname";
1271   EXPECT_TRUE(SetupSendStream(params));
1272 
1273   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1274   EXPECT_STREQ("rtcpcname", rtp_parameters.rtcp.cname.c_str());
1275 }
1276 
TEST_P(WebRtcVoiceEngineTestFake,DetectRtpSendParameterHeaderExtensionsChange)1277 TEST_P(WebRtcVoiceEngineTestFake,
1278        DetectRtpSendParameterHeaderExtensionsChange) {
1279   EXPECT_TRUE(SetupSendStream());
1280 
1281   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1282   rtp_parameters.header_extensions.emplace_back();
1283 
1284   EXPECT_NE(0u, rtp_parameters.header_extensions.size());
1285 
1286   webrtc::RTCError result =
1287       channel_->SetRtpSendParameters(kSsrcX, rtp_parameters);
1288   EXPECT_EQ(webrtc::RTCErrorType::INVALID_MODIFICATION, result.type());
1289 }
1290 
1291 // Test that GetRtpSendParameters returns an SSRC.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersSsrc)1292 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
1293   EXPECT_TRUE(SetupSendStream());
1294   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1295   ASSERT_EQ(1u, rtp_parameters.encodings.size());
1296   EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
1297 }
1298 
1299 // Test that if we set/get parameters multiple times, we get the same results.
TEST_P(WebRtcVoiceEngineTestFake,SetAndGetRtpSendParameters)1300 TEST_P(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
1301   EXPECT_TRUE(SetupSendStream());
1302   cricket::AudioSendParameters parameters;
1303   parameters.codecs.push_back(kOpusCodec);
1304   parameters.codecs.push_back(kPcmuCodec);
1305   SetSendParameters(parameters);
1306 
1307   webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrcX);
1308 
1309   // We should be able to set the params we just got.
1310   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, initial_params).ok());
1311 
1312   // ... And this shouldn't change the params returned by GetRtpSendParameters.
1313   webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrcX);
1314   EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrcX));
1315 }
1316 
1317 // Test that max_bitrate_bps in send stream config gets updated correctly when
1318 // SetRtpSendParameters is called.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterUpdatesMaxBitrate)1319 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesMaxBitrate) {
1320   EXPECT_TRUE(SetupSendStream());
1321   cricket::AudioSendParameters send_parameters;
1322   send_parameters.codecs.push_back(kOpusCodec);
1323   SetSendParameters(send_parameters);
1324 
1325   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1326   // Expect empty on parameters.encodings[0].max_bitrate_bps;
1327   EXPECT_FALSE(rtp_parameters.encodings[0].max_bitrate_bps);
1328 
1329   constexpr int kMaxBitrateBps = 6000;
1330   rtp_parameters.encodings[0].max_bitrate_bps = kMaxBitrateBps;
1331   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1332 
1333   const int max_bitrate = GetSendStreamConfig(kSsrcX).max_bitrate_bps;
1334   EXPECT_EQ(max_bitrate, kMaxBitrateBps);
1335 }
1336 
1337 // Tests that when RTCRtpEncodingParameters.bitrate_priority gets set to
1338 // a value <= 0, setting the parameters returns false.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterInvalidBitratePriority)1339 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterInvalidBitratePriority) {
1340   EXPECT_TRUE(SetupSendStream());
1341   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1342   EXPECT_EQ(1UL, rtp_parameters.encodings.size());
1343   EXPECT_EQ(webrtc::kDefaultBitratePriority,
1344             rtp_parameters.encodings[0].bitrate_priority);
1345 
1346   rtp_parameters.encodings[0].bitrate_priority = 0;
1347   EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1348   rtp_parameters.encodings[0].bitrate_priority = -1.0;
1349   EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1350 }
1351 
1352 // Test that the bitrate_priority in the send stream config gets updated when
1353 // SetRtpSendParameters is set for the VoiceMediaChannel.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterUpdatesBitratePriority)1354 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesBitratePriority) {
1355   EXPECT_TRUE(SetupSendStream());
1356   webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1357 
1358   EXPECT_EQ(1UL, rtp_parameters.encodings.size());
1359   EXPECT_EQ(webrtc::kDefaultBitratePriority,
1360             rtp_parameters.encodings[0].bitrate_priority);
1361   double new_bitrate_priority = 2.0;
1362   rtp_parameters.encodings[0].bitrate_priority = new_bitrate_priority;
1363   EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1364 
1365   // The priority should get set for both the audio channel's rtp parameters
1366   // and the audio send stream's audio config.
1367   EXPECT_EQ(
1368       new_bitrate_priority,
1369       channel_->GetRtpSendParameters(kSsrcX).encodings[0].bitrate_priority);
1370   EXPECT_EQ(new_bitrate_priority, GetSendStreamConfig(kSsrcX).bitrate_priority);
1371 }
1372 
1373 // Test that GetRtpReceiveParameters returns the currently configured codecs.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersCodecs)1374 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1375   EXPECT_TRUE(SetupRecvStream());
1376   cricket::AudioRecvParameters parameters;
1377   parameters.codecs.push_back(kOpusCodec);
1378   parameters.codecs.push_back(kPcmuCodec);
1379   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1380 
1381   webrtc::RtpParameters rtp_parameters =
1382       channel_->GetRtpReceiveParameters(kSsrcX);
1383   ASSERT_EQ(2u, rtp_parameters.codecs.size());
1384   EXPECT_EQ(kOpusCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1385   EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1386 }
1387 
1388 // Test that GetRtpReceiveParameters returns an SSRC.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersSsrc)1389 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
1390   EXPECT_TRUE(SetupRecvStream());
1391   webrtc::RtpParameters rtp_parameters =
1392       channel_->GetRtpReceiveParameters(kSsrcX);
1393   ASSERT_EQ(1u, rtp_parameters.encodings.size());
1394   EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
1395 }
1396 
1397 // Test that if we set/get parameters multiple times, we get the same results.
TEST_P(WebRtcVoiceEngineTestFake,SetAndGetRtpReceiveParameters)1398 TEST_P(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1399   EXPECT_TRUE(SetupRecvStream());
1400   cricket::AudioRecvParameters parameters;
1401   parameters.codecs.push_back(kOpusCodec);
1402   parameters.codecs.push_back(kPcmuCodec);
1403   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1404 
1405   webrtc::RtpParameters initial_params =
1406       channel_->GetRtpReceiveParameters(kSsrcX);
1407 
1408   // ... And this shouldn't change the params returned by
1409   // GetRtpReceiveParameters.
1410   webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrcX);
1411   EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrcX));
1412 }
1413 
1414 // Test that GetRtpReceiveParameters returns parameters correctly when SSRCs
1415 // aren't signaled. It should return an empty "RtpEncodingParameters" when
1416 // configured to receive an unsignaled stream and no packets have been received
1417 // yet, and start returning the SSRC once a packet has been received.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersWithUnsignaledSsrc)1418 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersWithUnsignaledSsrc) {
1419   ASSERT_TRUE(SetupChannel());
1420   // Call necessary methods to configure receiving a default stream as
1421   // soon as it arrives.
1422   cricket::AudioRecvParameters parameters;
1423   parameters.codecs.push_back(kOpusCodec);
1424   parameters.codecs.push_back(kPcmuCodec);
1425   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1426 
1427   // Call GetDefaultRtpReceiveParameters before configured to receive an
1428   // unsignaled stream. Should return nothing.
1429   EXPECT_EQ(webrtc::RtpParameters(),
1430             channel_->GetDefaultRtpReceiveParameters());
1431 
1432   // Set a sink for an unsignaled stream.
1433   std::unique_ptr<FakeAudioSink> fake_sink(new FakeAudioSink());
1434   channel_->SetDefaultRawAudioSink(std::move(fake_sink));
1435 
1436   // Call GetDefaultRtpReceiveParameters before the SSRC is known.
1437   webrtc::RtpParameters rtp_parameters =
1438       channel_->GetDefaultRtpReceiveParameters();
1439   ASSERT_EQ(1u, rtp_parameters.encodings.size());
1440   EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
1441 
1442   // Receive PCMU packet (SSRC=1).
1443   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
1444 
1445   // The `ssrc` member should still be unset.
1446   rtp_parameters = channel_->GetDefaultRtpReceiveParameters();
1447   ASSERT_EQ(1u, rtp_parameters.encodings.size());
1448   EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
1449 }
1450 
1451 // Test that we apply codecs properly.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecs)1452 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecs) {
1453   EXPECT_TRUE(SetupSendStream());
1454   cricket::AudioSendParameters parameters;
1455   parameters.codecs.push_back(kOpusCodec);
1456   parameters.codecs.push_back(kPcmuCodec);
1457   parameters.codecs.push_back(kCn8000Codec);
1458   parameters.codecs[0].id = 96;
1459   parameters.codecs[0].bitrate = 22000;
1460   SetSendParameters(parameters);
1461   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1462   EXPECT_EQ(96, send_codec_spec.payload_type);
1463   EXPECT_EQ(22000, send_codec_spec.target_bitrate_bps);
1464   EXPECT_STRCASEEQ("OPUS", send_codec_spec.format.name.c_str());
1465   EXPECT_NE(send_codec_spec.format.clockrate_hz, 8000);
1466   EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
1467   EXPECT_FALSE(channel_->CanInsertDtmf());
1468 }
1469 
1470 // Test that we use Opus/Red by default when it is
1471 // listed as the first codec and there is an fmtp line.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRed)1472 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRed) {
1473   EXPECT_TRUE(SetupSendStream());
1474   cricket::AudioSendParameters parameters;
1475   parameters.codecs.push_back(kRed48000Codec);
1476   parameters.codecs[0].params[""] = "111/111";
1477   parameters.codecs.push_back(kOpusCodec);
1478   SetSendParameters(parameters);
1479   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1480   EXPECT_EQ(111, send_codec_spec.payload_type);
1481   EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1482   EXPECT_EQ(112, send_codec_spec.red_payload_type);
1483 }
1484 
1485 // Test that we do not use Opus/Red by default when it is
1486 // listed as the first codec but there is no fmtp line.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedNoFmtp)1487 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedNoFmtp) {
1488   EXPECT_TRUE(SetupSendStream());
1489   cricket::AudioSendParameters parameters;
1490   parameters.codecs.push_back(kRed48000Codec);
1491   parameters.codecs.push_back(kOpusCodec);
1492   SetSendParameters(parameters);
1493   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1494   EXPECT_EQ(111, send_codec_spec.payload_type);
1495   EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1496   EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1497 }
1498 
1499 // Test that we do not use Opus/Red by default.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedDefault)1500 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedDefault) {
1501   EXPECT_TRUE(SetupSendStream());
1502   cricket::AudioSendParameters parameters;
1503   parameters.codecs.push_back(kOpusCodec);
1504   parameters.codecs.push_back(kRed48000Codec);
1505   parameters.codecs[1].params[""] = "111/111";
1506   SetSendParameters(parameters);
1507   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1508   EXPECT_EQ(111, send_codec_spec.payload_type);
1509   EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1510   EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1511 }
1512 
1513 // Test that the RED fmtp line must match the payload type.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedFmtpMismatch)1514 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedFmtpMismatch) {
1515   EXPECT_TRUE(SetupSendStream());
1516   cricket::AudioSendParameters parameters;
1517   parameters.codecs.push_back(kRed48000Codec);
1518   parameters.codecs[0].params[""] = "8/8";
1519   parameters.codecs.push_back(kOpusCodec);
1520   SetSendParameters(parameters);
1521   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1522   EXPECT_EQ(111, send_codec_spec.payload_type);
1523   EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1524   EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1525 }
1526 
1527 // Test that the RED fmtp line must show 2..32 payloads.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedFmtpAmountOfRedundancy)1528 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedFmtpAmountOfRedundancy) {
1529   EXPECT_TRUE(SetupSendStream());
1530   cricket::AudioSendParameters parameters;
1531   parameters.codecs.push_back(kRed48000Codec);
1532   parameters.codecs[0].params[""] = "111";
1533   parameters.codecs.push_back(kOpusCodec);
1534   SetSendParameters(parameters);
1535   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1536   EXPECT_EQ(111, send_codec_spec.payload_type);
1537   EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1538   EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1539   for (int i = 1; i < 32; i++) {
1540     parameters.codecs[0].params[""] += "/111";
1541     SetSendParameters(parameters);
1542     const auto& send_codec_spec2 = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1543     EXPECT_EQ(111, send_codec_spec2.payload_type);
1544     EXPECT_STRCASEEQ("opus", send_codec_spec2.format.name.c_str());
1545     EXPECT_EQ(112, send_codec_spec2.red_payload_type);
1546   }
1547   parameters.codecs[0].params[""] += "/111";
1548   SetSendParameters(parameters);
1549   const auto& send_codec_spec3 = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1550   EXPECT_EQ(111, send_codec_spec3.payload_type);
1551   EXPECT_STRCASEEQ("opus", send_codec_spec3.format.name.c_str());
1552   EXPECT_EQ(absl::nullopt, send_codec_spec3.red_payload_type);
1553 }
1554 
1555 // Test that WebRtcVoiceEngine reconfigures, rather than recreates its
1556 // AudioSendStream.
TEST_P(WebRtcVoiceEngineTestFake,DontRecreateSendStream)1557 TEST_P(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
1558   EXPECT_TRUE(SetupSendStream());
1559   cricket::AudioSendParameters parameters;
1560   parameters.codecs.push_back(kOpusCodec);
1561   parameters.codecs.push_back(kPcmuCodec);
1562   parameters.codecs.push_back(kCn8000Codec);
1563   parameters.codecs[0].id = 96;
1564   parameters.codecs[0].bitrate = 48000;
1565   const int initial_num = call_.GetNumCreatedSendStreams();
1566   SetSendParameters(parameters);
1567   EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1568   // Calling SetSendCodec again with same codec which is already set.
1569   // In this case media channel shouldn't send codec to VoE.
1570   SetSendParameters(parameters);
1571   EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1572 }
1573 
1574 // TODO(ossu): Revisit if these tests need to be here, now that these kinds of
1575 // tests should be available in AudioEncoderOpusTest.
1576 
1577 // Test that if clockrate is not 48000 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBadClockrate)1578 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
1579   EXPECT_TRUE(SetupSendStream());
1580   cricket::AudioSendParameters parameters;
1581   parameters.codecs.push_back(kOpusCodec);
1582   parameters.codecs[0].bitrate = 0;
1583   parameters.codecs[0].clockrate = 50000;
1584   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1585 }
1586 
1587 // Test that if channels=0 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad0ChannelsNoStereo)1588 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
1589   EXPECT_TRUE(SetupSendStream());
1590   cricket::AudioSendParameters parameters;
1591   parameters.codecs.push_back(kOpusCodec);
1592   parameters.codecs[0].bitrate = 0;
1593   parameters.codecs[0].channels = 0;
1594   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1595 }
1596 
1597 // Test that if channels=0 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad0Channels1Stereo)1598 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
1599   EXPECT_TRUE(SetupSendStream());
1600   cricket::AudioSendParameters parameters;
1601   parameters.codecs.push_back(kOpusCodec);
1602   parameters.codecs[0].bitrate = 0;
1603   parameters.codecs[0].channels = 0;
1604   parameters.codecs[0].params["stereo"] = "1";
1605   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1606 }
1607 
1608 // Test that if channel is 1 for opus and there's no stereo, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpus1ChannelNoStereo)1609 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
1610   EXPECT_TRUE(SetupSendStream());
1611   cricket::AudioSendParameters parameters;
1612   parameters.codecs.push_back(kOpusCodec);
1613   parameters.codecs[0].bitrate = 0;
1614   parameters.codecs[0].channels = 1;
1615   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1616 }
1617 
1618 // Test that if channel is 1 for opus and stereo=0, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad1Channel0Stereo)1619 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
1620   EXPECT_TRUE(SetupSendStream());
1621   cricket::AudioSendParameters parameters;
1622   parameters.codecs.push_back(kOpusCodec);
1623   parameters.codecs[0].bitrate = 0;
1624   parameters.codecs[0].channels = 1;
1625   parameters.codecs[0].params["stereo"] = "0";
1626   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1627 }
1628 
1629 // Test that if channel is 1 for opus and stereo=1, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad1Channel1Stereo)1630 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
1631   EXPECT_TRUE(SetupSendStream());
1632   cricket::AudioSendParameters parameters;
1633   parameters.codecs.push_back(kOpusCodec);
1634   parameters.codecs[0].bitrate = 0;
1635   parameters.codecs[0].channels = 1;
1636   parameters.codecs[0].params["stereo"] = "1";
1637   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1638 }
1639 
1640 // Test that with bitrate=0 and no stereo, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0BitrateNoStereo)1641 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
1642   EXPECT_TRUE(SetupSendStream());
1643   cricket::AudioSendParameters parameters;
1644   parameters.codecs.push_back(kOpusCodec);
1645   parameters.codecs[0].bitrate = 0;
1646   SetSendParameters(parameters);
1647   CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1648 }
1649 
1650 // Test that with bitrate=0 and stereo=0, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0Bitrate0Stereo)1651 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
1652   EXPECT_TRUE(SetupSendStream());
1653   cricket::AudioSendParameters parameters;
1654   parameters.codecs.push_back(kOpusCodec);
1655   parameters.codecs[0].bitrate = 0;
1656   parameters.codecs[0].params["stereo"] = "0";
1657   SetSendParameters(parameters);
1658   CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1659 }
1660 
1661 // Test that with bitrate=invalid and stereo=0, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodXBitrate0Stereo)1662 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
1663   EXPECT_TRUE(SetupSendStream());
1664   cricket::AudioSendParameters parameters;
1665   parameters.codecs.push_back(kOpusCodec);
1666   parameters.codecs[0].params["stereo"] = "0";
1667   // bitrate that's out of the range between 6000 and 510000 will be clamped.
1668   parameters.codecs[0].bitrate = 5999;
1669   SetSendParameters(parameters);
1670   CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1671 
1672   parameters.codecs[0].bitrate = 510001;
1673   SetSendParameters(parameters);
1674   CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1675 }
1676 
1677 // Test that with bitrate=0 and stereo=1, bitrate is 64000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0Bitrate1Stereo)1678 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
1679   EXPECT_TRUE(SetupSendStream());
1680   cricket::AudioSendParameters parameters;
1681   parameters.codecs.push_back(kOpusCodec);
1682   parameters.codecs[0].bitrate = 0;
1683   parameters.codecs[0].params["stereo"] = "1";
1684   SetSendParameters(parameters);
1685   CheckSendCodecBitrate(kSsrcX, "opus", 64000);
1686 }
1687 
1688 // Test that with bitrate=invalid and stereo=1, bitrate is 64000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodXBitrate1Stereo)1689 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
1690   EXPECT_TRUE(SetupSendStream());
1691   cricket::AudioSendParameters parameters;
1692   parameters.codecs.push_back(kOpusCodec);
1693   parameters.codecs[0].params["stereo"] = "1";
1694   // bitrate that's out of the range between 6000 and 510000 will be clamped.
1695   parameters.codecs[0].bitrate = 5999;
1696   SetSendParameters(parameters);
1697   CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1698 
1699   parameters.codecs[0].bitrate = 510001;
1700   SetSendParameters(parameters);
1701   CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1702 }
1703 
1704 // Test that with bitrate=N and stereo unset, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrateNoStereo)1705 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
1706   EXPECT_TRUE(SetupSendStream());
1707   cricket::AudioSendParameters parameters;
1708   parameters.codecs.push_back(kOpusCodec);
1709   parameters.codecs[0].bitrate = 96000;
1710   SetSendParameters(parameters);
1711   const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1712   EXPECT_EQ(111, spec.payload_type);
1713   EXPECT_EQ(96000, spec.target_bitrate_bps);
1714   EXPECT_EQ("opus", spec.format.name);
1715   EXPECT_EQ(2u, spec.format.num_channels);
1716   EXPECT_EQ(48000, spec.format.clockrate_hz);
1717 }
1718 
1719 // Test that with bitrate=N and stereo=0, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrate0Stereo)1720 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
1721   EXPECT_TRUE(SetupSendStream());
1722   cricket::AudioSendParameters parameters;
1723   parameters.codecs.push_back(kOpusCodec);
1724   parameters.codecs[0].bitrate = 30000;
1725   parameters.codecs[0].params["stereo"] = "0";
1726   SetSendParameters(parameters);
1727   CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1728 }
1729 
1730 // Test that with bitrate=N and without any parameters, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrateNoParameters)1731 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
1732   EXPECT_TRUE(SetupSendStream());
1733   cricket::AudioSendParameters parameters;
1734   parameters.codecs.push_back(kOpusCodec);
1735   parameters.codecs[0].bitrate = 30000;
1736   SetSendParameters(parameters);
1737   CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1738 }
1739 
1740 // Test that with bitrate=N and stereo=1, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrate1Stereo)1741 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
1742   EXPECT_TRUE(SetupSendStream());
1743   cricket::AudioSendParameters parameters;
1744   parameters.codecs.push_back(kOpusCodec);
1745   parameters.codecs[0].bitrate = 30000;
1746   parameters.codecs[0].params["stereo"] = "1";
1747   SetSendParameters(parameters);
1748   CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1749 }
1750 
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithBitrates)1751 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1752   SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1753                                      200000);
1754 }
1755 
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithHighMaxBitrate)1756 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1757   SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1758 }
1759 
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithoutBitratesUsesCorrectDefaults)1760 TEST_P(WebRtcVoiceEngineTestFake,
1761        SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1762   SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1763 }
1764 
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCapsMinAndStartBitrate)1765 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1766   SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1767 }
1768 
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthForAudioDoesntAffectBwe)1769 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthForAudioDoesntAffectBwe) {
1770   SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1771                                      200000);
1772   send_parameters_.max_bandwidth_bps = 100000;
1773   // Setting max bitrate should keep previous min bitrate
1774   // Setting max bitrate should not reset start bitrate.
1775   EXPECT_CALL(*call_.GetMockTransportControllerSend(),
1776               SetSdpBitrateParameters(
1777                   AllOf(Field(&BitrateConstraints::min_bitrate_bps, 100000),
1778                         Field(&BitrateConstraints::start_bitrate_bps, -1),
1779                         Field(&BitrateConstraints::max_bitrate_bps, 200000))));
1780   SetSendParameters(send_parameters_);
1781 }
1782 
1783 // Test that we can enable NACK with opus as callee.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecEnableNackAsCallee)1784 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
1785   EXPECT_TRUE(SetupRecvStream());
1786   cricket::AudioSendParameters parameters;
1787   parameters.codecs.push_back(kOpusCodec);
1788   parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1789       cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1790   EXPECT_EQ(0, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1791   SetSendParameters(parameters);
1792   // NACK should be enabled even with no send stream.
1793   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1794 
1795   EXPECT_TRUE(
1796       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
1797 }
1798 
1799 // Test that we can enable NACK on receive streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecEnableNackRecvStreams)1800 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1801   EXPECT_TRUE(SetupSendStream());
1802   EXPECT_TRUE(AddRecvStream(kSsrcY));
1803   cricket::AudioSendParameters parameters;
1804   parameters.codecs.push_back(kOpusCodec);
1805   parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1806       cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1807   EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1808   SetSendParameters(parameters);
1809   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1810 }
1811 
1812 // Test that we can disable NACK on receive streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecDisableNackRecvStreams)1813 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1814   EXPECT_TRUE(SetupSendStream());
1815   EXPECT_TRUE(AddRecvStream(kSsrcY));
1816   cricket::AudioSendParameters parameters;
1817   parameters.codecs.push_back(kOpusCodec);
1818   parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1819       cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1820   SetSendParameters(parameters);
1821   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1822 
1823   parameters.codecs.clear();
1824   parameters.codecs.push_back(kOpusCodec);
1825   SetSendParameters(parameters);
1826   EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1827 }
1828 
1829 // Test that NACK is enabled on a new receive stream.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamEnableNack)1830 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1831   EXPECT_TRUE(SetupSendStream());
1832   cricket::AudioSendParameters parameters;
1833   parameters.codecs.push_back(kOpusCodec);
1834   parameters.codecs.push_back(kCn16000Codec);
1835   parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1836       cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1837   SetSendParameters(parameters);
1838 
1839   EXPECT_TRUE(AddRecvStream(kSsrcY));
1840   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1841   EXPECT_TRUE(AddRecvStream(kSsrcZ));
1842   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms);
1843 }
1844 
TEST_P(WebRtcVoiceEngineTestFake,TransportCcCanBeEnabledAndDisabled)1845 TEST_P(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1846   EXPECT_TRUE(SetupChannel());
1847   cricket::AudioSendParameters send_parameters;
1848   send_parameters.codecs.push_back(kOpusCodec);
1849   EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1850   SetSendParameters(send_parameters);
1851 
1852   cricket::AudioRecvParameters recv_parameters;
1853   recv_parameters.codecs.push_back(kOpusCodec);
1854   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1855   EXPECT_TRUE(AddRecvStream(kSsrcX));
1856   ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1857   EXPECT_FALSE(call_.GetAudioReceiveStream(kSsrcX)->transport_cc());
1858 
1859   send_parameters.codecs = engine_->send_codecs();
1860   SetSendParameters(send_parameters);
1861   ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1862   EXPECT_TRUE(call_.GetAudioReceiveStream(kSsrcX)->transport_cc());
1863 }
1864 
1865 // Test that we can switch back and forth between Opus and PCMU with CN.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsOpusPcmuSwitching)1866 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsOpusPcmuSwitching) {
1867   EXPECT_TRUE(SetupSendStream());
1868 
1869   cricket::AudioSendParameters opus_parameters;
1870   opus_parameters.codecs.push_back(kOpusCodec);
1871   SetSendParameters(opus_parameters);
1872   {
1873     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1874     EXPECT_EQ(111, spec.payload_type);
1875     EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1876   }
1877 
1878   cricket::AudioSendParameters pcmu_parameters;
1879   pcmu_parameters.codecs.push_back(kPcmuCodec);
1880   pcmu_parameters.codecs.push_back(kCn16000Codec);
1881   pcmu_parameters.codecs.push_back(kOpusCodec);
1882   SetSendParameters(pcmu_parameters);
1883   {
1884     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1885     EXPECT_EQ(0, spec.payload_type);
1886     EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1887   }
1888 
1889   SetSendParameters(opus_parameters);
1890   {
1891     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1892     EXPECT_EQ(111, spec.payload_type);
1893     EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1894   }
1895 }
1896 
1897 // Test that we handle various ways of specifying bitrate.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsBitrate)1898 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1899   EXPECT_TRUE(SetupSendStream());
1900   cricket::AudioSendParameters parameters;
1901   parameters.codecs.push_back(kPcmuCodec);
1902   SetSendParameters(parameters);
1903   {
1904     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1905     EXPECT_EQ(0, spec.payload_type);
1906     EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1907     EXPECT_EQ(64000, spec.target_bitrate_bps);
1908   }
1909 
1910   parameters.codecs[0].bitrate = 0;  // bitrate == default
1911   SetSendParameters(parameters);
1912   {
1913     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1914     EXPECT_EQ(0, spec.payload_type);
1915     EXPECT_STREQ("PCMU", spec.format.name.c_str());
1916     EXPECT_EQ(64000, spec.target_bitrate_bps);
1917   }
1918 
1919   parameters.codecs[0] = kOpusCodec;
1920   parameters.codecs[0].bitrate = 0;  // bitrate == default
1921   SetSendParameters(parameters);
1922   {
1923     const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1924     EXPECT_EQ(111, spec.payload_type);
1925     EXPECT_STREQ("opus", spec.format.name.c_str());
1926     EXPECT_EQ(32000, spec.target_bitrate_bps);
1927   }
1928 }
1929 
1930 // Test that we fail if no codecs are specified.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsNoCodecs)1931 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1932   EXPECT_TRUE(SetupSendStream());
1933   cricket::AudioSendParameters parameters;
1934   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1935 }
1936 
1937 // Test that we can set send codecs even with telephone-event codec as the first
1938 // one on the list.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsDTMFOnTop)1939 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1940   EXPECT_TRUE(SetupSendStream());
1941   cricket::AudioSendParameters parameters;
1942   parameters.codecs.push_back(kTelephoneEventCodec1);
1943   parameters.codecs.push_back(kOpusCodec);
1944   parameters.codecs.push_back(kPcmuCodec);
1945   parameters.codecs[0].id = 98;  // DTMF
1946   parameters.codecs[1].id = 96;
1947   SetSendParameters(parameters);
1948   const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1949   EXPECT_EQ(96, spec.payload_type);
1950   EXPECT_STRCASEEQ("OPUS", spec.format.name.c_str());
1951   SetSend(true);
1952   EXPECT_TRUE(channel_->CanInsertDtmf());
1953 }
1954 
1955 // Test that CanInsertDtmf() is governed by the send flag
TEST_P(WebRtcVoiceEngineTestFake,DTMFControlledBySendFlag)1956 TEST_P(WebRtcVoiceEngineTestFake, DTMFControlledBySendFlag) {
1957   EXPECT_TRUE(SetupSendStream());
1958   cricket::AudioSendParameters parameters;
1959   parameters.codecs.push_back(kTelephoneEventCodec1);
1960   parameters.codecs.push_back(kPcmuCodec);
1961   parameters.codecs[0].id = 98;  // DTMF
1962   parameters.codecs[1].id = 96;
1963   SetSendParameters(parameters);
1964   EXPECT_FALSE(channel_->CanInsertDtmf());
1965   SetSend(true);
1966   EXPECT_TRUE(channel_->CanInsertDtmf());
1967   SetSend(false);
1968   EXPECT_FALSE(channel_->CanInsertDtmf());
1969 }
1970 
1971 // Test that payload type range is limited for telephone-event codec.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsDTMFPayloadTypeOutOfRange)1972 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
1973   EXPECT_TRUE(SetupSendStream());
1974   cricket::AudioSendParameters parameters;
1975   parameters.codecs.push_back(kTelephoneEventCodec2);
1976   parameters.codecs.push_back(kOpusCodec);
1977   parameters.codecs[0].id = 0;  // DTMF
1978   parameters.codecs[1].id = 96;
1979   SetSendParameters(parameters);
1980   SetSend(true);
1981   EXPECT_TRUE(channel_->CanInsertDtmf());
1982   parameters.codecs[0].id = 128;  // DTMF
1983   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1984   EXPECT_FALSE(channel_->CanInsertDtmf());
1985   parameters.codecs[0].id = 127;
1986   SetSendParameters(parameters);
1987   EXPECT_TRUE(channel_->CanInsertDtmf());
1988   parameters.codecs[0].id = -1;  // DTMF
1989   EXPECT_FALSE(channel_->SetSendParameters(parameters));
1990   EXPECT_FALSE(channel_->CanInsertDtmf());
1991 }
1992 
1993 // Test that we can set send codecs even with CN codec as the first
1994 // one on the list.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNOnTop)1995 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1996   EXPECT_TRUE(SetupSendStream());
1997   cricket::AudioSendParameters parameters;
1998   parameters.codecs.push_back(kCn8000Codec);
1999   parameters.codecs.push_back(kPcmuCodec);
2000   parameters.codecs[0].id = 98;  // narrowband CN
2001   SetSendParameters(parameters);
2002   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2003   EXPECT_EQ(0, send_codec_spec.payload_type);
2004   EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2005   EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2006 }
2007 
2008 // Test that we set VAD and DTMF types correctly as caller.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNandDTMFAsCaller)2009 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
2010   EXPECT_TRUE(SetupSendStream());
2011   cricket::AudioSendParameters parameters;
2012   parameters.codecs.push_back(kPcmuCodec);
2013   parameters.codecs.push_back(kCn16000Codec);
2014   parameters.codecs.push_back(kCn8000Codec);
2015   parameters.codecs.push_back(kTelephoneEventCodec1);
2016   parameters.codecs[0].id = 96;
2017   parameters.codecs[2].id = 97;  // narrowband CN
2018   parameters.codecs[3].id = 98;  // DTMF
2019   SetSendParameters(parameters);
2020   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2021   EXPECT_EQ(96, send_codec_spec.payload_type);
2022   EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2023   EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2024   EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2025   SetSend(true);
2026   EXPECT_TRUE(channel_->CanInsertDtmf());
2027 }
2028 
2029 // Test that we set VAD and DTMF types correctly as callee.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNandDTMFAsCallee)2030 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
2031   EXPECT_TRUE(SetupChannel());
2032   cricket::AudioSendParameters parameters;
2033   parameters.codecs.push_back(kPcmuCodec);
2034   parameters.codecs.push_back(kCn16000Codec);
2035   parameters.codecs.push_back(kCn8000Codec);
2036   parameters.codecs.push_back(kTelephoneEventCodec2);
2037   parameters.codecs[0].id = 96;
2038   parameters.codecs[2].id = 97;  // narrowband CN
2039   parameters.codecs[3].id = 98;  // DTMF
2040   SetSendParameters(parameters);
2041   EXPECT_TRUE(
2042       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
2043 
2044   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2045   EXPECT_EQ(96, send_codec_spec.payload_type);
2046   EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2047   EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2048   EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2049   SetSend(true);
2050   EXPECT_TRUE(channel_->CanInsertDtmf());
2051 }
2052 
2053 // Test that we only apply VAD if we have a CN codec that matches the
2054 // send codec clockrate.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNNoMatch)2055 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
2056   EXPECT_TRUE(SetupSendStream());
2057   cricket::AudioSendParameters parameters;
2058   // Set PCMU(8K) and CN(16K). VAD should not be activated.
2059   parameters.codecs.push_back(kPcmuCodec);
2060   parameters.codecs.push_back(kCn16000Codec);
2061   parameters.codecs[1].id = 97;
2062   SetSendParameters(parameters);
2063   {
2064     const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2065     EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2066     EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2067   }
2068   // Set PCMU(8K) and CN(8K). VAD should be activated.
2069   parameters.codecs[1] = kCn8000Codec;
2070   SetSendParameters(parameters);
2071   {
2072     const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2073     EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2074     EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2075     EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2076   }
2077   // Set OPUS(48K) and CN(8K). VAD should not be activated.
2078   parameters.codecs[0] = kOpusCodec;
2079   SetSendParameters(parameters);
2080   {
2081     const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2082     EXPECT_STRCASEEQ("OPUS", send_codec_spec.format.name.c_str());
2083     EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2084   }
2085 }
2086 
2087 // Test that we perform case-insensitive matching of codec names.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCaseInsensitive)2088 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
2089   EXPECT_TRUE(SetupSendStream());
2090   cricket::AudioSendParameters parameters;
2091   parameters.codecs.push_back(kPcmuCodec);
2092   parameters.codecs.push_back(kCn16000Codec);
2093   parameters.codecs.push_back(kCn8000Codec);
2094   parameters.codecs.push_back(kTelephoneEventCodec1);
2095   parameters.codecs[0].name = "PcMu";
2096   parameters.codecs[0].id = 96;
2097   parameters.codecs[2].id = 97;  // narrowband CN
2098   parameters.codecs[3].id = 98;  // DTMF
2099   SetSendParameters(parameters);
2100   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2101   EXPECT_EQ(96, send_codec_spec.payload_type);
2102   EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2103   EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2104   EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2105   SetSend(true);
2106   EXPECT_TRUE(channel_->CanInsertDtmf());
2107 }
2108 
TEST_P(WebRtcVoiceEngineTestFake,SupportsTransportSequenceNumberHeaderExtension)2109 TEST_P(WebRtcVoiceEngineTestFake,
2110        SupportsTransportSequenceNumberHeaderExtension) {
2111   const std::vector<webrtc::RtpExtension> header_extensions =
2112       GetDefaultEnabledRtpHeaderExtensions(*engine_);
2113   EXPECT_THAT(header_extensions,
2114               Contains(::testing::Field(
2115                   "uri", &RtpExtension::uri,
2116                   webrtc::RtpExtension::kTransportSequenceNumberUri)));
2117 }
2118 
2119 // Test support for audio level header extension.
TEST_P(WebRtcVoiceEngineTestFake,SendAudioLevelHeaderExtensions)2120 TEST_P(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2121   TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
2122 }
TEST_P(WebRtcVoiceEngineTestFake,RecvAudioLevelHeaderExtensions)2123 TEST_P(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2124   TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
2125 }
2126 
2127 // Test support for transport sequence number header extension.
TEST_P(WebRtcVoiceEngineTestFake,SendTransportSequenceNumberHeaderExtensions)2128 TEST_P(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2129   TestSetSendRtpHeaderExtensions(
2130       webrtc::RtpExtension::kTransportSequenceNumberUri);
2131 }
TEST_P(WebRtcVoiceEngineTestFake,RecvTransportSequenceNumberHeaderExtensions)2132 TEST_P(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2133   TestSetRecvRtpHeaderExtensions(
2134       webrtc::RtpExtension::kTransportSequenceNumberUri);
2135 }
2136 
2137 // Test that we can create a channel and start sending on it.
TEST_P(WebRtcVoiceEngineTestFake,Send)2138 TEST_P(WebRtcVoiceEngineTestFake, Send) {
2139   EXPECT_TRUE(SetupSendStream());
2140   SetSendParameters(send_parameters_);
2141   SetSend(true);
2142   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2143   SetSend(false);
2144   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2145 }
2146 
2147 // Test that a channel will send if and only if it has a source and is enabled
2148 // for sending.
TEST_P(WebRtcVoiceEngineTestFake,SendStateWithAndWithoutSource)2149 TEST_P(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
2150   EXPECT_TRUE(SetupSendStream());
2151   SetSendParameters(send_parameters_);
2152   SetAudioSend(kSsrcX, true, nullptr);
2153   SetSend(true);
2154   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2155   SetAudioSend(kSsrcX, true, &fake_source_);
2156   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2157   SetAudioSend(kSsrcX, true, nullptr);
2158   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2159 }
2160 
2161 // Test that a channel is muted/unmuted.
TEST_P(WebRtcVoiceEngineTestFake,SendStateMuteUnmute)2162 TEST_P(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2163   EXPECT_TRUE(SetupSendStream());
2164   SetSendParameters(send_parameters_);
2165   EXPECT_FALSE(GetSendStream(kSsrcX).muted());
2166   SetAudioSend(kSsrcX, true, nullptr);
2167   EXPECT_FALSE(GetSendStream(kSsrcX).muted());
2168   SetAudioSend(kSsrcX, false, nullptr);
2169   EXPECT_TRUE(GetSendStream(kSsrcX).muted());
2170 }
2171 
2172 // Test that SetSendParameters() does not alter a stream's send state.
TEST_P(WebRtcVoiceEngineTestFake,SendStateWhenStreamsAreRecreated)2173 TEST_P(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2174   EXPECT_TRUE(SetupSendStream());
2175   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2176 
2177   // Turn on sending.
2178   SetSend(true);
2179   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2180 
2181   // Changing RTP header extensions will recreate the AudioSendStream.
2182   send_parameters_.extensions.push_back(
2183       webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
2184   SetSendParameters(send_parameters_);
2185   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2186 
2187   // Turn off sending.
2188   SetSend(false);
2189   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2190 
2191   // Changing RTP header extensions will recreate the AudioSendStream.
2192   send_parameters_.extensions.clear();
2193   SetSendParameters(send_parameters_);
2194   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2195 }
2196 
2197 // Test that we can create a channel and start playing out on it.
TEST_P(WebRtcVoiceEngineTestFake,Playout)2198 TEST_P(WebRtcVoiceEngineTestFake, Playout) {
2199   EXPECT_TRUE(SetupRecvStream());
2200   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2201   channel_->SetPlayout(true);
2202   EXPECT_TRUE(GetRecvStream(kSsrcX).started());
2203   channel_->SetPlayout(false);
2204   EXPECT_FALSE(GetRecvStream(kSsrcX).started());
2205 }
2206 
2207 // Test that we can add and remove send streams.
TEST_P(WebRtcVoiceEngineTestFake,CreateAndDeleteMultipleSendStreams)2208 TEST_P(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2209   SetupForMultiSendStream();
2210 
2211   // Set the global state for sending.
2212   SetSend(true);
2213 
2214   for (uint32_t ssrc : kSsrcs4) {
2215     EXPECT_TRUE(
2216         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2217     SetAudioSend(ssrc, true, &fake_source_);
2218     // Verify that we are in a sending state for all the created streams.
2219     EXPECT_TRUE(GetSendStream(ssrc).IsSending());
2220   }
2221   EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
2222 
2223   // Delete the send streams.
2224   for (uint32_t ssrc : kSsrcs4) {
2225     EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
2226     EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
2227     EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
2228   }
2229   EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
2230 }
2231 
2232 // Test SetSendCodecs correctly configure the codecs in all send streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithMultipleSendStreams)2233 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2234   SetupForMultiSendStream();
2235 
2236   // Create send streams.
2237   for (uint32_t ssrc : kSsrcs4) {
2238     EXPECT_TRUE(
2239         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2240   }
2241 
2242   cricket::AudioSendParameters parameters;
2243   // Set PCMU and CN(8K). VAD should be activated.
2244   parameters.codecs.push_back(kPcmuCodec);
2245   parameters.codecs.push_back(kCn8000Codec);
2246   parameters.codecs[1].id = 97;
2247   SetSendParameters(parameters);
2248 
2249   // Verify PCMU and VAD are corrected configured on all send channels.
2250   for (uint32_t ssrc : kSsrcs4) {
2251     ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2252     const auto& send_codec_spec =
2253         *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2254     EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2255     EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2256     EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2257   }
2258 
2259   // Change to PCMU(8K) and CN(16K).
2260   parameters.codecs[0] = kPcmuCodec;
2261   parameters.codecs[1] = kCn16000Codec;
2262   SetSendParameters(parameters);
2263   for (uint32_t ssrc : kSsrcs4) {
2264     ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2265     const auto& send_codec_spec =
2266         *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2267     EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2268     EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2269   }
2270 }
2271 
2272 // Test we can SetSend on all send streams correctly.
TEST_P(WebRtcVoiceEngineTestFake,SetSendWithMultipleSendStreams)2273 TEST_P(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2274   SetupForMultiSendStream();
2275 
2276   // Create the send channels and they should be a "not sending" date.
2277   for (uint32_t ssrc : kSsrcs4) {
2278     EXPECT_TRUE(
2279         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2280     SetAudioSend(ssrc, true, &fake_source_);
2281     EXPECT_FALSE(GetSendStream(ssrc).IsSending());
2282   }
2283 
2284   // Set the global state for starting sending.
2285   SetSend(true);
2286   for (uint32_t ssrc : kSsrcs4) {
2287     // Verify that we are in a sending state for all the send streams.
2288     EXPECT_TRUE(GetSendStream(ssrc).IsSending());
2289   }
2290 
2291   // Set the global state for stopping sending.
2292   SetSend(false);
2293   for (uint32_t ssrc : kSsrcs4) {
2294     // Verify that we are in a stop state for all the send streams.
2295     EXPECT_FALSE(GetSendStream(ssrc).IsSending());
2296   }
2297 }
2298 
2299 // Test we can set the correct statistics on all send streams.
TEST_P(WebRtcVoiceEngineTestFake,GetStatsWithMultipleSendStreams)2300 TEST_P(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2301   SetupForMultiSendStream();
2302 
2303   // Create send streams.
2304   for (uint32_t ssrc : kSsrcs4) {
2305     EXPECT_TRUE(
2306         channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2307   }
2308 
2309   // Create a receive stream to check that none of the send streams end up in
2310   // the receive stream stats.
2311   EXPECT_TRUE(AddRecvStream(kSsrcY));
2312 
2313   // We need send codec to be set to get all stats.
2314   SetSendParameters(send_parameters_);
2315   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2316   SetAudioSendStreamStats();
2317 
2318   // Check stats for the added streams.
2319   {
2320     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2321     cricket::VoiceMediaInfo info;
2322     EXPECT_EQ(true,
2323               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2324 
2325     // We have added 4 send streams. We should see empty stats for all.
2326     EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2327     for (const auto& sender : info.senders) {
2328       VerifyVoiceSenderInfo(sender, false);
2329     }
2330     VerifyVoiceSendRecvCodecs(info);
2331 
2332     // We have added one receive stream. We should see empty stats.
2333     EXPECT_EQ(info.receivers.size(), 1u);
2334     EXPECT_EQ(info.receivers[0].ssrc(), 0u);
2335   }
2336 
2337   // Remove the kSsrcY stream. No receiver stats.
2338   {
2339     cricket::VoiceMediaInfo info;
2340     EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2341     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2342     EXPECT_EQ(true,
2343               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2344     EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2345     EXPECT_EQ(0u, info.receivers.size());
2346   }
2347 
2348   // Deliver a new packet - a default receive stream should be created and we
2349   // should see stats again.
2350   {
2351     cricket::VoiceMediaInfo info;
2352     DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2353     SetAudioReceiveStreamStats();
2354     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2355     EXPECT_EQ(true,
2356               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2357     EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2358     EXPECT_EQ(1u, info.receivers.size());
2359     VerifyVoiceReceiverInfo(info.receivers[0]);
2360     VerifyVoiceSendRecvCodecs(info);
2361   }
2362 }
2363 
2364 // Test that we can add and remove receive streams, and do proper send/playout.
2365 // We can receive on multiple streams while sending one stream.
TEST_P(WebRtcVoiceEngineTestFake,PlayoutWithMultipleStreams)2366 TEST_P(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
2367   EXPECT_TRUE(SetupSendStream());
2368 
2369   // Start playout without a receive stream.
2370   SetSendParameters(send_parameters_);
2371   channel_->SetPlayout(true);
2372 
2373   // Adding another stream should enable playout on the new stream only.
2374   EXPECT_TRUE(AddRecvStream(kSsrcY));
2375   SetSend(true);
2376   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2377 
2378   // Make sure only the new stream is played out.
2379   EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2380 
2381   // Adding yet another stream should have stream 2 and 3 enabled for playout.
2382   EXPECT_TRUE(AddRecvStream(kSsrcZ));
2383   EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2384   EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
2385 
2386   // Stop sending.
2387   SetSend(false);
2388   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2389 
2390   // Stop playout.
2391   channel_->SetPlayout(false);
2392   EXPECT_FALSE(GetRecvStream(kSsrcY).started());
2393   EXPECT_FALSE(GetRecvStream(kSsrcZ).started());
2394 
2395   // Restart playout and make sure recv streams are played out.
2396   channel_->SetPlayout(true);
2397   EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2398   EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
2399 
2400   // Now remove the recv streams.
2401   EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcZ));
2402   EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2403 }
2404 
TEST_P(WebRtcVoiceEngineTestFake,SetAudioNetworkAdaptorViaOptions)2405 TEST_P(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2406   EXPECT_TRUE(SetupSendStream());
2407   send_parameters_.options.audio_network_adaptor = true;
2408   send_parameters_.options.audio_network_adaptor_config = {"1234"};
2409   SetSendParameters(send_parameters_);
2410   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2411             GetAudioNetworkAdaptorConfig(kSsrcX));
2412 }
2413 
TEST_P(WebRtcVoiceEngineTestFake,AudioSendResetAudioNetworkAdaptor)2414 TEST_P(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2415   EXPECT_TRUE(SetupSendStream());
2416   send_parameters_.options.audio_network_adaptor = true;
2417   send_parameters_.options.audio_network_adaptor_config = {"1234"};
2418   SetSendParameters(send_parameters_);
2419   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2420             GetAudioNetworkAdaptorConfig(kSsrcX));
2421   cricket::AudioOptions options;
2422   options.audio_network_adaptor = false;
2423   SetAudioSend(kSsrcX, true, nullptr, &options);
2424   EXPECT_EQ(absl::nullopt, GetAudioNetworkAdaptorConfig(kSsrcX));
2425 }
2426 
TEST_P(WebRtcVoiceEngineTestFake,AudioNetworkAdaptorNotGetOverridden)2427 TEST_P(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2428   EXPECT_TRUE(SetupSendStream());
2429   send_parameters_.options.audio_network_adaptor = true;
2430   send_parameters_.options.audio_network_adaptor_config = {"1234"};
2431   SetSendParameters(send_parameters_);
2432   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2433             GetAudioNetworkAdaptorConfig(kSsrcX));
2434   const int initial_num = call_.GetNumCreatedSendStreams();
2435   cricket::AudioOptions options;
2436   options.audio_network_adaptor = absl::nullopt;
2437   // Unvalued `options.audio_network_adaptor` should not reset audio network
2438   // adaptor.
2439   SetAudioSend(kSsrcX, true, nullptr, &options);
2440   // AudioSendStream not expected to be recreated.
2441   EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2442   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2443             GetAudioNetworkAdaptorConfig(kSsrcX));
2444 }
2445 
2446 // Test that we can set the outgoing SSRC properly.
2447 // SSRC is set in SetupSendStream() by calling AddSendStream.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrc)2448 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2449   EXPECT_TRUE(SetupSendStream());
2450   EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2451 }
2452 
TEST_P(WebRtcVoiceEngineTestFake,GetStats)2453 TEST_P(WebRtcVoiceEngineTestFake, GetStats) {
2454   // Setup. We need send codec to be set to get all stats.
2455   EXPECT_TRUE(SetupSendStream());
2456   // SetupSendStream adds a send stream with kSsrcX, so the receive
2457   // stream has to use a different SSRC.
2458   EXPECT_TRUE(AddRecvStream(kSsrcY));
2459   SetSendParameters(send_parameters_);
2460   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2461   SetAudioSendStreamStats();
2462 
2463   // Check stats for the added streams.
2464   {
2465     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2466     cricket::VoiceMediaInfo info;
2467     EXPECT_EQ(true,
2468               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2469 
2470     // We have added one send stream. We should see the stats we've set.
2471     EXPECT_EQ(1u, info.senders.size());
2472     VerifyVoiceSenderInfo(info.senders[0], false);
2473     // We have added one receive stream. We should see empty stats.
2474     EXPECT_EQ(info.receivers.size(), 1u);
2475     EXPECT_EQ(info.receivers[0].ssrc(), 0u);
2476   }
2477 
2478   // Start sending - this affects some reported stats.
2479   {
2480     cricket::VoiceMediaInfo info;
2481     SetSend(true);
2482     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2483     EXPECT_EQ(true,
2484               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2485     VerifyVoiceSenderInfo(info.senders[0], true);
2486     VerifyVoiceSendRecvCodecs(info);
2487   }
2488 
2489   // Remove the kSsrcY stream. No receiver stats.
2490   {
2491     cricket::VoiceMediaInfo info;
2492     EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2493     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2494     EXPECT_EQ(true,
2495               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2496     EXPECT_EQ(1u, info.senders.size());
2497     EXPECT_EQ(0u, info.receivers.size());
2498   }
2499 
2500   // Deliver a new packet - a default receive stream should be created and we
2501   // should see stats again.
2502   {
2503     cricket::VoiceMediaInfo info;
2504     DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2505     SetAudioReceiveStreamStats();
2506     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2507     EXPECT_EQ(true,
2508               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2509     EXPECT_EQ(1u, info.senders.size());
2510     EXPECT_EQ(1u, info.receivers.size());
2511     VerifyVoiceReceiverInfo(info.receivers[0]);
2512     VerifyVoiceSendRecvCodecs(info);
2513   }
2514 }
2515 
2516 // Test that we can set the outgoing SSRC properly with multiple streams.
2517 // SSRC is set in SetupSendStream() by calling AddSendStream.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrcWithMultipleStreams)2518 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2519   EXPECT_TRUE(SetupSendStream());
2520   EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2521   EXPECT_TRUE(AddRecvStream(kSsrcY));
2522   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
2523 }
2524 
2525 // Test that the local SSRC is the same on sending and receiving channels if the
2526 // receive channel is created before the send channel.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrcAfterCreatingReceiveChannel)2527 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
2528   EXPECT_TRUE(SetupChannel());
2529   EXPECT_TRUE(AddRecvStream(kSsrcY));
2530   EXPECT_TRUE(
2531       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
2532   EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2533   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
2534 }
2535 
2536 // Test that we can properly receive packets.
TEST_P(WebRtcVoiceEngineTestFake,Recv)2537 TEST_P(WebRtcVoiceEngineTestFake, Recv) {
2538   EXPECT_TRUE(SetupChannel());
2539   EXPECT_TRUE(AddRecvStream(1));
2540   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2541 
2542   EXPECT_TRUE(
2543       GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2544 }
2545 
2546 // Test that we can properly receive packets on multiple streams.
TEST_P(WebRtcVoiceEngineTestFake,RecvWithMultipleStreams)2547 TEST_P(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2548   EXPECT_TRUE(SetupChannel());
2549   const uint32_t ssrc1 = 1;
2550   const uint32_t ssrc2 = 2;
2551   const uint32_t ssrc3 = 3;
2552   EXPECT_TRUE(AddRecvStream(ssrc1));
2553   EXPECT_TRUE(AddRecvStream(ssrc2));
2554   EXPECT_TRUE(AddRecvStream(ssrc3));
2555   // Create packets with the right SSRCs.
2556   unsigned char packets[4][sizeof(kPcmuFrame)];
2557   for (size_t i = 0; i < arraysize(packets); ++i) {
2558     memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
2559     rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
2560   }
2561 
2562   const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2563   const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2564   const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2565 
2566   EXPECT_EQ(s1.received_packets(), 0);
2567   EXPECT_EQ(s2.received_packets(), 0);
2568   EXPECT_EQ(s3.received_packets(), 0);
2569 
2570   DeliverPacket(packets[0], sizeof(packets[0]));
2571   EXPECT_EQ(s1.received_packets(), 0);
2572   EXPECT_EQ(s2.received_packets(), 0);
2573   EXPECT_EQ(s3.received_packets(), 0);
2574 
2575   DeliverPacket(packets[1], sizeof(packets[1]));
2576   EXPECT_EQ(s1.received_packets(), 1);
2577   EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2578   EXPECT_EQ(s2.received_packets(), 0);
2579   EXPECT_EQ(s3.received_packets(), 0);
2580 
2581   DeliverPacket(packets[2], sizeof(packets[2]));
2582   EXPECT_EQ(s1.received_packets(), 1);
2583   EXPECT_EQ(s2.received_packets(), 1);
2584   EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2585   EXPECT_EQ(s3.received_packets(), 0);
2586 
2587   DeliverPacket(packets[3], sizeof(packets[3]));
2588   EXPECT_EQ(s1.received_packets(), 1);
2589   EXPECT_EQ(s2.received_packets(), 1);
2590   EXPECT_EQ(s3.received_packets(), 1);
2591   EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
2592 
2593   EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2594   EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2595   EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
2596 }
2597 
2598 // Test that receiving on an unsignaled stream works (a stream is created).
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaled)2599 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaled) {
2600   EXPECT_TRUE(SetupChannel());
2601   EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2602 
2603   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2604 
2605   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2606   EXPECT_TRUE(
2607       GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2608 }
2609 
2610 // Tests that when we add a stream without SSRCs, but contains a stream_id
2611 // that it is stored and its stream id is later used when the first packet
2612 // arrives to properly create a receive stream with a sync label.
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaledSsrcWithSignaledStreamId)2613 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaledSsrcWithSignaledStreamId) {
2614   const char kSyncLabel[] = "sync_label";
2615   EXPECT_TRUE(SetupChannel());
2616   cricket::StreamParams unsignaled_stream;
2617   unsignaled_stream.set_stream_ids({kSyncLabel});
2618   ASSERT_TRUE(channel_->AddRecvStream(unsignaled_stream));
2619   // The stream shouldn't have been created at this point because it doesn't
2620   // have any SSRCs.
2621   EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2622 
2623   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2624 
2625   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2626   EXPECT_TRUE(
2627       GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2628   EXPECT_EQ(kSyncLabel, GetRecvStream(kSsrc1).GetConfig().sync_group);
2629 
2630   // Remset the unsignaled stream to clear the cached parameters. If a new
2631   // default unsignaled receive stream is created it will not have a sync group.
2632   channel_->ResetUnsignaledRecvStream();
2633   channel_->RemoveRecvStream(kSsrc1);
2634 
2635   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2636 
2637   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2638   EXPECT_TRUE(
2639       GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2640   EXPECT_TRUE(GetRecvStream(kSsrc1).GetConfig().sync_group.empty());
2641 }
2642 
TEST_P(WebRtcVoiceEngineTestFake,ResetUnsignaledRecvStreamDeletesAllDefaultStreams)2643 TEST_P(WebRtcVoiceEngineTestFake,
2644        ResetUnsignaledRecvStreamDeletesAllDefaultStreams) {
2645   ASSERT_TRUE(SetupChannel());
2646   // No receive streams to start with.
2647   ASSERT_TRUE(call_.GetAudioReceiveStreams().empty());
2648 
2649   // Deliver a couple packets with unsignaled SSRCs.
2650   unsigned char packet[sizeof(kPcmuFrame)];
2651   memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2652   rtc::SetBE32(&packet[8], 0x1234);
2653   DeliverPacket(packet, sizeof(packet));
2654   rtc::SetBE32(&packet[8], 0x5678);
2655   DeliverPacket(packet, sizeof(packet));
2656 
2657   // Verify that the receive streams were created.
2658   const auto& receivers1 = call_.GetAudioReceiveStreams();
2659   ASSERT_EQ(receivers1.size(), 2u);
2660 
2661   // Should remove all default streams.
2662   channel_->ResetUnsignaledRecvStream();
2663   const auto& receivers2 = call_.GetAudioReceiveStreams();
2664   EXPECT_EQ(0u, receivers2.size());
2665 }
2666 
2667 // Test that receiving N unsignaled stream works (streams will be created), and
2668 // that packets are forwarded to them all.
TEST_P(WebRtcVoiceEngineTestFake,RecvMultipleUnsignaled)2669 TEST_P(WebRtcVoiceEngineTestFake, RecvMultipleUnsignaled) {
2670   EXPECT_TRUE(SetupChannel());
2671   unsigned char packet[sizeof(kPcmuFrame)];
2672   memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2673 
2674   // Note that SSRC = 0 is not supported.
2675   for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
2676     rtc::SetBE32(&packet[8], ssrc);
2677     DeliverPacket(packet, sizeof(packet));
2678 
2679     // Verify we have one new stream for each loop iteration.
2680     EXPECT_EQ(ssrc, call_.GetAudioReceiveStreams().size());
2681     EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2682     EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
2683   }
2684 
2685   // Sending on the same SSRCs again should not create new streams.
2686   for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
2687     rtc::SetBE32(&packet[8], ssrc);
2688     DeliverPacket(packet, sizeof(packet));
2689 
2690     EXPECT_EQ(kMaxUnsignaledRecvStreams, call_.GetAudioReceiveStreams().size());
2691     EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2692     EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
2693   }
2694 
2695   // Send on another SSRC, the oldest unsignaled stream (SSRC=1) is replaced.
2696   constexpr uint32_t kAnotherSsrc = 667;
2697   rtc::SetBE32(&packet[8], kAnotherSsrc);
2698   DeliverPacket(packet, sizeof(packet));
2699 
2700   const auto& streams = call_.GetAudioReceiveStreams();
2701   EXPECT_EQ(kMaxUnsignaledRecvStreams, streams.size());
2702   size_t i = 0;
2703   for (uint32_t ssrc = 2; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc, ++i) {
2704     EXPECT_EQ(ssrc, streams[i]->GetConfig().rtp.remote_ssrc);
2705     EXPECT_EQ(2, streams[i]->received_packets());
2706   }
2707   EXPECT_EQ(kAnotherSsrc, streams[i]->GetConfig().rtp.remote_ssrc);
2708   EXPECT_EQ(1, streams[i]->received_packets());
2709   // Sanity check that we've checked all streams.
2710   EXPECT_EQ(kMaxUnsignaledRecvStreams, (i + 1));
2711 }
2712 
2713 // Test that a default channel is created even after a signaled stream has been
2714 // added, and that this stream will get any packets for unknown SSRCs.
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaledAfterSignaled)2715 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaledAfterSignaled) {
2716   EXPECT_TRUE(SetupChannel());
2717   unsigned char packet[sizeof(kPcmuFrame)];
2718   memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2719 
2720   // Add a known stream, send packet and verify we got it.
2721   const uint32_t signaled_ssrc = 1;
2722   rtc::SetBE32(&packet[8], signaled_ssrc);
2723   EXPECT_TRUE(AddRecvStream(signaled_ssrc));
2724   DeliverPacket(packet, sizeof(packet));
2725   EXPECT_TRUE(
2726       GetRecvStream(signaled_ssrc).VerifyLastPacket(packet, sizeof(packet)));
2727   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2728 
2729   // Note that the first unknown SSRC cannot be 0, because we only support
2730   // creating receive streams for SSRC!=0.
2731   const uint32_t unsignaled_ssrc = 7011;
2732   rtc::SetBE32(&packet[8], unsignaled_ssrc);
2733   DeliverPacket(packet, sizeof(packet));
2734   EXPECT_TRUE(
2735       GetRecvStream(unsignaled_ssrc).VerifyLastPacket(packet, sizeof(packet)));
2736   EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2737 
2738   DeliverPacket(packet, sizeof(packet));
2739   EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2740 
2741   rtc::SetBE32(&packet[8], signaled_ssrc);
2742   DeliverPacket(packet, sizeof(packet));
2743   EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2744   EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2745 }
2746 
2747 // Two tests to verify that adding a receive stream with the same SSRC as a
2748 // previously added unsignaled stream will only recreate underlying stream
2749 // objects if the stream parameters have changed.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamAfterUnsignaled_NoRecreate)2750 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_NoRecreate) {
2751   EXPECT_TRUE(SetupChannel());
2752 
2753   // Spawn unsignaled stream with SSRC=1.
2754   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2755   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2756   EXPECT_TRUE(
2757       GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2758 
2759   // Verify that the underlying stream object in Call is not recreated when a
2760   // stream with SSRC=1 is added.
2761   const auto& streams = call_.GetAudioReceiveStreams();
2762   EXPECT_EQ(1u, streams.size());
2763   int audio_receive_stream_id = streams.front()->id();
2764   EXPECT_TRUE(AddRecvStream(1));
2765   EXPECT_EQ(1u, streams.size());
2766   EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
2767 }
2768 
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamAfterUnsignaled_Updates)2769 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_Updates) {
2770   EXPECT_TRUE(SetupChannel());
2771 
2772   // Spawn unsignaled stream with SSRC=1.
2773   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2774   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2775   EXPECT_TRUE(
2776       GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2777 
2778   // Verify that the underlying stream object in Call gets updated when a
2779   // stream with SSRC=1 is added, and which has changed stream parameters.
2780   const auto& streams = call_.GetAudioReceiveStreams();
2781   EXPECT_EQ(1u, streams.size());
2782   // The sync_group id should be empty.
2783   EXPECT_TRUE(streams.front()->GetConfig().sync_group.empty());
2784 
2785   const std::string new_stream_id("stream_id");
2786   int audio_receive_stream_id = streams.front()->id();
2787   cricket::StreamParams stream_params;
2788   stream_params.ssrcs.push_back(1);
2789   stream_params.set_stream_ids({new_stream_id});
2790 
2791   EXPECT_TRUE(channel_->AddRecvStream(stream_params));
2792   EXPECT_EQ(1u, streams.size());
2793   // The audio receive stream should not have been recreated.
2794   EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
2795 
2796   // The sync_group id should now match with the new stream params.
2797   EXPECT_EQ(new_stream_id, streams.front()->GetConfig().sync_group);
2798 }
2799 
2800 // Test that AddRecvStream creates new stream.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStream)2801 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStream) {
2802   EXPECT_TRUE(SetupRecvStream());
2803   EXPECT_TRUE(AddRecvStream(1));
2804 }
2805 
2806 // Test that after adding a recv stream, we do not decode more codecs than
2807 // those previously passed into SetRecvCodecs.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamUnsupportedCodec)2808 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2809   EXPECT_TRUE(SetupSendStream());
2810   cricket::AudioRecvParameters parameters;
2811   parameters.codecs.push_back(kOpusCodec);
2812   parameters.codecs.push_back(kPcmuCodec);
2813   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
2814   EXPECT_TRUE(AddRecvStream(kSsrcX));
2815   EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
2816               (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
2817                   {{0, {"PCMU", 8000, 1}}, {111, {"OPUS", 48000, 2}}})));
2818 }
2819 
2820 // Test that we properly clean up any streams that were added, even if
2821 // not explicitly removed.
TEST_P(WebRtcVoiceEngineTestFake,StreamCleanup)2822 TEST_P(WebRtcVoiceEngineTestFake, StreamCleanup) {
2823   EXPECT_TRUE(SetupSendStream());
2824   SetSendParameters(send_parameters_);
2825   EXPECT_TRUE(AddRecvStream(1));
2826   EXPECT_TRUE(AddRecvStream(2));
2827 
2828   EXPECT_EQ(1u, call_.GetAudioSendStreams().size());
2829   EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2830   delete channel_;
2831   channel_ = NULL;
2832   EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
2833   EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2834 }
2835 
TEST_P(WebRtcVoiceEngineTestFake,TestAddRecvStreamSuccessWithZeroSsrc)2836 TEST_P(WebRtcVoiceEngineTestFake, TestAddRecvStreamSuccessWithZeroSsrc) {
2837   EXPECT_TRUE(SetupSendStream());
2838   EXPECT_TRUE(AddRecvStream(0));
2839 }
2840 
TEST_P(WebRtcVoiceEngineTestFake,TestAddRecvStreamFailWithSameSsrc)2841 TEST_P(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithSameSsrc) {
2842   EXPECT_TRUE(SetupChannel());
2843   EXPECT_TRUE(AddRecvStream(1));
2844   EXPECT_FALSE(AddRecvStream(1));
2845 }
2846 
2847 // Test the InsertDtmf on default send stream as caller.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnDefaultSendStreamAsCaller)2848 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2849   TestInsertDtmf(0, true, kTelephoneEventCodec1);
2850 }
2851 
2852 // Test the InsertDtmf on default send stream as callee
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnDefaultSendStreamAsCallee)2853 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2854   TestInsertDtmf(0, false, kTelephoneEventCodec2);
2855 }
2856 
2857 // Test the InsertDtmf on specified send stream as caller.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnSendStreamAsCaller)2858 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2859   TestInsertDtmf(kSsrcX, true, kTelephoneEventCodec2);
2860 }
2861 
2862 // Test the InsertDtmf on specified send stream as callee.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnSendStreamAsCallee)2863 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2864   TestInsertDtmf(kSsrcX, false, kTelephoneEventCodec1);
2865 }
2866 
2867 // Test propagation of extmap allow mixed setting.
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedAsCaller)2868 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedAsCaller) {
2869   TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/true);
2870 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedDisabledAsCaller)2871 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedDisabledAsCaller) {
2872   TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/false);
2873 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedAsCallee)2874 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedAsCallee) {
2875   TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/true);
2876 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedDisabledAsCallee)2877 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedDisabledAsCallee) {
2878   TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/false);
2879 }
2880 
TEST_P(WebRtcVoiceEngineTestFake,SetAudioOptions)2881 TEST_P(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2882   EXPECT_TRUE(SetupSendStream());
2883   EXPECT_TRUE(AddRecvStream(kSsrcY));
2884   EXPECT_CALL(*adm_, BuiltInAECIsAvailable())
2885       .Times(8)
2886       .WillRepeatedly(Return(false));
2887   EXPECT_CALL(*adm_, BuiltInAGCIsAvailable())
2888       .Times(4)
2889       .WillRepeatedly(Return(false));
2890   EXPECT_CALL(*adm_, BuiltInNSIsAvailable())
2891       .Times(2)
2892       .WillRepeatedly(Return(false));
2893 
2894   EXPECT_EQ(200u, GetRecvStreamConfig(kSsrcY).jitter_buffer_max_packets);
2895   EXPECT_FALSE(GetRecvStreamConfig(kSsrcY).jitter_buffer_fast_accelerate);
2896 
2897   // Nothing set in AudioOptions, so everything should be as default.
2898   send_parameters_.options = cricket::AudioOptions();
2899   SetSendParameters(send_parameters_);
2900   if (!use_null_apm_) {
2901     VerifyEchoCancellationSettings(/*enabled=*/true);
2902     EXPECT_TRUE(IsHighPassFilterEnabled());
2903   }
2904   EXPECT_EQ(200u, GetRecvStreamConfig(kSsrcY).jitter_buffer_max_packets);
2905   EXPECT_FALSE(GetRecvStreamConfig(kSsrcY).jitter_buffer_fast_accelerate);
2906 
2907   // Turn echo cancellation off
2908   send_parameters_.options.echo_cancellation = false;
2909   SetSendParameters(send_parameters_);
2910   if (!use_null_apm_) {
2911     VerifyEchoCancellationSettings(/*enabled=*/false);
2912   }
2913 
2914   // Turn echo cancellation back on, with settings, and make sure
2915   // nothing else changed.
2916   send_parameters_.options.echo_cancellation = true;
2917   SetSendParameters(send_parameters_);
2918   if (!use_null_apm_) {
2919     VerifyEchoCancellationSettings(/*enabled=*/true);
2920   }
2921 
2922   // Turn off echo cancellation and delay agnostic aec.
2923   send_parameters_.options.echo_cancellation = false;
2924   SetSendParameters(send_parameters_);
2925   if (!use_null_apm_) {
2926     VerifyEchoCancellationSettings(/*enabled=*/false);
2927   }
2928 
2929   // Restore AEC to be on to work with the following tests.
2930   send_parameters_.options.echo_cancellation = true;
2931   SetSendParameters(send_parameters_);
2932 
2933   // Turn off AGC
2934   send_parameters_.options.auto_gain_control = false;
2935   SetSendParameters(send_parameters_);
2936   if (!use_null_apm_) {
2937     VerifyEchoCancellationSettings(/*enabled=*/true);
2938     EXPECT_FALSE(apm_config_.gain_controller1.enabled);
2939   }
2940 
2941   // Turn AGC back on
2942   send_parameters_.options.auto_gain_control = true;
2943   SetSendParameters(send_parameters_);
2944   if (!use_null_apm_) {
2945     VerifyEchoCancellationSettings(/*enabled=*/true);
2946     EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2947   }
2948 
2949   // Turn off other options.
2950   send_parameters_.options.noise_suppression = false;
2951   send_parameters_.options.highpass_filter = false;
2952   send_parameters_.options.stereo_swapping = true;
2953   SetSendParameters(send_parameters_);
2954   if (!use_null_apm_) {
2955     VerifyEchoCancellationSettings(/*enabled=*/true);
2956     EXPECT_FALSE(IsHighPassFilterEnabled());
2957     EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2958     EXPECT_FALSE(apm_config_.noise_suppression.enabled);
2959     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
2960   }
2961 
2962   // Set options again to ensure it has no impact.
2963   SetSendParameters(send_parameters_);
2964   if (!use_null_apm_) {
2965     VerifyEchoCancellationSettings(/*enabled=*/true);
2966     EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2967     EXPECT_FALSE(apm_config_.noise_suppression.enabled);
2968     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
2969   }
2970 }
2971 
TEST_P(WebRtcVoiceEngineTestFake,InitRecordingOnSend)2972 TEST_P(WebRtcVoiceEngineTestFake, InitRecordingOnSend) {
2973   EXPECT_CALL(*adm_, RecordingIsInitialized()).WillOnce(Return(false));
2974   EXPECT_CALL(*adm_, Recording()).WillOnce(Return(false));
2975   EXPECT_CALL(*adm_, InitRecording()).Times(1);
2976 
2977   std::unique_ptr<cricket::VoiceMediaChannel> channel(
2978       engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
2979                                   cricket::AudioOptions(),
2980                                   webrtc::CryptoOptions()));
2981 
2982   channel->SetSend(true);
2983 }
2984 
TEST_P(WebRtcVoiceEngineTestFake,SkipInitRecordingOnSend)2985 TEST_P(WebRtcVoiceEngineTestFake, SkipInitRecordingOnSend) {
2986   EXPECT_CALL(*adm_, RecordingIsInitialized()).Times(0);
2987   EXPECT_CALL(*adm_, Recording()).Times(0);
2988   EXPECT_CALL(*adm_, InitRecording()).Times(0);
2989 
2990   cricket::AudioOptions options;
2991   options.init_recording_on_send = false;
2992 
2993   std::unique_ptr<cricket::VoiceMediaChannel> channel(
2994       engine_->CreateMediaChannel(&call_, cricket::MediaConfig(), options,
2995                                   webrtc::CryptoOptions()));
2996 
2997   channel->SetSend(true);
2998 }
2999 
TEST_P(WebRtcVoiceEngineTestFake,SetOptionOverridesViaChannels)3000 TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
3001   EXPECT_TRUE(SetupSendStream());
3002   EXPECT_CALL(*adm_, BuiltInAECIsAvailable())
3003       .Times(use_null_apm_ ? 4 : 8)
3004       .WillRepeatedly(Return(false));
3005   EXPECT_CALL(*adm_, BuiltInAGCIsAvailable())
3006       .Times(use_null_apm_ ? 7 : 8)
3007       .WillRepeatedly(Return(false));
3008   EXPECT_CALL(*adm_, BuiltInNSIsAvailable())
3009       .Times(use_null_apm_ ? 5 : 8)
3010       .WillRepeatedly(Return(false));
3011   EXPECT_CALL(*adm_, RecordingIsInitialized())
3012       .Times(2)
3013       .WillRepeatedly(Return(false));
3014 
3015   EXPECT_CALL(*adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3016   EXPECT_CALL(*adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3017 
3018   std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
3019       static_cast<cricket::WebRtcVoiceMediaChannel*>(
3020           engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
3021                                       cricket::AudioOptions(),
3022                                       webrtc::CryptoOptions())));
3023   std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
3024       static_cast<cricket::WebRtcVoiceMediaChannel*>(
3025           engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
3026                                       cricket::AudioOptions(),
3027                                       webrtc::CryptoOptions())));
3028 
3029   // Have to add a stream to make SetSend work.
3030   cricket::StreamParams stream1;
3031   stream1.ssrcs.push_back(1);
3032   channel1->AddSendStream(stream1);
3033   cricket::StreamParams stream2;
3034   stream2.ssrcs.push_back(2);
3035   channel2->AddSendStream(stream2);
3036 
3037   // AEC and AGC and NS
3038   cricket::AudioSendParameters parameters_options_all = send_parameters_;
3039   parameters_options_all.options.echo_cancellation = true;
3040   parameters_options_all.options.auto_gain_control = true;
3041   parameters_options_all.options.noise_suppression = true;
3042   EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
3043   if (!use_null_apm_) {
3044     VerifyEchoCancellationSettings(/*enabled=*/true);
3045     VerifyGainControlEnabledCorrectly();
3046     EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3047     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3048     EXPECT_EQ(parameters_options_all.options, channel1->options());
3049     EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
3050     VerifyEchoCancellationSettings(/*enabled=*/true);
3051     VerifyGainControlEnabledCorrectly();
3052     EXPECT_EQ(parameters_options_all.options, channel2->options());
3053   }
3054 
3055   // unset NS
3056   cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
3057   parameters_options_no_ns.options.noise_suppression = false;
3058   EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3059   cricket::AudioOptions expected_options = parameters_options_all.options;
3060   if (!use_null_apm_) {
3061     VerifyEchoCancellationSettings(/*enabled=*/true);
3062     EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3063     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3064     VerifyGainControlEnabledCorrectly();
3065     expected_options.echo_cancellation = true;
3066     expected_options.auto_gain_control = true;
3067     expected_options.noise_suppression = false;
3068     EXPECT_EQ(expected_options, channel1->options());
3069   }
3070 
3071   // unset AGC
3072   cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
3073   parameters_options_no_agc.options.auto_gain_control = false;
3074   EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
3075   if (!use_null_apm_) {
3076     VerifyEchoCancellationSettings(/*enabled=*/true);
3077     EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3078     EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3079     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3080     expected_options.echo_cancellation = true;
3081     expected_options.auto_gain_control = false;
3082     expected_options.noise_suppression = true;
3083     EXPECT_EQ(expected_options, channel2->options());
3084   }
3085 
3086   EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3087   if (!use_null_apm_) {
3088     VerifyEchoCancellationSettings(/*enabled=*/true);
3089     VerifyGainControlEnabledCorrectly();
3090     EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3091     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3092   }
3093 
3094   channel1->SetSend(true);
3095   if (!use_null_apm_) {
3096     VerifyEchoCancellationSettings(/*enabled=*/true);
3097     VerifyGainControlEnabledCorrectly();
3098     EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3099     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3100   }
3101 
3102   channel2->SetSend(true);
3103   if (!use_null_apm_) {
3104     VerifyEchoCancellationSettings(/*enabled=*/true);
3105     EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3106     EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3107     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3108   }
3109 
3110   // Make sure settings take effect while we are sending.
3111   cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3112       send_parameters_;
3113   parameters_options_no_agc_nor_ns.options.auto_gain_control = false;
3114   parameters_options_no_agc_nor_ns.options.noise_suppression = false;
3115   EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
3116   if (!use_null_apm_) {
3117     VerifyEchoCancellationSettings(/*enabled=*/true);
3118     EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3119     EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3120     EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3121     expected_options.echo_cancellation = true;
3122     expected_options.auto_gain_control = false;
3123     expected_options.noise_suppression = false;
3124     EXPECT_EQ(expected_options, channel2->options());
3125   }
3126 }
3127 
3128 // This test verifies DSCP settings are properly applied on voice media channel.
TEST_P(WebRtcVoiceEngineTestFake,TestSetDscpOptions)3129 TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
3130   EXPECT_TRUE(SetupSendStream());
3131   cricket::FakeNetworkInterface network_interface;
3132   cricket::MediaConfig config;
3133   std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel;
3134   webrtc::RtpParameters parameters;
3135 
3136   channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3137       engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3138                                   webrtc::CryptoOptions())));
3139   channel->SetInterface(&network_interface);
3140   // Default value when DSCP is disabled should be DSCP_DEFAULT.
3141   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3142   channel->SetInterface(nullptr);
3143 
3144   config.enable_dscp = true;
3145   channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3146       engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3147                                   webrtc::CryptoOptions())));
3148   channel->SetInterface(&network_interface);
3149   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3150 
3151   // Create a send stream to configure
3152   EXPECT_TRUE(
3153       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcZ)));
3154   parameters = channel->GetRtpSendParameters(kSsrcZ);
3155   ASSERT_FALSE(parameters.encodings.empty());
3156 
3157   // Various priorities map to various dscp values.
3158   parameters.encodings[0].network_priority = webrtc::Priority::kHigh;
3159   ASSERT_TRUE(channel->SetRtpSendParameters(kSsrcZ, parameters, nullptr).ok());
3160   EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3161   parameters.encodings[0].network_priority = webrtc::Priority::kVeryLow;
3162   ASSERT_TRUE(channel->SetRtpSendParameters(kSsrcZ, parameters, nullptr).ok());
3163   EXPECT_EQ(rtc::DSCP_CS1, network_interface.dscp());
3164 
3165   // Packets should also self-identify their dscp in PacketOptions.
3166   const uint8_t kData[10] = {0};
3167   EXPECT_TRUE(channel->SendRtcp(kData, sizeof(kData)));
3168   EXPECT_EQ(rtc::DSCP_CS1, network_interface.options().dscp);
3169   channel->SetInterface(nullptr);
3170 
3171   // Verify that setting the option to false resets the
3172   // DiffServCodePoint.
3173   config.enable_dscp = false;
3174   channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3175       engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3176                                   webrtc::CryptoOptions())));
3177   channel->SetInterface(&network_interface);
3178   // Default value when DSCP is disabled should be DSCP_DEFAULT.
3179   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3180 
3181   channel->SetInterface(nullptr);
3182 }
3183 
TEST_P(WebRtcVoiceEngineTestFake,SetOutputVolume)3184 TEST_P(WebRtcVoiceEngineTestFake, SetOutputVolume) {
3185   EXPECT_TRUE(SetupChannel());
3186   EXPECT_FALSE(channel_->SetOutputVolume(kSsrcY, 0.5));
3187   cricket::StreamParams stream;
3188   stream.ssrcs.push_back(kSsrcY);
3189   EXPECT_TRUE(channel_->AddRecvStream(stream));
3190   EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrcY).gain());
3191   EXPECT_TRUE(channel_->SetOutputVolume(kSsrcY, 3));
3192   EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcY).gain());
3193 }
3194 
TEST_P(WebRtcVoiceEngineTestFake,SetOutputVolumeUnsignaledRecvStream)3195 TEST_P(WebRtcVoiceEngineTestFake, SetOutputVolumeUnsignaledRecvStream) {
3196   EXPECT_TRUE(SetupChannel());
3197 
3198   // Spawn an unsignaled stream by sending a packet - gain should be 1.
3199   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3200   EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc1).gain());
3201 
3202   // Should remember the volume "2" which will be set on new unsignaled streams,
3203   // and also set the gain to 2 on existing unsignaled streams.
3204   EXPECT_TRUE(channel_->SetDefaultOutputVolume(2));
3205   EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrc1).gain());
3206 
3207   // Spawn an unsignaled stream by sending a packet - gain should be 2.
3208   unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3209   memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3210   rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3211   DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3212   EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrcX).gain());
3213 
3214   // Setting gain for all unsignaled streams.
3215   EXPECT_TRUE(channel_->SetDefaultOutputVolume(3));
3216   if (kMaxUnsignaledRecvStreams > 1) {
3217     EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
3218   }
3219   EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcX).gain());
3220 
3221   // Setting gain on an individual stream affects only that.
3222   EXPECT_TRUE(channel_->SetOutputVolume(kSsrcX, 4));
3223   if (kMaxUnsignaledRecvStreams > 1) {
3224     EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
3225   }
3226   EXPECT_DOUBLE_EQ(4, GetRecvStream(kSsrcX).gain());
3227 }
3228 
TEST_P(WebRtcVoiceEngineTestFake,BaseMinimumPlayoutDelayMs)3229 TEST_P(WebRtcVoiceEngineTestFake, BaseMinimumPlayoutDelayMs) {
3230   EXPECT_TRUE(SetupChannel());
3231   EXPECT_FALSE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 200));
3232   EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3233 
3234   cricket::StreamParams stream;
3235   stream.ssrcs.push_back(kSsrcY);
3236   EXPECT_TRUE(channel_->AddRecvStream(stream));
3237   EXPECT_EQ(0, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
3238   EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 300));
3239   EXPECT_EQ(300, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
3240 }
3241 
TEST_P(WebRtcVoiceEngineTestFake,BaseMinimumPlayoutDelayMsUnsignaledRecvStream)3242 TEST_P(WebRtcVoiceEngineTestFake,
3243        BaseMinimumPlayoutDelayMsUnsignaledRecvStream) {
3244   // Here base minimum delay is abbreviated to delay in comments for shortness.
3245   EXPECT_TRUE(SetupChannel());
3246 
3247   // Spawn an unsignaled stream by sending a packet - delay should be 0.
3248   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3249   EXPECT_EQ(0, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3250   // Check that it doesn't provide default values for unknown ssrc.
3251   EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3252 
3253   // Check that default value for unsignaled streams is 0.
3254   EXPECT_EQ(0, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3255 
3256   // Should remember the delay 100 which will be set on new unsignaled streams,
3257   // and also set the delay to 100 on existing unsignaled streams.
3258   EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 100));
3259   EXPECT_EQ(100, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3260   // Check that it doesn't provide default values for unknown ssrc.
3261   EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3262 
3263   // Spawn an unsignaled stream by sending a packet - delay should be 100.
3264   unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3265   memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3266   rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3267   DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3268   EXPECT_EQ(100, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3269 
3270   // Setting delay with SSRC=0 should affect all unsignaled streams.
3271   EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 300));
3272   if (kMaxUnsignaledRecvStreams > 1) {
3273     EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3274   }
3275   EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3276 
3277   // Setting delay on an individual stream affects only that.
3278   EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcX, 400));
3279   if (kMaxUnsignaledRecvStreams > 1) {
3280     EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3281   }
3282   EXPECT_EQ(400, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3283   EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3284   // Check that it doesn't provide default values for unknown ssrc.
3285   EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3286 }
3287 
TEST_P(WebRtcVoiceEngineTestFake,SetsSyncGroupFromStreamId)3288 TEST_P(WebRtcVoiceEngineTestFake, SetsSyncGroupFromStreamId) {
3289   const uint32_t kAudioSsrc = 123;
3290   const std::string kStreamId = "AvSyncLabel";
3291 
3292   EXPECT_TRUE(SetupSendStream());
3293   cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3294   sp.set_stream_ids({kStreamId});
3295   // Creating two channels to make sure that sync label is set properly for both
3296   // the default voice channel and following ones.
3297   EXPECT_TRUE(channel_->AddRecvStream(sp));
3298   sp.ssrcs[0] += 1;
3299   EXPECT_TRUE(channel_->AddRecvStream(sp));
3300 
3301   ASSERT_EQ(2u, call_.GetAudioReceiveStreams().size());
3302   EXPECT_EQ(kStreamId,
3303             call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
3304       << "SyncGroup should be set based on stream id";
3305   EXPECT_EQ(kStreamId,
3306             call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
3307       << "SyncGroup should be set based on stream id";
3308 }
3309 
3310 // TODO(solenberg): Remove, once recv streams are configured through Call.
3311 //                  (This is then covered by TestSetRecvRtpHeaderExtensions.)
TEST_P(WebRtcVoiceEngineTestFake,ConfiguresAudioReceiveStreamRtpExtensions)3312 TEST_P(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
3313   // Test that setting the header extensions results in the expected state
3314   // changes on an associated Call.
3315   std::vector<uint32_t> ssrcs;
3316   ssrcs.push_back(223);
3317   ssrcs.push_back(224);
3318 
3319   EXPECT_TRUE(SetupSendStream());
3320   SetSendParameters(send_parameters_);
3321   for (uint32_t ssrc : ssrcs) {
3322     EXPECT_TRUE(
3323         channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc)));
3324   }
3325 
3326   EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
3327   for (uint32_t ssrc : ssrcs) {
3328     const auto* s = call_.GetAudioReceiveStream(ssrc);
3329     EXPECT_NE(nullptr, s);
3330     EXPECT_EQ(0u, s->GetConfig().rtp.extensions.size());
3331   }
3332 
3333   // Set up receive extensions.
3334   const std::vector<webrtc::RtpExtension> header_extensions =
3335       GetDefaultEnabledRtpHeaderExtensions(*engine_);
3336   cricket::AudioRecvParameters recv_parameters;
3337   recv_parameters.extensions = header_extensions;
3338   channel_->SetRecvParameters(recv_parameters);
3339   EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
3340   for (uint32_t ssrc : ssrcs) {
3341     const auto* s = call_.GetAudioReceiveStream(ssrc);
3342     EXPECT_NE(nullptr, s);
3343     const auto& s_exts = s->GetConfig().rtp.extensions;
3344     EXPECT_EQ(header_extensions.size(), s_exts.size());
3345     for (const auto& e_ext : header_extensions) {
3346       for (const auto& s_ext : s_exts) {
3347         if (e_ext.id == s_ext.id) {
3348           EXPECT_EQ(e_ext.uri, s_ext.uri);
3349         }
3350       }
3351     }
3352   }
3353 
3354   // Disable receive extensions.
3355   channel_->SetRecvParameters(cricket::AudioRecvParameters());
3356   for (uint32_t ssrc : ssrcs) {
3357     const auto* s = call_.GetAudioReceiveStream(ssrc);
3358     EXPECT_NE(nullptr, s);
3359     EXPECT_EQ(0u, s->GetConfig().rtp.extensions.size());
3360   }
3361 }
3362 
TEST_P(WebRtcVoiceEngineTestFake,DeliverAudioPacket_Call)3363 TEST_P(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3364   // Test that packets are forwarded to the Call when configured accordingly.
3365   const uint32_t kAudioSsrc = 1;
3366   rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3367   static const unsigned char kRtcp[] = {
3368       0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
3369       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3370       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3371   rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3372 
3373   EXPECT_TRUE(SetupSendStream());
3374   cricket::WebRtcVoiceMediaChannel* media_channel =
3375       static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3376   SetSendParameters(send_parameters_);
3377   EXPECT_TRUE(media_channel->AddRecvStream(
3378       cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3379 
3380   EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
3381   const cricket::FakeAudioReceiveStream* s =
3382       call_.GetAudioReceiveStream(kAudioSsrc);
3383   EXPECT_EQ(0, s->received_packets());
3384   channel_->OnPacketReceived(kPcmuPacket, /* packet_time_us */ -1);
3385   rtc::Thread::Current()->ProcessMessages(0);
3386 
3387   EXPECT_EQ(1, s->received_packets());
3388 }
3389 
3390 // All receive channels should be associated with the first send channel,
3391 // since they do not send RTCP SR.
TEST_P(WebRtcVoiceEngineTestFake,AssociateFirstSendChannel_SendCreatedFirst)3392 TEST_P(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
3393   EXPECT_TRUE(SetupSendStream());
3394   EXPECT_TRUE(AddRecvStream(kSsrcY));
3395   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
3396   EXPECT_TRUE(
3397       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcZ)));
3398   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
3399   EXPECT_TRUE(AddRecvStream(kSsrcW));
3400   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcW).rtp.local_ssrc);
3401 }
3402 
TEST_P(WebRtcVoiceEngineTestFake,AssociateFirstSendChannel_RecvCreatedFirst)3403 TEST_P(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3404   EXPECT_TRUE(SetupRecvStream());
3405   EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3406   EXPECT_TRUE(
3407       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY)));
3408   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3409   EXPECT_TRUE(AddRecvStream(kSsrcZ));
3410   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
3411   EXPECT_TRUE(
3412       channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcW)));
3413   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3414   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
3415 }
3416 
TEST_P(WebRtcVoiceEngineTestFake,SetRawAudioSink)3417 TEST_P(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3418   EXPECT_TRUE(SetupChannel());
3419   std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3420   std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3421 
3422   // Setting the sink before a recv stream exists should do nothing.
3423   channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_1));
3424   EXPECT_TRUE(AddRecvStream(kSsrcX));
3425   EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3426 
3427   // Now try actually setting the sink.
3428   channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_2));
3429   EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3430 
3431   // Now try resetting it.
3432   channel_->SetRawAudioSink(kSsrcX, nullptr);
3433   EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3434 }
3435 
TEST_P(WebRtcVoiceEngineTestFake,SetRawAudioSinkUnsignaledRecvStream)3436 TEST_P(WebRtcVoiceEngineTestFake, SetRawAudioSinkUnsignaledRecvStream) {
3437   EXPECT_TRUE(SetupChannel());
3438   std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3439   std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3440   std::unique_ptr<FakeAudioSink> fake_sink_3(new FakeAudioSink());
3441   std::unique_ptr<FakeAudioSink> fake_sink_4(new FakeAudioSink());
3442 
3443   // Should be able to set a default sink even when no stream exists.
3444   channel_->SetDefaultRawAudioSink(std::move(fake_sink_1));
3445 
3446   // Spawn an unsignaled stream by sending a packet - it should be assigned the
3447   // default sink.
3448   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3449   EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3450 
3451   // Try resetting the default sink.
3452   channel_->SetDefaultRawAudioSink(nullptr);
3453   EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3454 
3455   // Try setting the default sink while the default stream exists.
3456   channel_->SetDefaultRawAudioSink(std::move(fake_sink_2));
3457   EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3458 
3459   // If we remove and add a default stream, it should get the same sink.
3460   EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc1));
3461   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3462   EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3463 
3464   // Spawn another unsignaled stream - it should be assigned the default sink
3465   // and the previous unsignaled stream should lose it.
3466   unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3467   memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3468   rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3469   DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3470   if (kMaxUnsignaledRecvStreams > 1) {
3471     EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3472   }
3473   EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3474 
3475   // Reset the default sink - the second unsignaled stream should lose it.
3476   channel_->SetDefaultRawAudioSink(nullptr);
3477   if (kMaxUnsignaledRecvStreams > 1) {
3478     EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3479   }
3480   EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3481 
3482   // Try setting the default sink while two streams exists.
3483   channel_->SetDefaultRawAudioSink(std::move(fake_sink_3));
3484   if (kMaxUnsignaledRecvStreams > 1) {
3485     EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3486   }
3487   EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3488 
3489   // Try setting the sink for the first unsignaled stream using its known SSRC.
3490   channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_4));
3491   if (kMaxUnsignaledRecvStreams > 1) {
3492     EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3493   }
3494   EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3495   if (kMaxUnsignaledRecvStreams > 1) {
3496     EXPECT_NE(GetRecvStream(kSsrc1).sink(), GetRecvStream(kSsrcX).sink());
3497   }
3498 }
3499 
3500 // Test that, just like the video channel, the voice channel communicates the
3501 // network state to the call.
TEST_P(WebRtcVoiceEngineTestFake,OnReadyToSendSignalsNetworkState)3502 TEST_P(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
3503   EXPECT_TRUE(SetupChannel());
3504 
3505   EXPECT_EQ(webrtc::kNetworkUp,
3506             call_.GetNetworkState(webrtc::MediaType::AUDIO));
3507   EXPECT_EQ(webrtc::kNetworkUp,
3508             call_.GetNetworkState(webrtc::MediaType::VIDEO));
3509 
3510   channel_->OnReadyToSend(false);
3511   EXPECT_EQ(webrtc::kNetworkDown,
3512             call_.GetNetworkState(webrtc::MediaType::AUDIO));
3513   EXPECT_EQ(webrtc::kNetworkUp,
3514             call_.GetNetworkState(webrtc::MediaType::VIDEO));
3515 
3516   channel_->OnReadyToSend(true);
3517   EXPECT_EQ(webrtc::kNetworkUp,
3518             call_.GetNetworkState(webrtc::MediaType::AUDIO));
3519   EXPECT_EQ(webrtc::kNetworkUp,
3520             call_.GetNetworkState(webrtc::MediaType::VIDEO));
3521 }
3522 
3523 // Test that playout is still started after changing parameters
TEST_P(WebRtcVoiceEngineTestFake,PreservePlayoutWhenRecreateRecvStream)3524 TEST_P(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3525   SetupRecvStream();
3526   channel_->SetPlayout(true);
3527   EXPECT_TRUE(GetRecvStream(kSsrcX).started());
3528 
3529   // Changing RTP header extensions will recreate the
3530   // AudioReceiveStreamInterface.
3531   cricket::AudioRecvParameters parameters;
3532   parameters.extensions.push_back(
3533       webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3534   channel_->SetRecvParameters(parameters);
3535 
3536   EXPECT_TRUE(GetRecvStream(kSsrcX).started());
3537 }
3538 
3539 // Tests when GetSources is called with non-existing ssrc, it will return an
3540 // empty list of RtpSource without crashing.
TEST_P(WebRtcVoiceEngineTestFake,GetSourcesWithNonExistingSsrc)3541 TEST_P(WebRtcVoiceEngineTestFake, GetSourcesWithNonExistingSsrc) {
3542   // Setup an recv stream with `kSsrcX`.
3543   SetupRecvStream();
3544   cricket::WebRtcVoiceMediaChannel* media_channel =
3545       static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3546   // Call GetSources with `kSsrcY` which doesn't exist.
3547   std::vector<webrtc::RtpSource> sources = media_channel->GetSources(kSsrcY);
3548   EXPECT_EQ(0u, sources.size());
3549 }
3550 
3551 // Tests that the library initializes and shuts down properly.
TEST(WebRtcVoiceEngineTest,StartupShutdown)3552 TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3553   rtc::AutoThread main_thread;
3554   for (bool use_null_apm : {false, true}) {
3555     // If the VoiceEngine wants to gather available codecs early, that's fine
3556     // but we never want it to create a decoder at this stage.
3557     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3558         webrtc::CreateDefaultTaskQueueFactory();
3559     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3560         webrtc::test::MockAudioDeviceModule::CreateNice();
3561     rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3562         use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3563     webrtc::FieldTrialBasedConfig field_trials;
3564     cricket::WebRtcVoiceEngine engine(
3565         task_queue_factory.get(), adm.get(),
3566         webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3567         webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3568         nullptr, field_trials);
3569     engine.Init();
3570     webrtc::RtcEventLogNull event_log;
3571     webrtc::Call::Config call_config(&event_log);
3572     call_config.trials = &field_trials;
3573     call_config.task_queue_factory = task_queue_factory.get();
3574     auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3575     cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3576         call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3577         webrtc::CryptoOptions());
3578     EXPECT_TRUE(channel != nullptr);
3579     delete channel;
3580   }
3581 }
3582 
3583 // Tests that reference counting on the external ADM is correct.
TEST(WebRtcVoiceEngineTest,StartupShutdownWithExternalADM)3584 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3585   rtc::AutoThread main_thread;
3586   for (bool use_null_apm : {false, true}) {
3587     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3588         webrtc::CreateDefaultTaskQueueFactory();
3589     auto adm = rtc::make_ref_counted<
3590         ::testing::NiceMock<webrtc::test::MockAudioDeviceModule>>();
3591     {
3592       rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3593           use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3594       webrtc::FieldTrialBasedConfig field_trials;
3595       cricket::WebRtcVoiceEngine engine(
3596           task_queue_factory.get(), adm.get(),
3597           webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3598           webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3599           nullptr, field_trials);
3600       engine.Init();
3601       webrtc::RtcEventLogNull event_log;
3602       webrtc::Call::Config call_config(&event_log);
3603       call_config.trials = &field_trials;
3604       call_config.task_queue_factory = task_queue_factory.get();
3605       auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3606       cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3607           call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3608           webrtc::CryptoOptions());
3609       EXPECT_TRUE(channel != nullptr);
3610       delete channel;
3611     }
3612     // The engine/channel should have dropped their references.
3613     EXPECT_EQ(adm.release()->Release(),
3614               rtc::RefCountReleaseStatus::kDroppedLastRef);
3615   }
3616 }
3617 
3618 // Verify the payload id of common audio codecs, including CN and G722.
TEST(WebRtcVoiceEngineTest,HasCorrectPayloadTypeMapping)3619 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
3620   for (bool use_null_apm : {false, true}) {
3621     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3622         webrtc::CreateDefaultTaskQueueFactory();
3623     // TODO(ossu): Why are the payload types of codecs with non-static payload
3624     // type assignments checked here? It shouldn't really matter.
3625     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3626         webrtc::test::MockAudioDeviceModule::CreateNice();
3627     rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3628         use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3629     webrtc::FieldTrialBasedConfig field_trials;
3630     cricket::WebRtcVoiceEngine engine(
3631         task_queue_factory.get(), adm.get(),
3632         webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3633         webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3634         nullptr, field_trials);
3635     engine.Init();
3636     for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3637       auto is_codec = [&codec](const char* name, int clockrate = 0) {
3638         return absl::EqualsIgnoreCase(codec.name, name) &&
3639                (clockrate == 0 || codec.clockrate == clockrate);
3640       };
3641       if (is_codec("CN", 16000)) {
3642         EXPECT_EQ(105, codec.id);
3643       } else if (is_codec("CN", 32000)) {
3644         EXPECT_EQ(106, codec.id);
3645       } else if (is_codec("G722", 8000)) {
3646         EXPECT_EQ(9, codec.id);
3647       } else if (is_codec("telephone-event", 8000)) {
3648         EXPECT_EQ(126, codec.id);
3649         // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3650         // Remove these checks once both send and receive side assigns payload
3651         // types dynamically.
3652       } else if (is_codec("telephone-event", 16000)) {
3653         EXPECT_EQ(113, codec.id);
3654       } else if (is_codec("telephone-event", 32000)) {
3655         EXPECT_EQ(112, codec.id);
3656       } else if (is_codec("telephone-event", 48000)) {
3657         EXPECT_EQ(110, codec.id);
3658       } else if (is_codec("opus")) {
3659         EXPECT_EQ(111, codec.id);
3660         ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3661         EXPECT_EQ("10", codec.params.find("minptime")->second);
3662         ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3663         EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
3664       }
3665     }
3666   }
3667 }
3668 
3669 // Tests that VoE supports at least 32 channels
TEST(WebRtcVoiceEngineTest,Has32Channels)3670 TEST(WebRtcVoiceEngineTest, Has32Channels) {
3671   rtc::AutoThread main_thread;
3672   for (bool use_null_apm : {false, true}) {
3673     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3674         webrtc::CreateDefaultTaskQueueFactory();
3675     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3676         webrtc::test::MockAudioDeviceModule::CreateNice();
3677     rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3678         use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3679     webrtc::FieldTrialBasedConfig field_trials;
3680     cricket::WebRtcVoiceEngine engine(
3681         task_queue_factory.get(), adm.get(),
3682         webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3683         webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3684         nullptr, field_trials);
3685     engine.Init();
3686     webrtc::RtcEventLogNull event_log;
3687     webrtc::Call::Config call_config(&event_log);
3688     call_config.trials = &field_trials;
3689     call_config.task_queue_factory = task_queue_factory.get();
3690     auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3691 
3692     cricket::VoiceMediaChannel* channels[32];
3693     size_t num_channels = 0;
3694     while (num_channels < arraysize(channels)) {
3695       cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3696           call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3697           webrtc::CryptoOptions());
3698       if (!channel)
3699         break;
3700       channels[num_channels++] = channel;
3701     }
3702 
3703     size_t expected = arraysize(channels);
3704     EXPECT_EQ(expected, num_channels);
3705 
3706     while (num_channels > 0) {
3707       delete channels[--num_channels];
3708     }
3709   }
3710 }
3711 
3712 // Test that we set our preferred codecs properly.
TEST(WebRtcVoiceEngineTest,SetRecvCodecs)3713 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3714   rtc::AutoThread main_thread;
3715   for (bool use_null_apm : {false, true}) {
3716     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3717         webrtc::CreateDefaultTaskQueueFactory();
3718     // TODO(ossu): I'm not sure of the intent of this test. It's either:
3719     // - Check that our builtin codecs are usable by Channel.
3720     // - The codecs provided by the engine is usable by Channel.
3721     // It does not check that the codecs in the RecvParameters are actually
3722     // what we sent in - though it's probably reasonable to expect so, if
3723     // SetRecvParameters returns true.
3724     // I think it will become clear once audio decoder injection is completed.
3725     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3726         webrtc::test::MockAudioDeviceModule::CreateNice();
3727     rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3728         use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3729     webrtc::FieldTrialBasedConfig field_trials;
3730     cricket::WebRtcVoiceEngine engine(
3731         task_queue_factory.get(), adm.get(),
3732         webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3733         webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, apm, nullptr,
3734         field_trials);
3735     engine.Init();
3736     webrtc::RtcEventLogNull event_log;
3737     webrtc::Call::Config call_config(&event_log);
3738     call_config.trials = &field_trials;
3739     call_config.task_queue_factory = task_queue_factory.get();
3740     auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3741     cricket::WebRtcVoiceMediaChannel channel(
3742         &engine, cricket::MediaConfig(), cricket::AudioOptions(),
3743         webrtc::CryptoOptions(), call.get());
3744     cricket::AudioRecvParameters parameters;
3745     parameters.codecs = engine.recv_codecs();
3746     EXPECT_TRUE(channel.SetRecvParameters(parameters));
3747   }
3748 }
3749 
TEST(WebRtcVoiceEngineTest,SetRtpSendParametersMaxBitrate)3750 TEST(WebRtcVoiceEngineTest, SetRtpSendParametersMaxBitrate) {
3751   rtc::AutoThread main_thread;
3752   std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3753       webrtc::CreateDefaultTaskQueueFactory();
3754   rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3755       webrtc::test::MockAudioDeviceModule::CreateNice();
3756   webrtc::FieldTrialBasedConfig field_trials;
3757   FakeAudioSource source;
3758   cricket::WebRtcVoiceEngine engine(task_queue_factory.get(), adm.get(),
3759                                     webrtc::CreateBuiltinAudioEncoderFactory(),
3760                                     webrtc::CreateBuiltinAudioDecoderFactory(),
3761                                     nullptr, nullptr, nullptr, field_trials);
3762   engine.Init();
3763   webrtc::RtcEventLogNull event_log;
3764   webrtc::Call::Config call_config(&event_log);
3765   call_config.trials = &field_trials;
3766   call_config.task_queue_factory = task_queue_factory.get();
3767   {
3768     webrtc::AudioState::Config config;
3769     config.audio_mixer = webrtc::AudioMixerImpl::Create();
3770     config.audio_device_module =
3771         webrtc::test::MockAudioDeviceModule::CreateNice();
3772     call_config.audio_state = webrtc::AudioState::Create(config);
3773   }
3774   auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3775   cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3776                                            cricket::AudioOptions(),
3777                                            webrtc::CryptoOptions(), call.get());
3778   {
3779     cricket::AudioSendParameters params;
3780     params.codecs.push_back(cricket::AudioCodec(1, "opus", 48000, 32000, 2));
3781     params.extensions.push_back(webrtc::RtpExtension(
3782         webrtc::RtpExtension::kTransportSequenceNumberUri, 1));
3783     EXPECT_TRUE(channel.SetSendParameters(params));
3784   }
3785   constexpr int kSsrc = 1234;
3786   {
3787     cricket::StreamParams params;
3788     params.add_ssrc(kSsrc);
3789     channel.AddSendStream(params);
3790   }
3791   channel.SetAudioSend(kSsrc, true, nullptr, &source);
3792   channel.SetSend(true);
3793   webrtc::RtpParameters params = channel.GetRtpSendParameters(kSsrc);
3794   for (int max_bitrate : {-10, -1, 0, 10000}) {
3795     params.encodings[0].max_bitrate_bps = max_bitrate;
3796     channel.SetRtpSendParameters(
3797         kSsrc, params, [](webrtc::RTCError error) { EXPECT_TRUE(error.ok()); });
3798   }
3799 }
3800 
TEST(WebRtcVoiceEngineTest,CollectRecvCodecs)3801 TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) {
3802   for (bool use_null_apm : {false, true}) {
3803     std::vector<webrtc::AudioCodecSpec> specs;
3804     webrtc::AudioCodecSpec spec1{{"codec1", 48000, 2, {{"param1", "value1"}}},
3805                                  {48000, 2, 16000, 10000, 20000}};
3806     spec1.info.allow_comfort_noise = false;
3807     spec1.info.supports_network_adaption = true;
3808     specs.push_back(spec1);
3809     webrtc::AudioCodecSpec spec2{{"codec2", 32000, 1}, {32000, 1, 32000}};
3810     spec2.info.allow_comfort_noise = false;
3811     specs.push_back(spec2);
3812     specs.push_back(webrtc::AudioCodecSpec{
3813         {"codec3", 16000, 1, {{"param1", "value1b"}, {"param2", "value2"}}},
3814         {16000, 1, 13300}});
3815     specs.push_back(
3816         webrtc::AudioCodecSpec{{"codec4", 8000, 1}, {8000, 1, 64000}});
3817     specs.push_back(
3818         webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}});
3819 
3820     std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3821         webrtc::CreateDefaultTaskQueueFactory();
3822     rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory =
3823         webrtc::MockAudioEncoderFactory::CreateUnusedFactory();
3824     rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory =
3825         rtc::make_ref_counted<webrtc::MockAudioDecoderFactory>();
3826     EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders())
3827         .WillOnce(Return(specs));
3828     rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3829         webrtc::test::MockAudioDeviceModule::CreateNice();
3830 
3831     rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3832         use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3833     webrtc::FieldTrialBasedConfig field_trials;
3834     cricket::WebRtcVoiceEngine engine(
3835         task_queue_factory.get(), adm.get(), unused_encoder_factory,
3836         mock_decoder_factory, nullptr, apm, nullptr, field_trials);
3837     engine.Init();
3838     auto codecs = engine.recv_codecs();
3839     EXPECT_EQ(11u, codecs.size());
3840 
3841     // Rather than just ASSERTing that there are enough codecs, ensure that we
3842     // can check the actual values safely, to provide better test results.
3843     auto get_codec = [&codecs](size_t index) -> const cricket::AudioCodec& {
3844       static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0);
3845       if (codecs.size() > index)
3846         return codecs[index];
3847       return missing_codec;
3848     };
3849 
3850     // Ensure the general codecs are generated first and in order.
3851     for (size_t i = 0; i != specs.size(); ++i) {
3852       EXPECT_EQ(specs[i].format.name, get_codec(i).name);
3853       EXPECT_EQ(specs[i].format.clockrate_hz, get_codec(i).clockrate);
3854       EXPECT_EQ(specs[i].format.num_channels, get_codec(i).channels);
3855       EXPECT_EQ(specs[i].format.parameters, get_codec(i).params);
3856     }
3857 
3858     // Find the index of a codec, or -1 if not found, so that we can easily
3859     // check supplementary codecs are ordered after the general codecs.
3860     auto find_codec = [&codecs](const webrtc::SdpAudioFormat& format) -> int {
3861       for (size_t i = 0; i != codecs.size(); ++i) {
3862         const cricket::AudioCodec& codec = codecs[i];
3863         if (absl::EqualsIgnoreCase(codec.name, format.name) &&
3864             codec.clockrate == format.clockrate_hz &&
3865             codec.channels == format.num_channels) {
3866           return rtc::checked_cast<int>(i);
3867         }
3868       }
3869       return -1;
3870     };
3871 
3872     // Ensure all supplementary codecs are generated last. Their internal
3873     // ordering is not important. Without this cast, the comparison turned
3874     // unsigned and, thus, failed for -1.
3875     const int num_specs = static_cast<int>(specs.size());
3876     EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
3877     EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
3878     EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
3879     EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
3880     EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
3881     EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
3882     EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
3883   }
3884 }
3885