blob: 36d7b0026e5421ce4202ed49dad65734c890f46c [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * 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.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/array_view.h"
14#include "media/base/fakemediaengine.h"
15#include "media/base/fakertp.h"
16#include "media/base/mediachannel.h"
17#include "media/base/testutils.h"
18#include "p2p/base/fakecandidatepair.h"
19#include "p2p/base/fakedtlstransport.h"
20#include "p2p/base/fakepackettransport.h"
21#include "pc/channel.h"
22#include "rtc_base/buffer.h"
23#include "rtc_base/checks.h"
24#include "rtc_base/fakeclock.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/logging.h"
27#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029using cricket::CA_OFFER;
30using cricket::CA_PRANSWER;
31using cricket::CA_ANSWER;
32using cricket::CA_UPDATE;
zhihuangb2cdd932017-01-19 16:54:25 -080033using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035using cricket::StreamParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036
Danil Chapovalov33b01f22016-05-11 19:55:27 +020037namespace {
38const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
39const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
40const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070041const cricket::VideoCodec kH264Codec(97, "H264");
42const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020043const cricket::DataCodec kGoogleDataCodec(101, "google-data");
44const uint32_t kSsrc1 = 0x1111;
45const uint32_t kSsrc2 = 0x2222;
46const uint32_t kSsrc3 = 0x3333;
47const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080050const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
deadbeefcbecd352015-09-23 11:50:27 -070053template <class ChannelT,
54 class MediaChannelT,
55 class ContentT,
56 class CodecT,
57 class MediaInfoT,
58 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059class Traits {
60 public:
61 typedef ChannelT Channel;
62 typedef MediaChannelT MediaChannel;
63 typedef ContentT Content;
64 typedef CodecT Codec;
65 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020066 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class VoiceTraits : public Traits<cricket::VoiceChannel,
70 cricket::FakeVoiceMediaChannel,
71 cricket::AudioContentDescription,
72 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070074 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class VideoTraits : public Traits<cricket::VideoChannel,
77 cricket::FakeVideoMediaChannel,
78 cricket::VideoContentDescription,
79 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070081 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
deadbeef953c2ce2017-01-09 14:53:41 -080083class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 cricket::FakeDataMediaChannel,
85 cricket::DataContentDescription,
86 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
deadbeef953c2ce2017-01-09 14:53:41 -080090// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091template<class T>
92class ChannelTest : public testing::Test, public sigslot::has_slots<> {
93 public:
deadbeefac22f702017-01-12 21:59:29 -080094 enum Flags {
95 RTCP_MUX = 0x1,
96 RTCP_MUX_REQUIRED = 0x2,
97 SECURE = 0x4,
98 SSRC_MUX = 0x8,
99 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800100 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800101 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700102 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700103 GCM_CIPHER = 0x40,
104 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800105 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106
Peter Boström34fbfff2015-09-24 19:20:30 +0200107 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 rtc::ArrayView<const uint8_t> rtp_data,
109 rtc::ArrayView<const uint8_t> rtcp_data,
110 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200111 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200112 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800113 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 if (network_is_worker == NetworkIsWorker::Yes) {
115 network_thread_ = rtc::Thread::Current();
116 } else {
117 network_thread_keeper_ = rtc::Thread::Create();
118 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 network_thread_ = network_thread_keeper_.get();
120 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800124 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
125 nullptr, typename T::Options()),
126 rtc::MakeUnique<typename T::MediaChannel>(
127 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
Steve Anton8699a322017-11-06 15:53:33 -0800130 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
131 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 int flags1,
133 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800134 // Network thread is started in CreateChannels, to allow the test to
135 // configure a fake clock before any threads are spawned and attempt to
136 // access the time.
137 if (network_thread_keeper_) {
138 network_thread_keeper_->Start();
139 }
deadbeefac22f702017-01-12 21:59:29 -0800140 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800141 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
142 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
143 // Make sure if using raw packet transports, they're used for both
144 // channels.
145 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200146 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800147 media_channel1_ = ch1.get();
148 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800149 rtc::PacketTransportInternal* rtp1 = nullptr;
150 rtc::PacketTransportInternal* rtcp1 = nullptr;
151 rtc::PacketTransportInternal* rtp2 = nullptr;
152 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800153 // Based on flags, create fake DTLS or raw packet transports.
154 if (flags1 & RAW_PACKET_TRANSPORT) {
155 fake_rtp_packet_transport1_.reset(
156 new rtc::FakePacketTransport("channel1_rtp"));
157 rtp1 = fake_rtp_packet_transport1_.get();
158 if (!(flags1 & RTCP_MUX_REQUIRED)) {
159 fake_rtcp_packet_transport1_.reset(
160 new rtc::FakePacketTransport("channel1_rtcp"));
161 rtcp1 = fake_rtcp_packet_transport1_.get();
162 }
163 } else {
164 // Confirmed to work with KT_RSA and KT_ECDSA.
165 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
166 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
167 rtp1 = fake_rtp_dtls_transport1_.get();
168 if (!(flags1 & RTCP_MUX_REQUIRED)) {
169 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
171 rtcp1 = fake_rtcp_dtls_transport1_.get();
172 }
173 if (flags1 & DTLS) {
174 auto cert1 =
175 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
176 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
177 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
178 if (fake_rtcp_dtls_transport1_) {
179 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
180 }
181 }
jbauch5869f502017-06-29 12:31:36 -0700182 if (flags1 & ENCRYPTED_HEADERS) {
183 rtc::CryptoOptions crypto_options;
184 crypto_options.enable_encrypted_rtp_header_extensions = true;
185 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
188 }
189 }
190 if (flags1 & GCM_CIPHER) {
191 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
192 rtc::SRTP_AEAD_AES_256_GCM);
193 if (fake_rtcp_dtls_transport1_) {
194 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
195 rtc::SRTP_AEAD_AES_256_GCM);
196 }
197 }
deadbeeff5346592017-01-24 21:51:21 -0800198 }
199 // Based on flags, create fake DTLS or raw packet transports.
200 if (flags2 & RAW_PACKET_TRANSPORT) {
201 fake_rtp_packet_transport2_.reset(
202 new rtc::FakePacketTransport("channel2_rtp"));
203 rtp2 = fake_rtp_packet_transport2_.get();
204 if (!(flags2 & RTCP_MUX_REQUIRED)) {
205 fake_rtcp_packet_transport2_.reset(
206 new rtc::FakePacketTransport("channel2_rtcp"));
207 rtcp2 = fake_rtcp_packet_transport2_.get();
208 }
209 } else {
210 // Confirmed to work with KT_RSA and KT_ECDSA.
211 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
212 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
213 rtp2 = fake_rtp_dtls_transport2_.get();
214 if (!(flags2 & RTCP_MUX_REQUIRED)) {
215 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
216 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
217 rtcp2 = fake_rtcp_dtls_transport2_.get();
218 }
219 if (flags2 & DTLS) {
220 auto cert2 =
221 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
222 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
223 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
224 if (fake_rtcp_dtls_transport2_) {
225 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
226 }
227 }
jbauch5869f502017-06-29 12:31:36 -0700228 if (flags2 & ENCRYPTED_HEADERS) {
229 rtc::CryptoOptions crypto_options;
230 crypto_options.enable_encrypted_rtp_header_extensions = true;
231 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 if (fake_rtcp_dtls_transport2_) {
233 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
234 }
235 }
236 if (flags2 & GCM_CIPHER) {
237 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
238 rtc::SRTP_AEAD_AES_256_GCM);
239 if (fake_rtcp_dtls_transport2_) {
240 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
241 rtc::SRTP_AEAD_AES_256_GCM);
242 }
243 }
deadbeeff5346592017-01-24 21:51:21 -0800244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 channel1_ =
246 CreateChannel(worker_thread, network_thread_, &media_engine_,
247 std::move(ch1), fake_rtp_dtls_transport1_.get(),
248 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
249 channel2_ =
250 CreateChannel(worker_thread, network_thread_, &media_engine_,
251 std::move(ch2), fake_rtp_dtls_transport2_.get(),
252 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200253 channel1_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor1);
255 channel2_->SignalMediaMonitor.connect(this,
256 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800259 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800260 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000261 if ((flags1 & DTLS) && (flags2 & DTLS)) {
262 flags1 = (flags1 & ~SECURE);
263 flags2 = (flags2 & ~SECURE);
264 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000265 CreateContent(flags1, kPcmuCodec, kH264Codec,
266 &local_media_content1_);
267 CreateContent(flags2, kPcmuCodec, kH264Codec,
268 &local_media_content2_);
269 CopyContent(local_media_content1_, &remote_media_content1_);
270 CopyContent(local_media_content2_, &remote_media_content2_);
271
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 // Add stream information (SSRC) to the local content but not to the remote
273 // content. This means that we per default know the SSRC of what we send but
274 // not what we receive.
275 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
276 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
277
278 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
279 if (flags1 & SSRC_MUX) {
280 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
281 }
282 if (flags2 & SSRC_MUX) {
283 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
284 }
285 }
Steve Anton8699a322017-11-06 15:53:33 -0800286 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200287 rtc::Thread* worker_thread,
288 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700289 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800290 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800291 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
292 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800293 rtc::PacketTransportInternal* fake_rtp_packet_transport,
294 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700295 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800296 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800297 auto channel = rtc::MakeUnique<typename T::Channel>(
298 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800299 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
300 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800301 if (!channel->NeedsRtcpTransport()) {
302 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800303 }
Steve Anton8699a322017-11-06 15:53:33 -0800304 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
305 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000306 return channel;
307 }
308
deadbeeff5346592017-01-24 21:51:21 -0800309 void ConnectFakeTransports() {
310 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
311 bool asymmetric = false;
312 // Depending on test flags, could be using DTLS or raw packet transport.
313 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
314 fake_rtp_dtls_transport1_->SetDestination(
315 fake_rtp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
318 fake_rtcp_dtls_transport1_->SetDestination(
319 fake_rtcp_dtls_transport2_.get(), asymmetric);
320 }
321 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
322 fake_rtp_packet_transport1_->SetDestination(
323 fake_rtp_packet_transport2_.get(), asymmetric);
324 }
325 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
326 fake_rtcp_packet_transport1_->SetDestination(
327 fake_rtcp_packet_transport2_.get(), asymmetric);
328 }
329 });
330 }
331
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 bool result = channel1_->SetLocalContent(&local_media_content1_,
334 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
336 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetRemoteContent(&remote_media_content1_,
338 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800340 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000341 result = channel2_->SetLocalContent(&local_media_content2_,
342 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 }
344 }
345 return result;
346 }
347
348 bool SendAccept() {
349 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000350 return channel1_->SetRemoteContent(&remote_media_content2_,
351 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352 }
353
354 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 bool result = channel1_->SetLocalContent(&local_media_content1_,
356 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 if (result) {
358 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 result = channel2_->SetRemoteContent(&remote_media_content1_,
360 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 }
362 return result;
363 }
364
365 bool SendProvisionalAnswer() {
366 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
369 channel2_->Enable(true);
370 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000371 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800372 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 }
374 return result;
375 }
376
377 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 bool result = channel2_->SetLocalContent(&local_media_content2_,
379 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 result = channel1_->SetRemoteContent(&remote_media_content2_,
382 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 return result;
384 }
385
deadbeeff5346592017-01-24 21:51:21 -0800386 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 channel1_.reset();
388 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800389 fake_rtp_dtls_transport1_.reset();
390 fake_rtcp_dtls_transport1_.reset();
391 fake_rtp_dtls_transport2_.reset();
392 fake_rtcp_dtls_transport2_.reset();
393 fake_rtp_packet_transport1_.reset();
394 fake_rtcp_packet_transport1_.reset();
395 fake_rtp_packet_transport2_.reset();
396 fake_rtcp_packet_transport2_.reset();
397 if (network_thread_keeper_) {
398 network_thread_keeper_.reset();
399 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 return true;
401 }
402
403 bool AddStream1(int id) {
404 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
405 }
406 bool RemoveStream1(int id) {
407 return channel1_->RemoveRecvStream(id);
408 }
409
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp1() {
411 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtp2() {
415 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
416 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtcp1() {
419 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendRtcp2() {
422 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
426 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
427 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtcp1(uint32_t ssrc) {
434 rtc::Buffer data = CreateRtcpData(ssrc);
435 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtcp2(uint32_t ssrc) {
438 rtc::Buffer data = CreateRtcpData(ssrc);
439 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
451 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 }
454 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200455 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
457 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
461 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtcpData(ssrc);
465 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtcpData(ssrc);
469 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
472 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::SetBE32(data.data() + 8, ssrc);
475 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
482 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 return data;
486 }
487
488 bool CheckNoRtp1() {
489 return media_channel1_->CheckNoRtp();
490 }
491 bool CheckNoRtp2() {
492 return media_channel2_->CheckNoRtp();
493 }
494 bool CheckNoRtcp1() {
495 return media_channel1_->CheckNoRtcp();
496 }
497 bool CheckNoRtcp2() {
498 return media_channel2_->CheckNoRtcp();
499 }
500
501 void CreateContent(int flags,
502 const cricket::AudioCodec& audio_codec,
503 const cricket::VideoCodec& video_codec,
504 typename T::Content* content) {
505 // overridden in specialized classes
506 }
507 void CopyContent(const typename T::Content& source,
508 typename T::Content* content) {
509 // overridden in specialized classes
510 }
511
Steve Anton18ee1d52017-09-11 11:32:35 -0700512 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
515 typename T::Content* content = new typename T::Content();
516 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
517 AddLegacyStreamInContent(ssrc, 0, content);
518 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 }
520
ossu292d6582016-03-17 02:31:13 -0700521 // Will manage the lifetime of a CallThread, making sure it's
522 // destroyed before this object goes out of scope.
523 class ScopedCallThread {
524 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700526 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 : thread_(rtc::Thread::Create()),
528 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700529 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700530 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700531 }
532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700534
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700536
537 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200538 std::unique_ptr<rtc::Thread> thread_;
539 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700540 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
543 return false; // overridden in specialized classes
544 }
545
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200546 void OnMediaMonitor1(typename T::Channel* channel,
547 const typename T::MediaInfo& info) {
548 RTC_DCHECK_EQ(channel, channel1_.get());
549 media_info_callbacks1_++;
550 }
551 void OnMediaMonitor2(typename T::Channel* channel,
552 const typename T::MediaInfo& info) {
553 RTC_DCHECK_EQ(channel, channel2_.get());
554 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 }
deadbeeff5346592017-01-24 21:51:21 -0800556 void OnRtcpMuxFullyActive1(const std::string&) {
557 rtcp_mux_activated_callbacks1_++;
558 }
559 void OnRtcpMuxFullyActive2(const std::string&) {
560 rtcp_mux_activated_callbacks2_++;
561 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562
Honghai Zhangcc411c02016-03-29 17:27:21 -0700563 cricket::CandidatePairInterface* last_selected_candidate_pair() {
564 return last_selected_candidate_pair_;
565 }
566
Peter Boström0c4e06b2015-10-07 12:23:21 +0200567 void AddLegacyStreamInContent(uint32_t ssrc,
568 int flags,
569 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 // Base implementation.
571 }
572
573 // Tests that can be used by derived classes.
574
575 // Basic sanity check.
576 void TestInit() {
577 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700578 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200580 if (verify_playout_) {
581 EXPECT_FALSE(media_channel1_->playout());
582 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_TRUE(media_channel1_->codecs().empty());
584 EXPECT_TRUE(media_channel1_->recv_streams().empty());
585 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
586 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
587 }
588
589 // Test that SetLocalContent and SetRemoteContent properly configure
590 // the codecs.
591 void TestSetContents() {
592 CreateChannels(0, 0);
593 typename T::Content content;
594 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000595 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000597 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 ASSERT_EQ(1U, media_channel1_->codecs().size());
599 EXPECT_TRUE(CodecMatches(content.codecs()[0],
600 media_channel1_->codecs()[0]));
601 }
602
603 // Test that SetLocalContent and SetRemoteContent properly deals
604 // with an empty offer.
605 void TestSetContentsNullOffer() {
606 CreateChannels(0, 0);
607 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000608 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 CreateContent(0, kPcmuCodec, kH264Codec, &content);
610 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 ASSERT_EQ(1U, media_channel1_->codecs().size());
613 EXPECT_TRUE(CodecMatches(content.codecs()[0],
614 media_channel1_->codecs()[0]));
615 }
616
617 // Test that SetLocalContent and SetRemoteContent properly set RTCP
618 // mux.
619 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800620 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 typename T::Content content;
622 CreateContent(0, kPcmuCodec, kH264Codec, &content);
623 // Both sides agree on mux. Should no longer be a separate RTCP channel.
624 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000625 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
626 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000630 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
633 // Test that SetLocalContent and SetRemoteContent properly set RTCP
634 // mux when a provisional answer is received.
635 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800636 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 typename T::Content content;
638 CreateContent(0, kPcmuCodec, kH264Codec, &content);
639 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000640 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
641 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800642 // Both sides agree on mux. Should signal RTCP mux as fully activated.
643 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000644 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800645 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000647 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 }
653
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Test that SetRemoteContent properly deals with a content update.
655 void TestSetRemoteContentUpdate() {
656 CreateChannels(0, 0);
657 typename T::Content content;
deadbeefac22f702017-01-12 21:59:29 -0800658 CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000660 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
661 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 ASSERT_EQ(1U, media_channel1_->codecs().size());
663 EXPECT_TRUE(CodecMatches(content.codecs()[0],
664 media_channel1_->codecs()[0]));
665 // Now update with other codecs.
666 typename T::Content update_content;
667 update_content.set_partial(true);
668 CreateContent(0, kIsacCodec, kH264SvcCodec,
669 &update_content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000670 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 ASSERT_EQ(1U, media_channel1_->codecs().size());
672 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
673 media_channel1_->codecs()[0]));
674 // Now update without any codecs. This is ignored.
675 typename T::Content empty_content;
676 empty_content.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 ASSERT_EQ(1U, media_channel1_->codecs().size());
679 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
680 media_channel1_->codecs()[0]));
681 }
682
683 // Test that Add/RemoveStream properly forward to the media channel.
684 void TestStreams() {
685 CreateChannels(0, 0);
686 EXPECT_TRUE(AddStream1(1));
687 EXPECT_TRUE(AddStream1(2));
688 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
689 EXPECT_TRUE(RemoveStream1(2));
690 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
691 EXPECT_TRUE(RemoveStream1(1));
692 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
693 }
694
695 // Test that SetLocalContent properly handles adding and removing StreamParams
696 // to the local content description.
697 // This test uses the CA_UPDATE action that don't require a full
698 // MediaContentDescription to do an update.
699 void TestUpdateStreamsInLocalContent() {
700 cricket::StreamParams stream1;
701 stream1.groupid = "group1";
702 stream1.id = "stream1";
703 stream1.ssrcs.push_back(kSsrc1);
704 stream1.cname = "stream1_cname";
705
706 cricket::StreamParams stream2;
707 stream2.groupid = "group2";
708 stream2.id = "stream2";
709 stream2.ssrcs.push_back(kSsrc2);
710 stream2.cname = "stream2_cname";
711
712 cricket::StreamParams stream3;
713 stream3.groupid = "group3";
714 stream3.id = "stream3";
715 stream3.ssrcs.push_back(kSsrc3);
716 stream3.cname = "stream3_cname";
717
718 CreateChannels(0, 0);
719 typename T::Content content1;
720 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
721 content1.AddStream(stream1);
722 EXPECT_EQ(0u, media_channel1_->send_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000723 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724
725 ASSERT_EQ(1u, media_channel1_->send_streams().size());
726 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
727
728 // Update the local streams by adding another sending stream.
729 // Use a partial updated session description.
730 typename T::Content content2;
731 content2.AddStream(stream2);
732 content2.AddStream(stream3);
733 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000734 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 ASSERT_EQ(3u, media_channel1_->send_streams().size());
736 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
737 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
738 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
739
740 // Update the local streams by removing the first sending stream.
741 // This is done by removing all SSRCS for this particular stream.
742 typename T::Content content3;
743 stream1.ssrcs.clear();
744 content3.AddStream(stream1);
745 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 ASSERT_EQ(2u, media_channel1_->send_streams().size());
748 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
749 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
750
751 // Update the local streams with a stream that does not change.
752 // THe update is ignored.
753 typename T::Content content4;
754 content4.AddStream(stream2);
755 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000756 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757 ASSERT_EQ(2u, media_channel1_->send_streams().size());
758 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
759 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
760 }
761
762 // Test that SetRemoteContent properly handles adding and removing
763 // StreamParams to the remote content description.
764 // This test uses the CA_UPDATE action that don't require a full
765 // MediaContentDescription to do an update.
766 void TestUpdateStreamsInRemoteContent() {
767 cricket::StreamParams stream1;
768 stream1.id = "Stream1";
769 stream1.groupid = "1";
770 stream1.ssrcs.push_back(kSsrc1);
771 stream1.cname = "stream1_cname";
772
773 cricket::StreamParams stream2;
774 stream2.id = "Stream2";
775 stream2.groupid = "2";
776 stream2.ssrcs.push_back(kSsrc2);
777 stream2.cname = "stream2_cname";
778
779 cricket::StreamParams stream3;
780 stream3.id = "Stream3";
781 stream3.groupid = "3";
782 stream3.ssrcs.push_back(kSsrc3);
783 stream3.cname = "stream3_cname";
784
785 CreateChannels(0, 0);
786 typename T::Content content1;
787 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
788 content1.AddStream(stream1);
789 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000790 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
792 ASSERT_EQ(1u, media_channel1_->codecs().size());
793 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
794 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
795
796 // Update the remote streams by adding another sending stream.
797 // Use a partial updated session description.
798 typename T::Content content2;
799 content2.AddStream(stream2);
800 content2.AddStream(stream3);
801 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000802 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803 ASSERT_EQ(3u, media_channel1_->recv_streams().size());
804 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
805 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
806 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
807
808 // Update the remote streams by removing the first stream.
809 // This is done by removing all SSRCS for this particular stream.
810 typename T::Content content3;
811 stream1.ssrcs.clear();
812 content3.AddStream(stream1);
813 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
816 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
817 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
818
819 // Update the remote streams with a stream that does not change.
820 // The update is ignored.
821 typename T::Content content4;
822 content4.AddStream(stream2);
823 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000824 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
826 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
827 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
828 }
829
830 // Test that SetLocalContent and SetRemoteContent properly
831 // handles adding and removing StreamParams when the action is a full
832 // CA_OFFER / CA_ANSWER.
833 void TestChangeStreamParamsInContent() {
834 cricket::StreamParams stream1;
835 stream1.groupid = "group1";
836 stream1.id = "stream1";
837 stream1.ssrcs.push_back(kSsrc1);
838 stream1.cname = "stream1_cname";
839
840 cricket::StreamParams stream2;
841 stream2.groupid = "group1";
842 stream2.id = "stream2";
843 stream2.ssrcs.push_back(kSsrc2);
844 stream2.cname = "stream2_cname";
845
846 // Setup a call where channel 1 send |stream1| to channel 2.
847 CreateChannels(0, 0);
848 typename T::Content content1;
849 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
850 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000851 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852 EXPECT_TRUE(channel1_->Enable(true));
853 EXPECT_EQ(1u, media_channel1_->send_streams().size());
854
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000855 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800857 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858
859 // Channel 2 do not send anything.
860 typename T::Content content2;
861 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000862 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000864 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_TRUE(channel2_->Enable(true));
866 EXPECT_EQ(0u, media_channel2_->send_streams().size());
867
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200868 SendCustomRtp1(kSsrc1, 0);
869 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
871
872 // Let channel 2 update the content by sending |stream2| and enable SRTP.
873 typename T::Content content3;
874 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
875 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000876 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 ASSERT_EQ(1u, media_channel2_->send_streams().size());
878 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
879
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000880 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
882 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
883
884 // Channel 1 replies but stop sending stream1.
885 typename T::Content content4;
886 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000887 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 EXPECT_EQ(0u, media_channel1_->send_streams().size());
889
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000890 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000891 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
892
Zhi Huangcf990f52017-09-22 12:12:30 -0700893 EXPECT_TRUE(channel1_->srtp_active());
894 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200895 SendCustomRtp2(kSsrc2, 0);
896 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
898 }
899
jbauch5869f502017-06-29 12:31:36 -0700900 enum EncryptedHeaderTestScenario {
901 // Offer/Answer are processed before DTLS completes.
902 DEFAULT,
903 // DTLS completes before any Offer/Answer have been sent.
904 DTLS_BEFORE_OFFER_ANSWER,
905 // DTLS completes after channel 2 has processed (remote) Offer and (local)
906 // Answer.
907 DTLS_AFTER_CHANNEL2_READY,
908 };
909
910 // Test that encrypted header extensions are working and can be changed when
911 // sending a new OFFER/ANSWER.
912 void TestChangeEncryptedHeaderExtensions(int flags,
913 EncryptedHeaderTestScenario scenario = DEFAULT) {
914 RTC_CHECK(scenario == 0 || (flags & DTLS));
915 struct PacketListener : public sigslot::has_slots<> {
916 PacketListener() {}
917 void OnReadPacket(rtc::PacketTransportInternal* transport,
918 const char* data, size_t size, const rtc::PacketTime& time,
919 int flags) {
920 CompareHeaderExtensions(
921 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
922 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
923 false);
924 }
925 std::vector<int> encrypted_headers;
926 } packet_listener1, packet_listener2;
927
928 cricket::StreamParams stream1;
929 stream1.groupid = "group1";
930 stream1.id = "stream1";
931 stream1.ssrcs.push_back(kSsrc1);
932 stream1.cname = "stream1_cname";
933
934 cricket::StreamParams stream2;
935 stream2.groupid = "group1";
936 stream2.id = "stream2";
937 stream2.ssrcs.push_back(kSsrc2);
938 stream2.cname = "stream2_cname";
939
940 // Use SRTP when testing encrypted extensions.
941 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
942 // Enable SDES if channel is not using DTLS.
943 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
944
945 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
946 // Make sure to use URIs that are supported for encryption.
947 cricket::RtpHeaderExtensions extensions1;
948 extensions1.push_back(
949 RtpExtension(RtpExtension::kAudioLevelUri, 10));
950 extensions1.push_back(
951 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
952
953 cricket::RtpHeaderExtensions extensions2;
954 extensions2.push_back(
955 RtpExtension(RtpExtension::kAudioLevelUri, 10));
956 extensions2.push_back(
957 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
958 extensions2.push_back(
959 RtpExtension(RtpExtension::kVideoRotationUri, 3));
960 extensions2.push_back(
961 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
962
963 // Setup a call where channel 1 send |stream1| to channel 2.
964 CreateChannels(channel_flags, channel_flags);
965 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
966 &packet_listener1, &PacketListener::OnReadPacket);
967 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
968 &packet_listener2, &PacketListener::OnReadPacket);
969
970 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
971 ConnectFakeTransports();
972 WaitForThreads();
973 }
974
975 typename T::Content content1;
976 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
977 content1.AddStream(stream1);
978 content1.set_rtp_header_extensions(extensions1);
979 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
980 EXPECT_TRUE(channel1_->Enable(true));
981 EXPECT_EQ(1u, media_channel1_->send_streams().size());
982 packet_listener1.encrypted_headers.push_back(1);
983
984 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
985 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
986
987 // Channel 2 sends back |stream2|.
988 typename T::Content content2;
989 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
990 content2.AddStream(stream2);
991 content2.set_rtp_header_extensions(extensions1);
992 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
993 EXPECT_TRUE(channel2_->Enable(true));
994 EXPECT_EQ(1u, media_channel2_->send_streams().size());
995 packet_listener2.encrypted_headers.push_back(1);
996
997 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
998 ConnectFakeTransports();
999 WaitForThreads();
1000 }
1001
1002 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
1003 scenario == DTLS_AFTER_CHANNEL2_READY) {
1004 // In both scenarios with partially completed Offer/Answer, sending
1005 // packets from Channel 2 to Channel 1 should work.
1006 SendCustomRtp2(kSsrc2, 0);
1007 WaitForThreads();
1008 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1009 }
1010
1011 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
1012 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
1013
1014 if (scenario == DEFAULT) {
1015 ConnectFakeTransports();
1016 WaitForThreads();
1017 }
1018
1019 SendCustomRtp1(kSsrc1, 0);
1020 SendCustomRtp2(kSsrc2, 0);
1021 WaitForThreads();
1022 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1023 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1024
1025 // Let channel 2 update the encrypted header extensions.
1026 typename T::Content content3;
1027 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
1028 content3.AddStream(stream2);
1029 content3.set_rtp_header_extensions(extensions2);
1030 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
1031 ASSERT_EQ(1u, media_channel2_->send_streams().size());
1032 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
1033 packet_listener2.encrypted_headers.clear();
1034 packet_listener2.encrypted_headers.push_back(2);
1035 packet_listener2.encrypted_headers.push_back(4);
1036
1037 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
1038 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
1039 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
1040
1041 // Channel 1 is already sending the new encrypted extensions. These
1042 // can be decrypted by channel 2. Channel 2 is still sending the old
1043 // encrypted extensions (which can be decrypted by channel 1).
1044
1045 if (flags & DTLS) {
1046 // DTLS supports updating the encrypted extensions with only the OFFER
1047 // being processed. For SDES both the OFFER and ANSWER must have been
1048 // processed to update encrypted extensions, so we can't check this case.
1049 SendCustomRtp1(kSsrc1, 0);
1050 SendCustomRtp2(kSsrc2, 0);
1051 WaitForThreads();
1052 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1053 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1054 }
1055
1056 // Channel 1 replies with the same extensions.
1057 typename T::Content content4;
1058 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
1059 content4.AddStream(stream1);
1060 content4.set_rtp_header_extensions(extensions2);
1061 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
1062 EXPECT_EQ(1u, media_channel1_->send_streams().size());
1063 packet_listener1.encrypted_headers.clear();
1064 packet_listener1.encrypted_headers.push_back(2);
1065 packet_listener1.encrypted_headers.push_back(4);
1066
1067 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
1068 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
1069
1070 SendCustomRtp1(kSsrc1, 0);
1071 SendCustomRtp2(kSsrc2, 0);
1072 WaitForThreads();
1073 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1074 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1075 }
1076
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077 // Test that we only start playout and sending at the right times.
1078 void TestPlayoutAndSendingStates() {
1079 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +02001080 if (verify_playout_) {
1081 EXPECT_FALSE(media_channel1_->playout());
1082 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001084 if (verify_playout_) {
1085 EXPECT_FALSE(media_channel2_->playout());
1086 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001087 EXPECT_FALSE(media_channel2_->sending());
1088 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001089 if (verify_playout_) {
1090 EXPECT_FALSE(media_channel1_->playout());
1091 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001093 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1094 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001095 if (verify_playout_) {
1096 EXPECT_TRUE(media_channel1_->playout());
1097 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001099 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
1100 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001101 if (verify_playout_) {
1102 EXPECT_FALSE(media_channel2_->playout());
1103 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001105 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
1106 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001107 if (verify_playout_) {
1108 EXPECT_FALSE(media_channel2_->playout());
1109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -08001111 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +02001112 if (verify_playout_) {
1113 EXPECT_TRUE(media_channel1_->playout());
1114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001116 if (verify_playout_) {
1117 EXPECT_FALSE(media_channel2_->playout());
1118 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_FALSE(media_channel2_->sending());
1120 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001121 if (verify_playout_) {
1122 EXPECT_TRUE(media_channel2_->playout());
1123 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001125 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
1126 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001127 if (verify_playout_) {
1128 EXPECT_TRUE(media_channel1_->playout());
1129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(media_channel1_->sending());
1131 }
1132
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 // Test that changing the MediaContentDirection in the local and remote
1134 // session description start playout and sending at the right time.
1135 void TestMediaContentDirection() {
1136 CreateChannels(0, 0);
1137 typename T::Content content1;
1138 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
1139 typename T::Content content2;
1140 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
1141 // Set |content2| to be InActive.
1142 content2.set_direction(cricket::MD_INACTIVE);
1143
1144 EXPECT_TRUE(channel1_->Enable(true));
1145 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001146 if (verify_playout_) {
1147 EXPECT_FALSE(media_channel1_->playout());
1148 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001150 if (verify_playout_) {
1151 EXPECT_FALSE(media_channel2_->playout());
1152 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_FALSE(media_channel2_->sending());
1154
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001155 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
1156 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
1157 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1158 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001159 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160
Peter Boström34fbfff2015-09-24 19:20:30 +02001161 if (verify_playout_) {
1162 EXPECT_TRUE(media_channel1_->playout());
1163 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001165 if (verify_playout_) {
1166 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1167 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1169
1170 // Update |content2| to be RecvOnly.
1171 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001172 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1173 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174
Peter Boström34fbfff2015-09-24 19:20:30 +02001175 if (verify_playout_) {
1176 EXPECT_TRUE(media_channel1_->playout());
1177 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001179 if (verify_playout_) {
1180 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1181 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1183
1184 // Update |content2| to be SendRecv.
1185 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001186 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1187 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188
Peter Boström34fbfff2015-09-24 19:20:30 +02001189 if (verify_playout_) {
1190 EXPECT_TRUE(media_channel1_->playout());
1191 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001193 if (verify_playout_) {
1194 EXPECT_TRUE(media_channel2_->playout());
1195 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196 EXPECT_TRUE(media_channel2_->sending());
1197 }
1198
Honghai Zhangcc411c02016-03-29 17:27:21 -07001199 // Tests that when the transport channel signals a candidate pair change
1200 // event, the media channel will receive a call on the network route change.
1201 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001202 static constexpr uint16_t kLocalNetId = 1;
1203 static constexpr uint16_t kRemoteNetId = 2;
1204 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001205 // Ipv4(20) + UDP(8).
1206 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001207
Honghai Zhangcc411c02016-03-29 17:27:21 -07001208 CreateChannels(0, 0);
1209
Honghai Zhangcc411c02016-03-29 17:27:21 -07001210 typename T::MediaChannel* media_channel1 =
1211 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001212 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001213
Zhi Huang942bc2e2017-11-13 13:26:07 -08001214 // Need to wait for the threads before calling
1215 // |set_num_network_route_changes| because the network route would be set
1216 // when creating the channel.
1217 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001218 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001219 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001220 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001221 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001222 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1223
1224 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001225 });
1226 WaitForThreads();
1227 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001228 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001229 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001230
eladalon05b07bb2017-08-24 07:40:16 -07001231 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001232 rtc::NetworkRoute network_route;
1233 network_route.connected = true;
1234 network_route.local_network_id = kLocalNetId;
1235 network_route.remote_network_id = kRemoteNetId;
1236 network_route.last_sent_packet_id = kLastPacketId;
1237 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001238 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001239 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1240
1241 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001242 });
1243 WaitForThreads();
1244 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001245 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001247 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001248 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001249 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001250 EXPECT_EQ(kTransportOverheadPerPacket,
1251 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001252 }
1253
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 // Test setting up a call.
1255 void TestCallSetup() {
1256 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001257 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001259 if (verify_playout_) {
1260 EXPECT_TRUE(media_channel1_->playout());
1261 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001262 EXPECT_FALSE(media_channel1_->sending());
1263 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001264 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 EXPECT_TRUE(media_channel1_->sending());
1266 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001267 if (verify_playout_) {
1268 EXPECT_TRUE(media_channel2_->playout());
1269 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001270 EXPECT_TRUE(media_channel2_->sending());
1271 EXPECT_EQ(1U, media_channel2_->codecs().size());
1272 }
1273
1274 // Test that we don't crash if packets are sent during call teardown
1275 // when RTCP mux is enabled. This is a regression test against a specific
1276 // race condition that would only occur when a RTCP packet was sent during
1277 // teardown of a channel on which RTCP mux was enabled.
1278 void TestCallTeardownRtcpMux() {
1279 class LastWordMediaChannel : public T::MediaChannel {
1280 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001282 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001283 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1284 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1286 }
1287 };
Steve Anton8699a322017-11-06 15:53:33 -08001288 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1289 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 EXPECT_TRUE(SendInitiate());
1291 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001292 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 }
1294
1295 // Send voice RTP data to the other side and ensure it gets there.
1296 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001297 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298 EXPECT_TRUE(SendInitiate());
1299 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001300 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1301 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001302 SendRtp1();
1303 SendRtp2();
1304 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 EXPECT_TRUE(CheckRtp1());
1306 EXPECT_TRUE(CheckRtp2());
1307 EXPECT_TRUE(CheckNoRtp1());
1308 EXPECT_TRUE(CheckNoRtp2());
1309 }
1310
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001311 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001312 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001313 EXPECT_TRUE(SendInitiate());
1314 EXPECT_TRUE(SendAccept());
1315 SendRtp1();
1316 SendRtp2();
1317 SendRtcp1();
1318 SendRtcp2();
1319 // Do not wait, destroy channels.
1320 channel1_.reset(nullptr);
1321 channel2_.reset(nullptr);
1322 }
1323
deadbeefac22f702017-01-12 21:59:29 -08001324 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001326 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 EXPECT_TRUE(SendInitiate());
1328 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001329 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1330 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001331 SendRtcp1();
1332 SendRtcp2();
1333 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001334 EXPECT_TRUE(CheckRtcp1());
1335 EXPECT_TRUE(CheckRtcp2());
1336 EXPECT_TRUE(CheckNoRtcp1());
1337 EXPECT_TRUE(CheckNoRtcp2());
1338 }
1339
1340 // Check that RTCP is transmitted if only the initiator supports mux.
1341 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001342 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343 EXPECT_TRUE(SendInitiate());
1344 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001345 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1346 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001347 SendRtcp1();
1348 SendRtcp2();
1349 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001350 EXPECT_TRUE(CheckRtcp1());
1351 EXPECT_TRUE(CheckRtcp2());
1352 EXPECT_TRUE(CheckNoRtcp1());
1353 EXPECT_TRUE(CheckNoRtcp2());
1354 }
1355
1356 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1357 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001358 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001359 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001360 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1361 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1362 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001364 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1365 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001366 SendRtp1();
1367 SendRtp2();
1368 SendRtcp1();
1369 SendRtcp2();
1370 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 EXPECT_TRUE(CheckRtp1());
1372 EXPECT_TRUE(CheckRtp2());
1373 EXPECT_TRUE(CheckNoRtp1());
1374 EXPECT_TRUE(CheckNoRtp2());
1375 EXPECT_TRUE(CheckRtcp1());
1376 EXPECT_TRUE(CheckRtcp2());
1377 EXPECT_TRUE(CheckNoRtcp1());
1378 EXPECT_TRUE(CheckNoRtcp2());
1379 }
1380
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001381 // Check that RTP and RTCP are transmitted ok when both sides
1382 // support mux and one the offerer requires mux.
1383 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001384 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001385 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001386 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1387 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001388 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001389 SendRtp1();
1390 SendRtp2();
1391 SendRtcp1();
1392 SendRtcp2();
1393 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001394 EXPECT_TRUE(CheckRtp1());
1395 EXPECT_TRUE(CheckRtp2());
1396 EXPECT_TRUE(CheckNoRtp1());
1397 EXPECT_TRUE(CheckNoRtp2());
1398 EXPECT_TRUE(CheckRtcp1());
1399 EXPECT_TRUE(CheckRtcp2());
1400 EXPECT_TRUE(CheckNoRtcp1());
1401 EXPECT_TRUE(CheckNoRtcp2());
1402 }
1403
1404 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001405 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001406 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001407 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001408 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001409 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1410 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1411 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001412 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001413 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1414 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001415 SendRtp1();
1416 SendRtp2();
1417 SendRtcp1();
1418 SendRtcp2();
1419 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001420 EXPECT_TRUE(CheckRtp1());
1421 EXPECT_TRUE(CheckRtp2());
1422 EXPECT_TRUE(CheckNoRtp1());
1423 EXPECT_TRUE(CheckNoRtp2());
1424 EXPECT_TRUE(CheckRtcp1());
1425 EXPECT_TRUE(CheckRtcp2());
1426 EXPECT_TRUE(CheckNoRtcp1());
1427 EXPECT_TRUE(CheckNoRtcp2());
1428 }
1429
1430 // Check that RTP and RTCP are transmitted ok when both sides
1431 // require mux.
1432 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001433 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001434 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001435 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1436 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001437 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001438 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001439 SendRtp1();
1440 SendRtp2();
1441 SendRtcp1();
1442 SendRtcp2();
1443 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001444 EXPECT_TRUE(CheckRtp1());
1445 EXPECT_TRUE(CheckRtp2());
1446 EXPECT_TRUE(CheckNoRtp1());
1447 EXPECT_TRUE(CheckNoRtp2());
1448 EXPECT_TRUE(CheckRtcp1());
1449 EXPECT_TRUE(CheckRtcp2());
1450 EXPECT_TRUE(CheckNoRtcp1());
1451 EXPECT_TRUE(CheckNoRtcp2());
1452 }
1453
1454 // Check that SendAccept fails if the answerer doesn't support mux
1455 // and the offerer requires it.
1456 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001457 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001458 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001459 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1460 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001461 EXPECT_FALSE(SendAccept());
1462 }
1463
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464 // Check that RTCP data sent by the initiator before the accept is not muxed.
1465 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001466 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001468 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1469 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470
1471 // RTCP can be sent before the call is accepted, if the transport is ready.
1472 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001473 SendRtcp1();
1474 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001475 EXPECT_TRUE(CheckNoRtp2());
1476 EXPECT_TRUE(CheckRtcp2());
1477
1478 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001479 SendRtcp2();
1480 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001481 EXPECT_TRUE(CheckNoRtp1());
1482 EXPECT_TRUE(CheckRtcp1());
1483
1484 // Complete call setup and ensure everything is still OK.
1485 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001486 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001487 SendRtcp1();
1488 SendRtcp2();
1489 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(CheckRtcp1());
1492 }
1493
1494
1495 // Check that RTCP data is not muxed until both sides have enabled muxing,
1496 // but that we properly demux before we get the accept message, since there
1497 // is a race between RTP data and the jingle accept.
1498 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001499 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001501 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1502 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503
1504 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1505 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001506 SendRtcp1();
1507 WaitForThreads();
1508 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509
1510 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511 SendRtcp2();
1512 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 EXPECT_TRUE(CheckNoRtp1());
1514 EXPECT_TRUE(CheckRtcp1());
1515
1516 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001517 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001519 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1520 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001521 SendRtcp1();
1522 SendRtcp2();
1523 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 EXPECT_TRUE(CheckRtcp1());
1526 }
1527
1528 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001529 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001531 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1532 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533
deadbeefac22f702017-01-12 21:59:29 -08001534 int flags1 = SECURE | flags1_in;
1535 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536 bool dtls1 = !!(flags1_in & DTLS);
1537 bool dtls2 = !!(flags2_in & DTLS);
1538 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001539 EXPECT_FALSE(channel1_->srtp_active());
1540 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542 WaitForThreads();
1543 EXPECT_TRUE(channel1_->writable());
1544 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001546 EXPECT_TRUE(channel1_->srtp_active());
1547 EXPECT_TRUE(channel2_->srtp_active());
1548 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1549 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001550 SendRtp1();
1551 SendRtp2();
1552 SendRtcp1();
1553 SendRtcp2();
1554 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 EXPECT_TRUE(CheckRtp1());
1556 EXPECT_TRUE(CheckRtp2());
1557 EXPECT_TRUE(CheckNoRtp1());
1558 EXPECT_TRUE(CheckNoRtp2());
1559 EXPECT_TRUE(CheckRtcp1());
1560 EXPECT_TRUE(CheckRtcp2());
1561 EXPECT_TRUE(CheckNoRtcp1());
1562 EXPECT_TRUE(CheckNoRtcp2());
1563 }
1564
1565 // Test that we properly handling SRTP negotiating down to RTP.
1566 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001567 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001568 EXPECT_FALSE(channel1_->srtp_active());
1569 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570 EXPECT_TRUE(SendInitiate());
1571 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001572 EXPECT_FALSE(channel1_->srtp_active());
1573 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001574 SendRtp1();
1575 SendRtp2();
1576 SendRtcp1();
1577 SendRtcp2();
1578 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 EXPECT_TRUE(CheckRtp1());
1580 EXPECT_TRUE(CheckRtp2());
1581 EXPECT_TRUE(CheckNoRtp1());
1582 EXPECT_TRUE(CheckNoRtp2());
1583 EXPECT_TRUE(CheckRtcp1());
1584 EXPECT_TRUE(CheckRtcp2());
1585 EXPECT_TRUE(CheckNoRtcp1());
1586 EXPECT_TRUE(CheckNoRtcp2());
1587 }
1588
1589 // Test that we can send and receive early media when a provisional answer is
1590 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1591 void SendEarlyMediaUsingRtcpMuxSrtp() {
1592 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1593
deadbeefac22f702017-01-12 21:59:29 -08001594 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1595 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 EXPECT_TRUE(SendOffer());
1597 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001598 EXPECT_TRUE(channel1_->srtp_active());
1599 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001600 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1601 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001602 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1603 SendCustomRtcp1(kSsrc1);
1604 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1605 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1608
1609 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001610 SendCustomRtcp2(kSsrc2);
1611 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1612 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1615
1616 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001617 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1618 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001620 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1621 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1622 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1623 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001624 EXPECT_TRUE(channel1_->srtp_active());
1625 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626 SendCustomRtcp1(kSsrc1);
1627 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1628 SendCustomRtcp2(kSsrc2);
1629 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1630 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1635 }
1636
1637 // Test that we properly send RTP without SRTP from a thread.
1638 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001639 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 EXPECT_TRUE(SendInitiate());
1641 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1643 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1644 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1645 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1646 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1647 send_rtcp1.thread(),
1648 send_rtcp2.thread()};
1649 WaitForThreads(involved_threads);
1650 EXPECT_TRUE(CheckRtp1());
1651 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 EXPECT_TRUE(CheckNoRtp1());
1653 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654 EXPECT_TRUE(CheckRtcp1());
1655 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 EXPECT_TRUE(CheckNoRtcp1());
1657 EXPECT_TRUE(CheckNoRtcp2());
1658 }
1659
1660 // Test that we properly send SRTP with RTCP from a thread.
1661 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001662 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 EXPECT_TRUE(SendInitiate());
1664 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1666 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1667 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1668 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1669 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1670 send_rtcp1.thread(),
1671 send_rtcp2.thread()};
1672 WaitForThreads(involved_threads);
1673 EXPECT_TRUE(CheckRtp1());
1674 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 EXPECT_TRUE(CheckNoRtp1());
1676 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677 EXPECT_TRUE(CheckRtcp1());
1678 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 EXPECT_TRUE(CheckNoRtcp1());
1680 EXPECT_TRUE(CheckNoRtcp2());
1681 }
1682
1683 // Test that the mediachannel retains its sending state after the transport
1684 // becomes non-writable.
1685 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001686 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 EXPECT_TRUE(SendInitiate());
1688 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001689 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1690 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691 SendRtp1();
1692 SendRtp2();
1693 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 EXPECT_TRUE(CheckRtp1());
1695 EXPECT_TRUE(CheckRtp2());
1696 EXPECT_TRUE(CheckNoRtp1());
1697 EXPECT_TRUE(CheckNoRtp2());
1698
wu@webrtc.org97077a32013-10-25 21:18:33 +00001699 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001700 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1701 fake_rtp_dtls_transport1_->SetWritable(false);
1702 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703 SendRtp1();
1704 SendRtp2();
1705 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 EXPECT_TRUE(CheckRtp1());
1707 EXPECT_TRUE(CheckNoRtp2());
1708
1709 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001710 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1711 fake_rtp_dtls_transport1_->SetWritable(true);
1712 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714 SendRtp1();
1715 SendRtp2();
1716 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_TRUE(CheckRtp1());
1718 EXPECT_TRUE(CheckRtp2());
1719 EXPECT_TRUE(CheckNoRtp1());
1720 EXPECT_TRUE(CheckNoRtp2());
1721
1722 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001723 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1724 bool asymmetric = true;
1725 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1726 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 EXPECT_TRUE(media_channel1_->sending());
1728
wu@webrtc.org97077a32013-10-25 21:18:33 +00001729 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730 SendRtp1();
1731 SendRtp2();
1732 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_TRUE(CheckRtp1());
1734 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001735 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001736
1737 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001738 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001739 bool asymmetric = true;
1740 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1741 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001742 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744 SendRtp1();
1745 SendRtp2();
1746 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 EXPECT_TRUE(CheckRtp1());
1748 EXPECT_TRUE(CheckRtp2());
1749 EXPECT_TRUE(CheckNoRtp1());
1750 EXPECT_TRUE(CheckNoRtp2());
1751 }
1752
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001753 void SendBundleToBundle(
1754 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1755 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001757 // Only pl_type1 was added to the bundle filter for both |channel1_|
1758 // and |channel2_|.
1759 int pl_type1 = pl_types[0];
1760 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001761 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001762 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001763 if (rtcp_mux) {
1764 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001765 }
1766 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001768 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1769 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001771 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1772 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001773 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1774 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1775 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1776 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001777
1778 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001779 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1780 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1781 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001782 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001783 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1784 EXPECT_TRUE(CheckNoRtp1());
1785 EXPECT_TRUE(CheckNoRtp2());
1786
1787 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1789 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1790 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001791 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001792 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794 SendCustomRtcp1(kSsrc1);
1795 SendCustomRtcp2(kSsrc2);
1796 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1798 EXPECT_TRUE(CheckNoRtcp1());
1799 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1800 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802 SendCustomRtcp1(kSsrc2);
1803 SendCustomRtcp2(kSsrc1);
1804 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001805 // Bundle filter shouldn't filter out any RTCP.
1806 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1807 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 }
1809
deadbeefc6b6e092016-12-01 12:49:20 -08001810 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 CreateChannels(0, 0);
1813 EXPECT_TRUE(SendInitiate());
1814 EXPECT_TRUE(SendAccept());
1815 channel1_->StartMediaMonitor(100);
1816 channel2_->StartMediaMonitor(100);
1817 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001818 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1819 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 channel1_->StopMediaMonitor();
1821 channel2_->StopMediaMonitor();
1822 // Ensure a restart of a stopped monitor works.
1823 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001824 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 channel1_->StopMediaMonitor();
1826 // Ensure stopping a stopped monitor is OK.
1827 channel1_->StopMediaMonitor();
1828 }
1829
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830 void TestSetContentFailure() {
1831 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832
Peter Thatchera6d24442015-07-09 21:26:36 -07001833 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001834 std::unique_ptr<typename T::Content> content(
1835 CreateMediaContentWithStream(1));
1836
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001838 EXPECT_FALSE(
1839 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1840 EXPECT_FALSE(
1841 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001844 EXPECT_FALSE(
1845 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1846
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001848 EXPECT_FALSE(
1849 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 }
1851
1852 void TestSendTwoOffers() {
1853 CreateChannels(0, 0);
1854
Peter Thatchera6d24442015-07-09 21:26:36 -07001855 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001856 std::unique_ptr<typename T::Content> content1(
1857 CreateMediaContentWithStream(1));
1858 EXPECT_TRUE(
1859 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1861
Steve Anton18ee1d52017-09-11 11:32:35 -07001862 std::unique_ptr<typename T::Content> content2(
1863 CreateMediaContentWithStream(2));
1864 EXPECT_TRUE(
1865 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001866 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1867 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1868 }
1869
1870 void TestReceiveTwoOffers() {
1871 CreateChannels(0, 0);
1872
Peter Thatchera6d24442015-07-09 21:26:36 -07001873 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001874 std::unique_ptr<typename T::Content> content1(
1875 CreateMediaContentWithStream(1));
1876 EXPECT_TRUE(
1877 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001878 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1879
Steve Anton18ee1d52017-09-11 11:32:35 -07001880 std::unique_ptr<typename T::Content> content2(
1881 CreateMediaContentWithStream(2));
1882 EXPECT_TRUE(
1883 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1885 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1886 }
1887
1888 void TestSendPrAnswer() {
1889 CreateChannels(0, 0);
1890
Peter Thatchera6d24442015-07-09 21:26:36 -07001891 std::string err;
1892 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001893 std::unique_ptr<typename T::Content> content1(
1894 CreateMediaContentWithStream(1));
1895 EXPECT_TRUE(
1896 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1898
Peter Thatchera6d24442015-07-09 21:26:36 -07001899 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001900 std::unique_ptr<typename T::Content> content2(
1901 CreateMediaContentWithStream(2));
1902 EXPECT_TRUE(
1903 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1905 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1906
Peter Thatchera6d24442015-07-09 21:26:36 -07001907 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001908 std::unique_ptr<typename T::Content> content3(
1909 CreateMediaContentWithStream(3));
1910 EXPECT_TRUE(
1911 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1913 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1914 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1915 }
1916
1917 void TestReceivePrAnswer() {
1918 CreateChannels(0, 0);
1919
Peter Thatchera6d24442015-07-09 21:26:36 -07001920 std::string err;
1921 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001922 std::unique_ptr<typename T::Content> content1(
1923 CreateMediaContentWithStream(1));
1924 EXPECT_TRUE(
1925 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1927
Peter Thatchera6d24442015-07-09 21:26:36 -07001928 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001929 std::unique_ptr<typename T::Content> content2(
1930 CreateMediaContentWithStream(2));
1931 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1932 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001933 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1934 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1935
Peter Thatchera6d24442015-07-09 21:26:36 -07001936 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001937 std::unique_ptr<typename T::Content> content3(
1938 CreateMediaContentWithStream(3));
1939 EXPECT_TRUE(
1940 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1942 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1943 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1944 }
1945
1946 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001947 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 EXPECT_TRUE(SendInitiate());
1949 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001950 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1951 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952
1953 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 // The sending message is only posted. channel2_ should be empty.
1956 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1958 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959
1960 // When channel1_ is deleted, the RTCP packet should be sent out to
1961 // channel2_.
1962 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 EXPECT_TRUE(CheckRtcp2());
1965 }
1966
zstein56162b92017-04-24 16:54:35 -07001967 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001968 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970
zstein56162b92017-04-24 16:54:35 -07001971 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001972 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 EXPECT_TRUE(media_channel1_->ready_to_send());
1974
zstein56162b92017-04-24 16:54:35 -07001975 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001976 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 }
1979
zstein56162b92017-04-24 16:54:35 -07001980 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001981 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 typename T::Content content;
1983 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001984 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001986 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001987 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001988 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001989 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1990 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991 EXPECT_FALSE(media_channel1_->ready_to_send());
1992 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1993 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001994 network_thread_->Invoke<void>(RTC_FROM_HERE,
1995 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001996 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998
zstein56162b92017-04-24 16:54:35 -07001999 // TODO(zstein): Find a way to test this without making
2000 // OnTransportReadyToSend public.
2001 network_thread_->Invoke<void>(
2002 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002003 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002004 EXPECT_FALSE(media_channel1_->ready_to_send());
2005 }
2006
skvladdc1c62c2016-03-16 19:07:43 -07002007 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
2008 typename T::Content content;
2009 CreateContent(0, kPcmuCodec, kH264Codec, &content);
2010 content.set_bandwidth(remote_limit);
2011 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
2012 }
2013
deadbeefe702b302017-02-04 12:09:01 -08002014 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07002015 webrtc::RtpParameters parameters;
2016 webrtc::RtpEncodingParameters encoding;
2017 encoding.max_bitrate_bps = limit;
2018 parameters.encodings.push_back(encoding);
2019 return parameters;
2020 }
2021
2022 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08002023 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07002024 EXPECT_EQ(1UL, parameters.encodings.size());
2025 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
2026 }
2027
2028 void DefaultMaxBitrateIsUnlimited() {
2029 CreateChannels(0, 0);
2030 EXPECT_TRUE(
2031 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2032 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08002033 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2034 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002035 }
2036
2037 void CanChangeMaxBitrate() {
2038 CreateChannels(0, 0);
2039 EXPECT_TRUE(
2040 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2041
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07002042 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08002043 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
2044 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2045 rtc::Optional<int>(1000));
2046 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2047 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07002048 EXPECT_EQ(-1, media_channel1_->max_bps());
2049
deadbeefe702b302017-02-04 12:09:01 -08002050 EXPECT_TRUE(channel1_->SetRtpSendParameters(
2051 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
2052 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2053 rtc::Optional<int>());
2054 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2055 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002056 EXPECT_EQ(-1, media_channel1_->max_bps());
2057 }
2058
Steve Anton8a63f782017-10-23 13:08:53 -07002059 // Test that when a channel gets new transports with a call to
2060 // |SetTransports|, the socket options from the old transports are merged with
2061 // the options on the new transport.
2062 // For example, audio and video may use separate socket options, but initially
2063 // be unbundled, then later become bundled. When this happens, their preferred
2064 // socket options should be merged to the underlying transport they share.
2065 void SocketOptionsMergedOnSetTransport() {
2066 constexpr int kSndBufSize = 4000;
2067 constexpr int kRcvBufSize = 8000;
2068
2069 CreateChannels(0, 0);
2070
2071 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
2072 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
2073 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
2074 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
2075
2076 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
2077 channel2_->rtcp_dtls_transport());
2078
2079 int option_val;
2080 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2081 rtc::Socket::Option::OPT_SNDBUF, &option_val));
2082 EXPECT_EQ(kSndBufSize, option_val);
2083 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2084 rtc::Socket::Option::OPT_RCVBUF, &option_val));
2085 EXPECT_EQ(kRcvBufSize, option_val);
2086 }
2087
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002089 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2090 static void ProcessThreadQueue(rtc::Thread* thread) {
2091 RTC_DCHECK(thread->IsCurrent());
2092 while (!thread->empty()) {
2093 thread->ProcessMessages(0);
2094 }
2095 }
2096 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2097 // |threads| and current thread post packets to network thread.
2098 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002099 thread->Invoke<void>(RTC_FROM_HERE,
2100 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101 }
2102 ProcessThreadQueue(rtc::Thread::Current());
2103 // Network thread move them around and post back to worker = current thread.
2104 if (!network_thread_->IsCurrent()) {
2105 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002106 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002107 }
2108 // Worker thread = current Thread process received messages.
2109 ProcessThreadQueue(rtc::Thread::Current());
2110 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002111 // TODO(pbos): Remove playout from all media channels and let renderers mute
2112 // themselves.
2113 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002114 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2115 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002116 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2117 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2118 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2119 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2120 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2121 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2122 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2123 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124 cricket::FakeMediaEngine media_engine_;
2125 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002126 typename T::MediaChannel* media_channel1_ = nullptr;
2127 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002128 std::unique_ptr<typename T::Channel> channel1_;
2129 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 typename T::Content local_media_content1_;
2131 typename T::Content local_media_content2_;
2132 typename T::Content remote_media_content1_;
2133 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002135 rtc::Buffer rtp_packet_;
2136 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002137 int media_info_callbacks1_ = 0;
2138 int media_info_callbacks2_ = 0;
2139 int rtcp_mux_activated_callbacks1_ = 0;
2140 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002141 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142};
2143
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144template<>
2145void ChannelTest<VoiceTraits>::CreateContent(
2146 int flags,
2147 const cricket::AudioCodec& audio_codec,
2148 const cricket::VideoCodec& video_codec,
2149 cricket::AudioContentDescription* audio) {
2150 audio->AddCodec(audio_codec);
2151 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2152 if (flags & SECURE) {
2153 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002154 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2155 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 }
2157}
2158
2159template<>
2160void ChannelTest<VoiceTraits>::CopyContent(
2161 const cricket::AudioContentDescription& source,
2162 cricket::AudioContentDescription* audio) {
2163 *audio = source;
2164}
2165
2166template<>
2167bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2168 const cricket::AudioCodec& c2) {
2169 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2170 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2171}
2172
Peter Boström0c4e06b2015-10-07 12:23:21 +02002173template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002175 uint32_t ssrc,
2176 int flags,
2177 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178 audio->AddLegacyStream(ssrc);
2179}
2180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002181class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002182 public:
solenberg1dd98f32015-09-10 01:57:14 -07002183 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002184 VoiceChannelSingleThreadTest()
2185 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2186};
2187
2188class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2189 public:
2190 typedef ChannelTest<VoiceTraits> Base;
2191 VoiceChannelDoubleThreadTest()
2192 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002193};
2194
jbauch5869f502017-06-29 12:31:36 -07002195class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2196 : public ChannelTest<VoiceTraits> {
2197 public:
2198 typedef ChannelTest<VoiceTraits> Base;
2199 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2200 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2201 NetworkIsWorker::Yes) {}
2202};
2203
2204class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2205 : public ChannelTest<VoiceTraits> {
2206 public:
2207 typedef ChannelTest<VoiceTraits> Base;
2208 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2209 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2210 NetworkIsWorker::No) {}
2211};
2212
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002214template <>
Steve Anton8699a322017-11-06 15:53:33 -08002215std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002216 rtc::Thread* worker_thread,
2217 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002218 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002219 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002220 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2221 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002222 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2223 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002224 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002225 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002226 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2227 worker_thread, network_thread, signaling_thread, std::move(ch),
2228 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2229 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002230 if (!channel->NeedsRtcpTransport()) {
2231 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002232 }
Steve Anton8699a322017-11-06 15:53:33 -08002233 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2234 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235 return channel;
2236}
2237
2238// override to add 0 parameter
2239template<>
2240bool ChannelTest<VideoTraits>::AddStream1(int id) {
2241 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2242}
2243
2244template<>
2245void ChannelTest<VideoTraits>::CreateContent(
2246 int flags,
2247 const cricket::AudioCodec& audio_codec,
2248 const cricket::VideoCodec& video_codec,
2249 cricket::VideoContentDescription* video) {
2250 video->AddCodec(video_codec);
2251 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2252 if (flags & SECURE) {
2253 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002254 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2255 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 }
2257}
2258
2259template<>
2260void ChannelTest<VideoTraits>::CopyContent(
2261 const cricket::VideoContentDescription& source,
2262 cricket::VideoContentDescription* video) {
2263 *video = source;
2264}
2265
2266template<>
2267bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2268 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002269 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270}
2271
Peter Boström0c4e06b2015-10-07 12:23:21 +02002272template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002274 uint32_t ssrc,
2275 int flags,
2276 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 video->AddLegacyStream(ssrc);
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 public:
solenberg1dd98f32015-09-10 01:57:14 -07002282 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283 VideoChannelSingleThreadTest()
2284 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285};
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2288 public:
2289 typedef ChannelTest<VideoTraits> Base;
2290 VideoChannelDoubleThreadTest()
2291 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2292};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002294TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 Base::TestInit();
2296 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2297 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2298}
2299
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002300TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2301 Base::TestDeinit();
2302}
2303
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002304TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 Base::TestSetContents();
2306}
2307
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309 Base::TestSetContentsNullOffer();
2310}
2311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002312TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313 Base::TestSetContentsRtcpMux();
2314}
2315
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002316TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317 Base::TestSetContentsRtcpMux();
2318}
2319
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002320TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321 Base::TestSetRemoteContentUpdate();
2322}
2323
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002324TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325 Base::TestStreams();
2326}
2327
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002328TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 Base::TestUpdateStreamsInLocalContent();
2330}
2331
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002332TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333 Base::TestUpdateStreamsInRemoteContent();
2334}
2335
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002336TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337 Base::TestChangeStreamParamsInContent();
2338}
2339
jbauch5869f502017-06-29 12:31:36 -07002340TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2341 TestChangeEncryptedHeaderExtensionsDtls) {
2342 int flags = DTLS;
2343 Base::TestChangeEncryptedHeaderExtensions(flags);
2344}
2345
2346TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2347 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2348 int flags = DTLS;
2349 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2350}
2351
2352TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2353 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2354 int flags = DTLS;
2355 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2356}
2357
2358TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2359 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2360 int flags = DTLS | GCM_CIPHER;
2361 Base::TestChangeEncryptedHeaderExtensions(flags);
2362}
2363
2364TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2365 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2366 int flags = DTLS | GCM_CIPHER;
2367 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2368}
2369
2370TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2371 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2372 int flags = DTLS | GCM_CIPHER;
2373 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2374}
2375
2376TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2377 TestChangeEncryptedHeaderExtensionsSDES) {
2378 int flags = 0;
2379 Base::TestChangeEncryptedHeaderExtensions(flags);
2380}
2381
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002382TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383 Base::TestPlayoutAndSendingStates();
2384}
2385
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002386TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002387 CreateChannels(0, 0);
2388 // Test that we can Mute the default channel even though the sending SSRC
2389 // is unknown.
2390 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002391 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002392 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2393 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002394 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2395
2396 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002397 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002398
2399 SendInitiate();
2400 // After the local session description has been set, we can mute a stream
2401 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002402 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002403 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2404 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002405 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406}
2407
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002408TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409 Base::TestMediaContentDirection();
2410}
2411
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002412TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002413 Base::TestNetworkRouteChanges();
2414}
2415
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002416TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 Base::TestCallSetup();
2418}
2419
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002420TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 Base::TestCallTeardownRtcpMux();
2422}
2423
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002424TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 Base::SendRtpToRtp();
2426}
2427
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002428TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 Base::SendRtcpToRtcp();
2430}
2431
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002432TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 Base::SendRtcpMuxToRtcp();
2434}
2435
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002436TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 Base::SendRtcpMuxToRtcpMux();
2438}
2439
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002440TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002441 Base::SendRequireRtcpMuxToRtcpMux();
2442}
2443
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002444TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002445 Base::SendRtcpMuxToRequireRtcpMux();
2446}
2447
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002448TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002449 Base::SendRequireRtcpMuxToRequireRtcpMux();
2450}
2451
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002452TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002453 Base::SendRequireRtcpMuxToNoRtcpMux();
2454}
2455
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002456TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002457 Base::SendEarlyRtcpMuxToRtcp();
2458}
2459
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002460TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002461 Base::SendEarlyRtcpMuxToRtcpMux();
2462}
2463
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002464TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2466}
2467
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002468TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 Base::SendSrtpToSrtp();
2470}
2471
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002472TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2474}
2475
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002476TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 Base::SendSrtpToSrtp(DTLS, 0);
2478}
2479
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002480TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 Base::SendSrtpToSrtp(DTLS, DTLS);
2482}
2483
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002484TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2486}
2487
deadbeeff5346592017-01-24 21:51:21 -08002488// Test using the channel with a raw packet interface, as opposed to a DTLS
2489// transport interface.
2490TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2491 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2492}
2493
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002494TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2496}
2497
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002498TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 Base::SendRtpToRtpOnThread();
2500}
2501
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002502TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503 Base::SendSrtpToSrtpOnThread();
2504}
2505
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002506TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 Base::SendWithWritabilityLoss();
2508}
2509
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002510TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 Base::TestMediaMonitor();
2512}
2513
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002515TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 CreateChannels(0, 0);
2517 EXPECT_TRUE(SendInitiate());
2518 EXPECT_TRUE(SendAccept());
2519 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2520
solenberg1d63dd02015-12-02 12:35:09 -08002521 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2522 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2523 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002525 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002527 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002528 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002529 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002530 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002531 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532}
2533
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002534TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002535 Base::TestSetContentFailure();
2536}
2537
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002538TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 Base::TestSendTwoOffers();
2540}
2541
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002542TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543 Base::TestReceiveTwoOffers();
2544}
2545
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002546TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547 Base::TestSendPrAnswer();
2548}
2549
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002550TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551 Base::TestReceivePrAnswer();
2552}
2553
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002554TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555 Base::TestFlushRtcp();
2556}
2557
zstein56162b92017-04-24 16:54:35 -07002558TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2559 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
zstein56162b92017-04-24 16:54:35 -07002562TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2563 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564}
2565
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002567TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002568 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569 EXPECT_TRUE(SendInitiate());
2570 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002571 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572
solenberg4bac9c52015-10-09 02:32:53 -07002573 // Default is (1.0).
2574 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2575 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002577 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002578
solenberg4bac9c52015-10-09 02:32:53 -07002579 // Set scale to (1.5).
2580 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2581 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2582 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583
solenberg4bac9c52015-10-09 02:32:53 -07002584 // Set scale to (0).
2585 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2586 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2587 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588}
2589
2590// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002591TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002592 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593 EXPECT_TRUE(SendInitiate());
2594 EXPECT_TRUE(SendAccept());
2595 EXPECT_TRUE(AddStream1(1));
2596 EXPECT_TRUE(AddStream1(2));
2597
solenberg4bac9c52015-10-09 02:32:53 -07002598 double volume;
2599 // Default is (1.0).
2600 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2601 EXPECT_DOUBLE_EQ(1.0, volume);
2602 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2603 EXPECT_DOUBLE_EQ(1.0, volume);
2604 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2605 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002606 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002607 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608
solenberg4bac9c52015-10-09 02:32:53 -07002609 // Set scale to (1.5) for ssrc = 1.
2610 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2611 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2612 EXPECT_DOUBLE_EQ(1.5, volume);
2613 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2614 EXPECT_DOUBLE_EQ(1.0, volume);
2615 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2616 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002617
solenberg4bac9c52015-10-09 02:32:53 -07002618 // Set scale to (0) for all ssrcs.
2619 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2620 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2621 EXPECT_DOUBLE_EQ(0.0, volume);
2622 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2623 EXPECT_DOUBLE_EQ(0.0, volume);
2624 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2625 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002626}
2627
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002628TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002629 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002630}
2631
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002632TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002633 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002634}
2635
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002636TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002637 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002638}
2639
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002640TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002641 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002642}
2643
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002644TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002645 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002646}
2647
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002648TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002649 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002650}
2651
Steve Anton8a63f782017-10-23 13:08:53 -07002652TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2653 Base::SocketOptionsMergedOnSetTransport();
2654}
2655
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002656// VoiceChannelDoubleThreadTest
2657TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002659 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2660 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661}
2662
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002663TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2664 Base::TestDeinit();
2665}
2666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002667TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668 Base::TestSetContents();
2669}
2670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002671TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 Base::TestSetContentsNullOffer();
2673}
2674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002675TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 Base::TestSetContentsRtcpMux();
2677}
2678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002679TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 Base::TestSetContentsRtcpMux();
2681}
2682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002683TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684 Base::TestSetRemoteContentUpdate();
2685}
2686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002687TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002688 Base::TestStreams();
2689}
2690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002691TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 Base::TestUpdateStreamsInLocalContent();
2693}
2694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002695TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 Base::TestUpdateStreamsInRemoteContent();
2697}
2698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002699TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002700 Base::TestChangeStreamParamsInContent();
2701}
2702
jbauch5869f502017-06-29 12:31:36 -07002703TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2704 TestChangeEncryptedHeaderExtensionsDtls) {
2705 int flags = DTLS;
2706 Base::TestChangeEncryptedHeaderExtensions(flags);
2707}
2708
2709TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2710 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2711 int flags = DTLS;
2712 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2713}
2714
2715TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2716 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2717 int flags = DTLS;
2718 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2719}
2720
2721TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2722 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2723 int flags = DTLS | GCM_CIPHER;
2724 Base::TestChangeEncryptedHeaderExtensions(flags);
2725}
2726
2727TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2728 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2729 int flags = DTLS | GCM_CIPHER;
2730 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2731}
2732
2733TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2734 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2735 int flags = DTLS | GCM_CIPHER;
2736 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2737}
2738
2739TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2740 TestChangeEncryptedHeaderExtensionsSDES) {
2741 int flags = 0;
2742 Base::TestChangeEncryptedHeaderExtensions(flags);
2743}
2744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002745TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 Base::TestPlayoutAndSendingStates();
2747}
2748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002749TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2750 CreateChannels(0, 0);
2751 // Test that we can Mute the default channel even though the sending SSRC
2752 // is unknown.
2753 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2754 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2755 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2756 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2757 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2758
2759 // Test that we can not mute an unknown SSRC.
2760 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2761
2762 SendInitiate();
2763 // After the local session description has been set, we can mute a stream
2764 // with its SSRC.
2765 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2766 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2767 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2768 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2769}
2770
2771TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2772 Base::TestMediaContentDirection();
2773}
2774
2775TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2776 Base::TestNetworkRouteChanges();
2777}
2778
2779TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2780 Base::TestCallSetup();
2781}
2782
2783TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2784 Base::TestCallTeardownRtcpMux();
2785}
2786
2787TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2788 Base::SendRtpToRtp();
2789}
2790
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002791TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2792 Base::SendRtcpToRtcp();
2793}
2794
2795TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2796 Base::SendRtcpMuxToRtcp();
2797}
2798
2799TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2800 Base::SendRtcpMuxToRtcpMux();
2801}
2802
2803TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2804 Base::SendRequireRtcpMuxToRtcpMux();
2805}
2806
2807TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2808 Base::SendRtcpMuxToRequireRtcpMux();
2809}
2810
2811TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2812 Base::SendRequireRtcpMuxToRequireRtcpMux();
2813}
2814
2815TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2816 Base::SendRequireRtcpMuxToNoRtcpMux();
2817}
2818
2819TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2820 Base::SendEarlyRtcpMuxToRtcp();
2821}
2822
2823TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2824 Base::SendEarlyRtcpMuxToRtcpMux();
2825}
2826
2827TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2828 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2829}
2830
2831TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2832 Base::SendSrtpToSrtp();
2833}
2834
2835TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2836 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2837}
2838
2839TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002840 Base::SendSrtpToSrtp(DTLS, 0);
2841}
2842
2843TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002844 Base::SendSrtpToSrtp(DTLS, DTLS);
2845}
2846
2847TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002848 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2849}
2850
deadbeeff5346592017-01-24 21:51:21 -08002851// Test using the channel with a raw packet interface, as opposed to a DTLS
2852// transport interface.
2853TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2854 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2855}
2856
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002857TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2858 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2859}
2860
2861TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2862 Base::SendRtpToRtpOnThread();
2863}
2864
2865TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2866 Base::SendSrtpToSrtpOnThread();
2867}
2868
2869TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2870 Base::SendWithWritabilityLoss();
2871}
2872
2873TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2874 Base::TestMediaMonitor();
2875}
2876
2877// Test that InsertDtmf properly forwards to the media channel.
2878TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2879 CreateChannels(0, 0);
2880 EXPECT_TRUE(SendInitiate());
2881 EXPECT_TRUE(SendAccept());
2882 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2883
2884 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2885 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2886 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2887
2888 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2889 EXPECT_TRUE(
2890 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2891 EXPECT_TRUE(
2892 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2893 EXPECT_TRUE(
2894 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2895}
2896
2897TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2898 Base::TestSetContentFailure();
2899}
2900
2901TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2902 Base::TestSendTwoOffers();
2903}
2904
2905TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2906 Base::TestReceiveTwoOffers();
2907}
2908
2909TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2910 Base::TestSendPrAnswer();
2911}
2912
2913TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2914 Base::TestReceivePrAnswer();
2915}
2916
2917TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2918 Base::TestFlushRtcp();
2919}
2920
zstein56162b92017-04-24 16:54:35 -07002921TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2922 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002923}
2924
zstein56162b92017-04-24 16:54:35 -07002925TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2926 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002927}
2928
2929// Test that we can scale the output volume properly for 1:1 calls.
2930TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002931 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002932 EXPECT_TRUE(SendInitiate());
2933 EXPECT_TRUE(SendAccept());
2934 double volume;
2935
2936 // Default is (1.0).
2937 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2938 EXPECT_DOUBLE_EQ(1.0, volume);
2939 // invalid ssrc.
2940 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2941
2942 // Set scale to (1.5).
2943 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2944 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2945 EXPECT_DOUBLE_EQ(1.5, volume);
2946
2947 // Set scale to (0).
2948 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2949 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2950 EXPECT_DOUBLE_EQ(0.0, volume);
2951}
2952
2953// Test that we can scale the output volume properly for multiway calls.
2954TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002955 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002956 EXPECT_TRUE(SendInitiate());
2957 EXPECT_TRUE(SendAccept());
2958 EXPECT_TRUE(AddStream1(1));
2959 EXPECT_TRUE(AddStream1(2));
2960
2961 double volume;
2962 // Default is (1.0).
2963 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2964 EXPECT_DOUBLE_EQ(1.0, volume);
2965 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2966 EXPECT_DOUBLE_EQ(1.0, volume);
2967 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2968 EXPECT_DOUBLE_EQ(1.0, volume);
2969 // invalid ssrc.
2970 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2971
2972 // Set scale to (1.5) for ssrc = 1.
2973 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2974 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2975 EXPECT_DOUBLE_EQ(1.5, volume);
2976 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2977 EXPECT_DOUBLE_EQ(1.0, volume);
2978 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2979 EXPECT_DOUBLE_EQ(1.0, volume);
2980
2981 // Set scale to (0) for all ssrcs.
2982 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2983 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2984 EXPECT_DOUBLE_EQ(0.0, volume);
2985 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2986 EXPECT_DOUBLE_EQ(0.0, volume);
2987 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2988 EXPECT_DOUBLE_EQ(0.0, volume);
2989}
2990
2991TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2992 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2993}
2994
2995TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2996 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2997}
2998
2999TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3000 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
3001}
3002
3003TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3004 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
3005}
3006
3007TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3008 Base::DefaultMaxBitrateIsUnlimited();
3009}
3010
3011TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
3012 Base::CanChangeMaxBitrate();
3013}
3014
Steve Anton8a63f782017-10-23 13:08:53 -07003015TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3016 Base::SocketOptionsMergedOnSetTransport();
3017}
3018
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003019// VideoChannelSingleThreadTest
3020TEST_F(VideoChannelSingleThreadTest, TestInit) {
3021 Base::TestInit();
3022}
3023
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003024TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
3025 Base::TestDeinit();
3026}
3027
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003028TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
3029 Base::TestSetContents();
3030}
3031
3032TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3033 Base::TestSetContentsNullOffer();
3034}
3035
3036TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3037 Base::TestSetContentsRtcpMux();
3038}
3039
3040TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3041 Base::TestSetContentsRtcpMux();
3042}
3043
3044TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3045 Base::TestSetRemoteContentUpdate();
3046}
3047
3048TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3049 Base::TestStreams();
3050}
3051
3052TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3053 Base::TestUpdateStreamsInLocalContent();
3054}
3055
3056TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3057 Base::TestUpdateStreamsInRemoteContent();
3058}
3059
3060TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3061 Base::TestChangeStreamParamsInContent();
3062}
3063
3064TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3065 Base::TestPlayoutAndSendingStates();
3066}
3067
3068TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003069 CreateChannels(0, 0);
3070 // Test that we can Mute the default channel even though the sending SSRC
3071 // is unknown.
3072 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003073 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003074 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003075 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003076 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3077 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003078 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003079 SendInitiate();
3080 // After the local session description has been set, we can mute a stream
3081 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003082 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003083 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003084 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003085 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086}
3087
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003088TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089 Base::TestMediaContentDirection();
3090}
3091
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003092TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003093 Base::TestNetworkRouteChanges();
3094}
3095
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003096TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003097 Base::TestCallSetup();
3098}
3099
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003100TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101 Base::TestCallTeardownRtcpMux();
3102}
3103
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003104TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003105 Base::SendRtpToRtp();
3106}
3107
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003108TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109 Base::SendRtcpToRtcp();
3110}
3111
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003112TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003113 Base::SendRtcpMuxToRtcp();
3114}
3115
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003116TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117 Base::SendRtcpMuxToRtcpMux();
3118}
3119
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003120TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003121 Base::SendRequireRtcpMuxToRtcpMux();
3122}
3123
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003124TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003125 Base::SendRtcpMuxToRequireRtcpMux();
3126}
3127
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003128TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003129 Base::SendRequireRtcpMuxToRequireRtcpMux();
3130}
3131
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003132TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003133 Base::SendRequireRtcpMuxToNoRtcpMux();
3134}
3135
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003136TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003137 Base::SendEarlyRtcpMuxToRtcp();
3138}
3139
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003140TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141 Base::SendEarlyRtcpMuxToRtcpMux();
3142}
3143
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003144TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003145 Base::SendSrtpToSrtp();
3146}
3147
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003148TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003149 Base::SendSrtpToSrtp();
3150}
3151
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003152TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153 Base::SendSrtpToSrtp(DTLS, 0);
3154}
3155
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003156TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003157 Base::SendSrtpToSrtp(DTLS, DTLS);
3158}
3159
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003160TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003161 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3162}
3163
deadbeeff5346592017-01-24 21:51:21 -08003164// Test using the channel with a raw packet interface, as opposed to a DTLS
3165// transport interface.
3166TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3167 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3168}
3169
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003170TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003171 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3172}
3173
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003174TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003175 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3176}
3177
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003178TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003179 Base::SendRtpToRtpOnThread();
3180}
3181
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003182TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003183 Base::SendSrtpToSrtpOnThread();
3184}
3185
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003186TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003187 Base::SendWithWritabilityLoss();
3188}
3189
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003190TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003191 Base::TestMediaMonitor();
3192}
3193
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003194TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003195 Base::TestSetContentFailure();
3196}
3197
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003198TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003199 Base::TestSendTwoOffers();
3200}
3201
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003202TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003203 Base::TestReceiveTwoOffers();
3204}
3205
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003206TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003207 Base::TestSendPrAnswer();
3208}
3209
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003210TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003211 Base::TestReceivePrAnswer();
3212}
3213
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003214TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003215 Base::TestFlushRtcp();
3216}
3217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003218TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003219 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003220}
3221
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003222TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003223 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003224}
3225
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003226TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003227 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003228}
3229
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003230TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003231 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003232}
3233
zstein56162b92017-04-24 16:54:35 -07003234TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3235 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003236}
3237
zstein56162b92017-04-24 16:54:35 -07003238TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3239 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003240}
3241
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003242TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003243 Base::DefaultMaxBitrateIsUnlimited();
3244}
3245
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003246TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003247 Base::CanChangeMaxBitrate();
3248}
3249
Steve Anton8a63f782017-10-23 13:08:53 -07003250TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3251 Base::SocketOptionsMergedOnSetTransport();
3252}
3253
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003254// VideoChannelDoubleThreadTest
3255TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3256 Base::TestInit();
3257}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003258
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003259TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3260 Base::TestDeinit();
3261}
3262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003263TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3264 Base::TestSetContents();
3265}
3266
3267TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3268 Base::TestSetContentsNullOffer();
3269}
3270
3271TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3272 Base::TestSetContentsRtcpMux();
3273}
3274
3275TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3276 Base::TestSetContentsRtcpMux();
3277}
3278
3279TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3280 Base::TestSetRemoteContentUpdate();
3281}
3282
3283TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3284 Base::TestStreams();
3285}
3286
3287TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3288 Base::TestUpdateStreamsInLocalContent();
3289}
3290
3291TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3292 Base::TestUpdateStreamsInRemoteContent();
3293}
3294
3295TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3296 Base::TestChangeStreamParamsInContent();
3297}
3298
3299TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3300 Base::TestPlayoutAndSendingStates();
3301}
3302
3303TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3304 CreateChannels(0, 0);
3305 // Test that we can Mute the default channel even though the sending SSRC
3306 // is unknown.
3307 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003308 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003309 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003310 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003311 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3312 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003313 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003314 SendInitiate();
3315 // After the local session description has been set, we can mute a stream
3316 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003317 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003318 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003319 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003320 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3321}
3322
3323TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3324 Base::TestMediaContentDirection();
3325}
3326
3327TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3328 Base::TestNetworkRouteChanges();
3329}
3330
3331TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3332 Base::TestCallSetup();
3333}
3334
3335TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3336 Base::TestCallTeardownRtcpMux();
3337}
3338
3339TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3340 Base::SendRtpToRtp();
3341}
3342
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003343TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3344 Base::SendRtcpToRtcp();
3345}
3346
3347TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3348 Base::SendRtcpMuxToRtcp();
3349}
3350
3351TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3352 Base::SendRtcpMuxToRtcpMux();
3353}
3354
3355TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3356 Base::SendRequireRtcpMuxToRtcpMux();
3357}
3358
3359TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3360 Base::SendRtcpMuxToRequireRtcpMux();
3361}
3362
3363TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3364 Base::SendRequireRtcpMuxToRequireRtcpMux();
3365}
3366
3367TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3368 Base::SendRequireRtcpMuxToNoRtcpMux();
3369}
3370
3371TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3372 Base::SendEarlyRtcpMuxToRtcp();
3373}
3374
3375TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3376 Base::SendEarlyRtcpMuxToRtcpMux();
3377}
3378
3379TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3380 Base::SendSrtpToSrtp();
3381}
3382
3383TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3384 Base::SendSrtpToSrtp();
3385}
3386
3387TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003388 Base::SendSrtpToSrtp(DTLS, 0);
3389}
3390
3391TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003392 Base::SendSrtpToSrtp(DTLS, DTLS);
3393}
3394
3395TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003396 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3397}
3398
deadbeeff5346592017-01-24 21:51:21 -08003399// Test using the channel with a raw packet interface, as opposed to a DTLS
3400// transport interface.
3401TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3402 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3403}
3404
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003405TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3406 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3407}
3408
3409TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3410 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3411}
3412
3413TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3414 Base::SendRtpToRtpOnThread();
3415}
3416
3417TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3418 Base::SendSrtpToSrtpOnThread();
3419}
3420
3421TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3422 Base::SendWithWritabilityLoss();
3423}
3424
3425TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3426 Base::TestMediaMonitor();
3427}
3428
3429TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3430 Base::TestSetContentFailure();
3431}
3432
3433TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3434 Base::TestSendTwoOffers();
3435}
3436
3437TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3438 Base::TestReceiveTwoOffers();
3439}
3440
3441TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3442 Base::TestSendPrAnswer();
3443}
3444
3445TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3446 Base::TestReceivePrAnswer();
3447}
3448
3449TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3450 Base::TestFlushRtcp();
3451}
3452
3453TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3454 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3455}
3456
3457TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3458 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3459}
3460
3461TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3462 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3463}
3464
3465TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3466 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3467}
3468
zstein56162b92017-04-24 16:54:35 -07003469TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3470 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003471}
3472
zstein56162b92017-04-24 16:54:35 -07003473TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3474 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003475}
3476
3477TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3478 Base::DefaultMaxBitrateIsUnlimited();
3479}
3480
3481TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3482 Base::CanChangeMaxBitrate();
3483}
3484
Steve Anton8a63f782017-10-23 13:08:53 -07003485TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3486 Base::SocketOptionsMergedOnSetTransport();
3487}
3488
deadbeef953c2ce2017-01-09 14:53:41 -08003489// RtpDataChannelSingleThreadTest
3490class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003491 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003492 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003493 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003494 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3495};
3496
deadbeef953c2ce2017-01-09 14:53:41 -08003497// RtpDataChannelDoubleThreadTest
3498class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003499 public:
3500 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003501 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003502 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003503};
3504
3505// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003506template <>
Steve Anton8699a322017-11-06 15:53:33 -08003507std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003508 rtc::Thread* worker_thread,
3509 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003510 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003511 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003512 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3513 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003514 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3515 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003516 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003517 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003518 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3519 worker_thread, network_thread, signaling_thread, std::move(ch),
3520 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3521 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003522 if (!channel->NeedsRtcpTransport()) {
3523 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003524 }
Steve Anton8699a322017-11-06 15:53:33 -08003525 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3526 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003527 return channel;
3528}
3529
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003530template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003531void ChannelTest<DataTraits>::CreateContent(
3532 int flags,
3533 const cricket::AudioCodec& audio_codec,
3534 const cricket::VideoCodec& video_codec,
3535 cricket::DataContentDescription* data) {
3536 data->AddCodec(kGoogleDataCodec);
3537 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3538 if (flags & SECURE) {
3539 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003540 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3541 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003542 }
3543}
3544
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003545template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003546void ChannelTest<DataTraits>::CopyContent(
3547 const cricket::DataContentDescription& source,
3548 cricket::DataContentDescription* data) {
3549 *data = source;
3550}
3551
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003552template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003553bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3554 const cricket::DataCodec& c2) {
3555 return c1.name == c2.name;
3556}
3557
Peter Boström0c4e06b2015-10-07 12:23:21 +02003558template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003559void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003560 uint32_t ssrc,
3561 int flags,
3562 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003563 data->AddLegacyStream(ssrc);
3564}
3565
deadbeef953c2ce2017-01-09 14:53:41 -08003566TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003567 Base::TestInit();
3568 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3569}
3570
deadbeef953c2ce2017-01-09 14:53:41 -08003571TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003572 Base::TestDeinit();
3573}
3574
deadbeef953c2ce2017-01-09 14:53:41 -08003575TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003576 Base::TestSetContents();
3577}
3578
deadbeef953c2ce2017-01-09 14:53:41 -08003579TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003580 Base::TestSetContentsNullOffer();
3581}
3582
deadbeef953c2ce2017-01-09 14:53:41 -08003583TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003584 Base::TestSetContentsRtcpMux();
3585}
3586
deadbeef953c2ce2017-01-09 14:53:41 -08003587TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003588 Base::TestSetRemoteContentUpdate();
3589}
3590
deadbeef953c2ce2017-01-09 14:53:41 -08003591TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003592 Base::TestStreams();
3593}
3594
deadbeef953c2ce2017-01-09 14:53:41 -08003595TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003596 Base::TestUpdateStreamsInLocalContent();
3597}
3598
deadbeef953c2ce2017-01-09 14:53:41 -08003599TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003600 Base::TestUpdateStreamsInRemoteContent();
3601}
3602
deadbeef953c2ce2017-01-09 14:53:41 -08003603TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003604 Base::TestChangeStreamParamsInContent();
3605}
3606
deadbeef953c2ce2017-01-09 14:53:41 -08003607TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003608 Base::TestPlayoutAndSendingStates();
3609}
3610
deadbeef953c2ce2017-01-09 14:53:41 -08003611TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003612 Base::TestMediaContentDirection();
3613}
3614
deadbeef953c2ce2017-01-09 14:53:41 -08003615TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003616 Base::TestCallSetup();
3617}
3618
deadbeef953c2ce2017-01-09 14:53:41 -08003619TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003620 Base::TestCallTeardownRtcpMux();
3621}
3622
zstein56162b92017-04-24 16:54:35 -07003623TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3624 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003625}
3626
zstein56162b92017-04-24 16:54:35 -07003627TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3628 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003629}
3630
deadbeef953c2ce2017-01-09 14:53:41 -08003631TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003632 Base::SendRtpToRtp();
3633}
3634
deadbeef953c2ce2017-01-09 14:53:41 -08003635TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003636 Base::SendRtcpToRtcp();
3637}
3638
deadbeef953c2ce2017-01-09 14:53:41 -08003639TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003640 Base::SendRtcpMuxToRtcp();
3641}
3642
deadbeef953c2ce2017-01-09 14:53:41 -08003643TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003644 Base::SendRtcpMuxToRtcpMux();
3645}
3646
deadbeef953c2ce2017-01-09 14:53:41 -08003647TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003648 Base::SendEarlyRtcpMuxToRtcp();
3649}
3650
deadbeef953c2ce2017-01-09 14:53:41 -08003651TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003652 Base::SendEarlyRtcpMuxToRtcpMux();
3653}
3654
deadbeef953c2ce2017-01-09 14:53:41 -08003655TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003656 Base::SendSrtpToSrtp();
3657}
3658
deadbeef953c2ce2017-01-09 14:53:41 -08003659TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003660 Base::SendSrtpToSrtp();
3661}
3662
deadbeef953c2ce2017-01-09 14:53:41 -08003663TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003664 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3665}
3666
deadbeef953c2ce2017-01-09 14:53:41 -08003667TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003668 Base::SendRtpToRtpOnThread();
3669}
3670
deadbeef953c2ce2017-01-09 14:53:41 -08003671TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003672 Base::SendSrtpToSrtpOnThread();
3673}
3674
deadbeef953c2ce2017-01-09 14:53:41 -08003675TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003676 Base::SendWithWritabilityLoss();
3677}
3678
deadbeef953c2ce2017-01-09 14:53:41 -08003679TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003680 Base::TestMediaMonitor();
3681}
3682
Steve Anton8a63f782017-10-23 13:08:53 -07003683TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3684 Base::SocketOptionsMergedOnSetTransport();
3685}
3686
deadbeef953c2ce2017-01-09 14:53:41 -08003687TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003688 CreateChannels(0, 0);
3689 EXPECT_TRUE(SendInitiate());
3690 EXPECT_TRUE(SendAccept());
3691
3692 cricket::SendDataParams params;
3693 params.ssrc = 42;
3694 unsigned char data[] = {'f', 'o', 'o'};
3695 rtc::CopyOnWriteBuffer payload(data, 3);
3696 cricket::SendDataResult result;
3697 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3698 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3699 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3700}
3701
deadbeef953c2ce2017-01-09 14:53:41 -08003702TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003703 Base::TestInit();
3704 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3705}
3706
deadbeef953c2ce2017-01-09 14:53:41 -08003707TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003708 Base::TestDeinit();
3709}
3710
deadbeef953c2ce2017-01-09 14:53:41 -08003711TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003712 Base::TestSetContents();
3713}
3714
deadbeef953c2ce2017-01-09 14:53:41 -08003715TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003716 Base::TestSetContentsNullOffer();
3717}
3718
deadbeef953c2ce2017-01-09 14:53:41 -08003719TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003720 Base::TestSetContentsRtcpMux();
3721}
3722
deadbeef953c2ce2017-01-09 14:53:41 -08003723TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003724 Base::TestSetRemoteContentUpdate();
3725}
3726
deadbeef953c2ce2017-01-09 14:53:41 -08003727TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003728 Base::TestStreams();
3729}
3730
deadbeef953c2ce2017-01-09 14:53:41 -08003731TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003732 Base::TestUpdateStreamsInLocalContent();
3733}
3734
deadbeef953c2ce2017-01-09 14:53:41 -08003735TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003736 Base::TestUpdateStreamsInRemoteContent();
3737}
3738
deadbeef953c2ce2017-01-09 14:53:41 -08003739TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003740 Base::TestChangeStreamParamsInContent();
3741}
3742
deadbeef953c2ce2017-01-09 14:53:41 -08003743TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003744 Base::TestPlayoutAndSendingStates();
3745}
3746
deadbeef953c2ce2017-01-09 14:53:41 -08003747TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003748 Base::TestMediaContentDirection();
3749}
3750
deadbeef953c2ce2017-01-09 14:53:41 -08003751TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003752 Base::TestCallSetup();
3753}
3754
deadbeef953c2ce2017-01-09 14:53:41 -08003755TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003756 Base::TestCallTeardownRtcpMux();
3757}
3758
zstein56162b92017-04-24 16:54:35 -07003759TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3760 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003761}
3762
zstein56162b92017-04-24 16:54:35 -07003763TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3764 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003765}
3766
deadbeef953c2ce2017-01-09 14:53:41 -08003767TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003768 Base::SendRtpToRtp();
3769}
3770
deadbeef953c2ce2017-01-09 14:53:41 -08003771TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003772 Base::SendRtcpToRtcp();
3773}
3774
deadbeef953c2ce2017-01-09 14:53:41 -08003775TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003776 Base::SendRtcpMuxToRtcp();
3777}
3778
deadbeef953c2ce2017-01-09 14:53:41 -08003779TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003780 Base::SendRtcpMuxToRtcpMux();
3781}
3782
deadbeef953c2ce2017-01-09 14:53:41 -08003783TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003784 Base::SendEarlyRtcpMuxToRtcp();
3785}
3786
deadbeef953c2ce2017-01-09 14:53:41 -08003787TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003788 Base::SendEarlyRtcpMuxToRtcpMux();
3789}
3790
deadbeef953c2ce2017-01-09 14:53:41 -08003791TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003792 Base::SendSrtpToSrtp();
3793}
3794
deadbeef953c2ce2017-01-09 14:53:41 -08003795TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003796 Base::SendSrtpToSrtp();
3797}
3798
deadbeef953c2ce2017-01-09 14:53:41 -08003799TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003800 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3801}
3802
deadbeef953c2ce2017-01-09 14:53:41 -08003803TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003804 Base::SendRtpToRtpOnThread();
3805}
3806
deadbeef953c2ce2017-01-09 14:53:41 -08003807TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003808 Base::SendSrtpToSrtpOnThread();
3809}
3810
deadbeef953c2ce2017-01-09 14:53:41 -08003811TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003812 Base::SendWithWritabilityLoss();
3813}
3814
deadbeef953c2ce2017-01-09 14:53:41 -08003815TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003816 Base::TestMediaMonitor();
3817}
3818
Steve Anton8a63f782017-10-23 13:08:53 -07003819TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3820 Base::SocketOptionsMergedOnSetTransport();
3821}
3822
deadbeef953c2ce2017-01-09 14:53:41 -08003823TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003824 CreateChannels(0, 0);
3825 EXPECT_TRUE(SendInitiate());
3826 EXPECT_TRUE(SendAccept());
3827
3828 cricket::SendDataParams params;
3829 params.ssrc = 42;
3830 unsigned char data[] = {
3831 'f', 'o', 'o'
3832 };
jbaucheec21bd2016-03-20 06:15:43 -07003833 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003834 cricket::SendDataResult result;
3835 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3836 EXPECT_EQ(params.ssrc,
3837 media_channel1_->last_sent_data_params().ssrc);
3838 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3839}
3840
deadbeefbad5dad2017-01-17 18:32:35 -08003841#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3842
3843// Verifies some DCHECKs are in place.
3844// Uses VoiceChannel, but any BaseChannel subclass would work.
3845class BaseChannelDeathTest : public testing::Test {
3846 public:
3847 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003848 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3849 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3850 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003851 voice_channel_(rtc::Thread::Current(),
3852 rtc::Thread::Current(),
3853 rtc::Thread::Current(),
3854 &fake_media_engine_,
3855 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3856 nullptr,
3857 cricket::AudioOptions()),
3858 cricket::CN_AUDIO,
3859 false,
3860 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003861
3862 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003863 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003864 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3865 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003866 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003867};
3868
deadbeeff5346592017-01-24 21:51:21 -08003869TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003870 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3871 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003872 cricket::FakeDtlsTransport new_rtcp_transport(
3873 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3874 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003875}
3876
deadbeeff5346592017-01-24 21:51:21 -08003877TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003878 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3879 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003880 cricket::FakeDtlsTransport new_rtp_transport(
3881 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3882 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003883}
3884
deadbeeff5346592017-01-24 21:51:21 -08003885TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003886 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3887 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003888 // Activate RTCP muxing, simulating offer/answer negotiation.
3889 cricket::AudioContentDescription content;
3890 content.set_rtcp_mux(true);
3891 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3892 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003893 cricket::FakeDtlsTransport new_rtp_transport(
3894 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3895 cricket::FakeDtlsTransport new_rtcp_transport(
3896 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003897 // After muxing is enabled, no RTCP transport should be passed in here.
3898 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003899 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3900 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003901}
3902
3903// This test will probably go away if/when we move the transport name out of
3904// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003905TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003906 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3907 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003908 cricket::FakeDtlsTransport new_rtp_transport(
3909 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3910 cricket::FakeDtlsTransport new_rtcp_transport(
3911 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003912 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003913 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3914 "");
3915}
3916
3917// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003918// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003919TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003920 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3921 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003922 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003923 voice_channel_.SetTransports(
3924 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3925 static_cast<rtc::PacketTransportInternal*>(
3926 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003927 "");
3928}
3929
deadbeef5bd5ca32017-02-10 11:31:50 -08003930// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003931// DtlsTransportInternal.
3932TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003933 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3934 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003935 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3936 &fake_rtp_dtls_transport_),
3937 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003938}
3939
3940#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3941
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003942// TODO(pthatcher): TestSetReceiver?