blob: b5517da571c72fc1188138e521c0cd4765cc7e15 [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) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200124 CreateChannels(new typename T::MediaChannel(NULL, typename T::Options()),
125 new typename T::MediaChannel(NULL, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200126 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 void CreateChannels(typename T::MediaChannel* ch1,
129 typename T::MediaChannel* ch2,
130 int flags1,
131 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800132 // Network thread is started in CreateChannels, to allow the test to
133 // configure a fake clock before any threads are spawned and attempt to
134 // access the time.
135 if (network_thread_keeper_) {
136 network_thread_keeper_->Start();
137 }
deadbeefac22f702017-01-12 21:59:29 -0800138 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800139 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
140 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
141 // Make sure if using raw packet transports, they're used for both
142 // channels.
143 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200144 rtc::Thread* worker_thread = rtc::Thread::Current();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 media_channel1_ = ch1;
146 media_channel2_ = ch2;
deadbeef5bd5ca32017-02-10 11:31:50 -0800147 rtc::PacketTransportInternal* rtp1 = nullptr;
148 rtc::PacketTransportInternal* rtcp1 = nullptr;
149 rtc::PacketTransportInternal* rtp2 = nullptr;
150 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800151 // Based on flags, create fake DTLS or raw packet transports.
152 if (flags1 & RAW_PACKET_TRANSPORT) {
153 fake_rtp_packet_transport1_.reset(
154 new rtc::FakePacketTransport("channel1_rtp"));
155 rtp1 = fake_rtp_packet_transport1_.get();
156 if (!(flags1 & RTCP_MUX_REQUIRED)) {
157 fake_rtcp_packet_transport1_.reset(
158 new rtc::FakePacketTransport("channel1_rtcp"));
159 rtcp1 = fake_rtcp_packet_transport1_.get();
160 }
161 } else {
162 // Confirmed to work with KT_RSA and KT_ECDSA.
163 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
164 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
165 rtp1 = fake_rtp_dtls_transport1_.get();
166 if (!(flags1 & RTCP_MUX_REQUIRED)) {
167 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
168 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
169 rtcp1 = fake_rtcp_dtls_transport1_.get();
170 }
171 if (flags1 & DTLS) {
172 auto cert1 =
173 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
174 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
175 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
176 if (fake_rtcp_dtls_transport1_) {
177 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
178 }
179 }
jbauch5869f502017-06-29 12:31:36 -0700180 if (flags1 & ENCRYPTED_HEADERS) {
181 rtc::CryptoOptions crypto_options;
182 crypto_options.enable_encrypted_rtp_header_extensions = true;
183 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 }
187 }
188 if (flags1 & GCM_CIPHER) {
189 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
190 rtc::SRTP_AEAD_AES_256_GCM);
191 if (fake_rtcp_dtls_transport1_) {
192 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
193 rtc::SRTP_AEAD_AES_256_GCM);
194 }
195 }
deadbeeff5346592017-01-24 21:51:21 -0800196 }
197 // Based on flags, create fake DTLS or raw packet transports.
198 if (flags2 & RAW_PACKET_TRANSPORT) {
199 fake_rtp_packet_transport2_.reset(
200 new rtc::FakePacketTransport("channel2_rtp"));
201 rtp2 = fake_rtp_packet_transport2_.get();
202 if (!(flags2 & RTCP_MUX_REQUIRED)) {
203 fake_rtcp_packet_transport2_.reset(
204 new rtc::FakePacketTransport("channel2_rtcp"));
205 rtcp2 = fake_rtcp_packet_transport2_.get();
206 }
207 } else {
208 // Confirmed to work with KT_RSA and KT_ECDSA.
209 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
210 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
211 rtp2 = fake_rtp_dtls_transport2_.get();
212 if (!(flags2 & RTCP_MUX_REQUIRED)) {
213 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
214 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
215 rtcp2 = fake_rtcp_dtls_transport2_.get();
216 }
217 if (flags2 & DTLS) {
218 auto cert2 =
219 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
220 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
221 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
222 if (fake_rtcp_dtls_transport2_) {
223 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
224 }
225 }
jbauch5869f502017-06-29 12:31:36 -0700226 if (flags2 & ENCRYPTED_HEADERS) {
227 rtc::CryptoOptions crypto_options;
228 crypto_options.enable_encrypted_rtp_header_extensions = true;
229 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
230 if (fake_rtcp_dtls_transport2_) {
231 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 }
233 }
234 if (flags2 & GCM_CIPHER) {
235 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
236 rtc::SRTP_AEAD_AES_256_GCM);
237 if (fake_rtcp_dtls_transport2_) {
238 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
239 rtc::SRTP_AEAD_AES_256_GCM);
240 }
241 }
deadbeeff5346592017-01-24 21:51:21 -0800242 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200243 channel1_.reset(
244 CreateChannel(worker_thread, network_thread_, &media_engine_, ch1,
deadbeeff5346592017-01-24 21:51:21 -0800245 fake_rtp_dtls_transport1_.get(),
246 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200247 channel2_.reset(
248 CreateChannel(worker_thread, network_thread_, &media_engine_, ch2,
deadbeeff5346592017-01-24 21:51:21 -0800249 fake_rtp_dtls_transport2_.get(),
250 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 channel1_->SignalMediaMonitor.connect(this,
252 &ChannelTest<T>::OnMediaMonitor1);
253 channel2_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800255 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800256 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000259 if ((flags1 & DTLS) && (flags2 & DTLS)) {
260 flags1 = (flags1 & ~SECURE);
261 flags2 = (flags2 & ~SECURE);
262 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 CreateContent(flags1, kPcmuCodec, kH264Codec,
264 &local_media_content1_);
265 CreateContent(flags2, kPcmuCodec, kH264Codec,
266 &local_media_content2_);
267 CopyContent(local_media_content1_, &remote_media_content1_);
268 CopyContent(local_media_content2_, &remote_media_content2_);
269
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000270 // Add stream information (SSRC) to the local content but not to the remote
271 // content. This means that we per default know the SSRC of what we send but
272 // not what we receive.
273 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
274 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
275
276 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
277 if (flags1 & SSRC_MUX) {
278 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
279 }
280 if (flags2 & SSRC_MUX) {
281 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
282 }
283 }
deadbeefcbecd352015-09-23 11:50:27 -0700284 typename T::Channel* CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200285 rtc::Thread* worker_thread,
286 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700287 cricket::MediaEngineInterface* engine,
288 typename T::MediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -0800289 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
290 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800291 rtc::PacketTransportInternal* fake_rtp_packet_transport,
292 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700293 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800294 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -0800295 typename T::Channel* channel = new typename T::Channel(
zhihuangf5b251b2017-01-12 19:37:48 -0800296 worker_thread, network_thread, signaling_thread, engine, ch,
deadbeefac22f702017-01-12 21:59:29 -0800297 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
298 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800299 if (!channel->NeedsRtcpTransport()) {
300 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800301 }
deadbeeff5346592017-01-24 21:51:21 -0800302 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
303 fake_rtp_packet_transport,
304 fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000305 delete channel;
306 channel = NULL;
307 }
308 return channel;
309 }
310
deadbeeff5346592017-01-24 21:51:21 -0800311 void ConnectFakeTransports() {
312 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
313 bool asymmetric = false;
314 // Depending on test flags, could be using DTLS or raw packet transport.
315 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
316 fake_rtp_dtls_transport1_->SetDestination(
317 fake_rtp_dtls_transport2_.get(), asymmetric);
318 }
319 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
320 fake_rtcp_dtls_transport1_->SetDestination(
321 fake_rtcp_dtls_transport2_.get(), asymmetric);
322 }
323 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
324 fake_rtp_packet_transport1_->SetDestination(
325 fake_rtp_packet_transport2_.get(), asymmetric);
326 }
327 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
328 fake_rtcp_packet_transport1_->SetDestination(
329 fake_rtcp_packet_transport2_.get(), asymmetric);
330 }
331 });
332 }
333
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 bool result = channel1_->SetLocalContent(&local_media_content1_,
336 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 if (result) {
338 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 result = channel2_->SetRemoteContent(&remote_media_content1_,
340 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800342 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000343 result = channel2_->SetLocalContent(&local_media_content2_,
344 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 }
346 }
347 return result;
348 }
349
350 bool SendAccept() {
351 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000352 return channel1_->SetRemoteContent(&remote_media_content2_,
353 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 }
355
356 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000357 bool result = channel1_->SetLocalContent(&local_media_content1_,
358 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 if (result) {
360 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000361 result = channel2_->SetRemoteContent(&remote_media_content1_,
362 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 }
364 return result;
365 }
366
367 bool SendProvisionalAnswer() {
368 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000369 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 if (result) {
371 channel2_->Enable(true);
372 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000373 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800374 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 }
376 return result;
377 }
378
379 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000380 bool result = channel2_->SetLocalContent(&local_media_content2_,
381 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000382 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000383 result = channel1_->SetRemoteContent(&remote_media_content2_,
384 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 return result;
386 }
387
deadbeeff5346592017-01-24 21:51:21 -0800388 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 channel1_.reset();
390 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800391 fake_rtp_dtls_transport1_.reset();
392 fake_rtcp_dtls_transport1_.reset();
393 fake_rtp_dtls_transport2_.reset();
394 fake_rtcp_dtls_transport2_.reset();
395 fake_rtp_packet_transport1_.reset();
396 fake_rtcp_packet_transport1_.reset();
397 fake_rtp_packet_transport2_.reset();
398 fake_rtcp_packet_transport2_.reset();
399 if (network_thread_keeper_) {
400 network_thread_keeper_.reset();
401 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 return true;
403 }
404
405 bool AddStream1(int id) {
406 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
407 }
408 bool RemoveStream1(int id) {
409 return channel1_->RemoveRecvStream(id);
410 }
411
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtp1() {
413 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
414 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendRtp2() {
417 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
418 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendRtcp1() {
421 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendRtcp2() {
424 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
426 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
428 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
429 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
432 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
433 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendCustomRtcp1(uint32_t ssrc) {
436 rtc::Buffer data = CreateRtcpData(ssrc);
437 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 void SendCustomRtcp2(uint32_t ssrc) {
440 rtc::Buffer data = CreateRtcpData(ssrc);
441 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
447 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
459 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
463 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200465 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Buffer data = CreateRtcpData(ssrc);
467 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200469 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::Buffer data = CreateRtcpData(ssrc);
471 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
474 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::SetBE32(data.data() + 8, ssrc);
477 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000480 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 return data;
482 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
484 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 return data;
488 }
489
490 bool CheckNoRtp1() {
491 return media_channel1_->CheckNoRtp();
492 }
493 bool CheckNoRtp2() {
494 return media_channel2_->CheckNoRtp();
495 }
496 bool CheckNoRtcp1() {
497 return media_channel1_->CheckNoRtcp();
498 }
499 bool CheckNoRtcp2() {
500 return media_channel2_->CheckNoRtcp();
501 }
502
503 void CreateContent(int flags,
504 const cricket::AudioCodec& audio_codec,
505 const cricket::VideoCodec& video_codec,
506 typename T::Content* content) {
507 // overridden in specialized classes
508 }
509 void CopyContent(const typename T::Content& source,
510 typename T::Content* content) {
511 // overridden in specialized classes
512 }
513
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000515 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700516 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
517 typename T::Content* content = new typename T::Content();
518 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
519 AddLegacyStreamInContent(ssrc, 0, content);
520 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521 }
522
ossu292d6582016-03-17 02:31:13 -0700523 // Will manage the lifetime of a CallThread, making sure it's
524 // destroyed before this object goes out of scope.
525 class ScopedCallThread {
526 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 template <class FunctorT>
528 ScopedCallThread(const FunctorT& functor)
529 : thread_(rtc::Thread::Create()),
530 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700531 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700532 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700533 }
534
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700536
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200537 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700538
539 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200540 std::unique_ptr<rtc::Thread> thread_;
541 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700542 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000544 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
545 return false; // overridden in specialized classes
546 }
547
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200548 void OnMediaMonitor1(typename T::Channel* channel,
549 const typename T::MediaInfo& info) {
550 RTC_DCHECK_EQ(channel, channel1_.get());
551 media_info_callbacks1_++;
552 }
553 void OnMediaMonitor2(typename T::Channel* channel,
554 const typename T::MediaInfo& info) {
555 RTC_DCHECK_EQ(channel, channel2_.get());
556 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 }
deadbeeff5346592017-01-24 21:51:21 -0800558 void OnRtcpMuxFullyActive1(const std::string&) {
559 rtcp_mux_activated_callbacks1_++;
560 }
561 void OnRtcpMuxFullyActive2(const std::string&) {
562 rtcp_mux_activated_callbacks2_++;
563 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000564
Honghai Zhangcc411c02016-03-29 17:27:21 -0700565 cricket::CandidatePairInterface* last_selected_candidate_pair() {
566 return last_selected_candidate_pair_;
567 }
568
Peter Boström0c4e06b2015-10-07 12:23:21 +0200569 void AddLegacyStreamInContent(uint32_t ssrc,
570 int flags,
571 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 // Base implementation.
573 }
574
575 // Tests that can be used by derived classes.
576
577 // Basic sanity check.
578 void TestInit() {
579 CreateChannels(0, 0);
zhihuange683c682017-08-31 16:00:07 -0700580 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200582 if (verify_playout_) {
583 EXPECT_FALSE(media_channel1_->playout());
584 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 EXPECT_TRUE(media_channel1_->codecs().empty());
586 EXPECT_TRUE(media_channel1_->recv_streams().empty());
587 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
588 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
589 }
590
591 // Test that SetLocalContent and SetRemoteContent properly configure
592 // the codecs.
593 void TestSetContents() {
594 CreateChannels(0, 0);
595 typename T::Content content;
596 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000597 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000599 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 ASSERT_EQ(1U, media_channel1_->codecs().size());
601 EXPECT_TRUE(CodecMatches(content.codecs()[0],
602 media_channel1_->codecs()[0]));
603 }
604
605 // Test that SetLocalContent and SetRemoteContent properly deals
606 // with an empty offer.
607 void TestSetContentsNullOffer() {
608 CreateChannels(0, 0);
609 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000610 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000613 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 ASSERT_EQ(1U, media_channel1_->codecs().size());
615 EXPECT_TRUE(CodecMatches(content.codecs()[0],
616 media_channel1_->codecs()[0]));
617 }
618
619 // Test that SetLocalContent and SetRemoteContent properly set RTCP
620 // mux.
621 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800622 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 typename T::Content content;
624 CreateContent(0, kPcmuCodec, kH264Codec, &content);
625 // Both sides agree on mux. Should no longer be a separate RTCP channel.
626 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000627 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
628 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000630 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000632 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 }
634
635 // Test that SetLocalContent and SetRemoteContent properly set RTCP
636 // mux when a provisional answer is received.
637 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800638 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 typename T::Content content;
640 CreateContent(0, kPcmuCodec, kH264Codec, &content);
641 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000642 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800644 // Both sides agree on mux. Should signal RTCP mux as fully activated.
645 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000646 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800647 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000649 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000651 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
652 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800653 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 }
655
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 // Test that SetRemoteContent properly deals with a content update.
657 void TestSetRemoteContentUpdate() {
658 CreateChannels(0, 0);
659 typename T::Content content;
deadbeefac22f702017-01-12 21:59:29 -0800660 CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000662 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
663 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 ASSERT_EQ(1U, media_channel1_->codecs().size());
665 EXPECT_TRUE(CodecMatches(content.codecs()[0],
666 media_channel1_->codecs()[0]));
667 // Now update with other codecs.
668 typename T::Content update_content;
669 update_content.set_partial(true);
670 CreateContent(0, kIsacCodec, kH264SvcCodec,
671 &update_content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000672 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 ASSERT_EQ(1U, media_channel1_->codecs().size());
674 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
675 media_channel1_->codecs()[0]));
676 // Now update without any codecs. This is ignored.
677 typename T::Content empty_content;
678 empty_content.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000679 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 ASSERT_EQ(1U, media_channel1_->codecs().size());
681 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
682 media_channel1_->codecs()[0]));
683 }
684
685 // Test that Add/RemoveStream properly forward to the media channel.
686 void TestStreams() {
687 CreateChannels(0, 0);
688 EXPECT_TRUE(AddStream1(1));
689 EXPECT_TRUE(AddStream1(2));
690 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
691 EXPECT_TRUE(RemoveStream1(2));
692 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
693 EXPECT_TRUE(RemoveStream1(1));
694 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
695 }
696
697 // Test that SetLocalContent properly handles adding and removing StreamParams
698 // to the local content description.
699 // This test uses the CA_UPDATE action that don't require a full
700 // MediaContentDescription to do an update.
701 void TestUpdateStreamsInLocalContent() {
702 cricket::StreamParams stream1;
703 stream1.groupid = "group1";
704 stream1.id = "stream1";
705 stream1.ssrcs.push_back(kSsrc1);
706 stream1.cname = "stream1_cname";
707
708 cricket::StreamParams stream2;
709 stream2.groupid = "group2";
710 stream2.id = "stream2";
711 stream2.ssrcs.push_back(kSsrc2);
712 stream2.cname = "stream2_cname";
713
714 cricket::StreamParams stream3;
715 stream3.groupid = "group3";
716 stream3.id = "stream3";
717 stream3.ssrcs.push_back(kSsrc3);
718 stream3.cname = "stream3_cname";
719
720 CreateChannels(0, 0);
721 typename T::Content content1;
722 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
723 content1.AddStream(stream1);
724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000725 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726
727 ASSERT_EQ(1u, media_channel1_->send_streams().size());
728 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
729
730 // Update the local streams by adding another sending stream.
731 // Use a partial updated session description.
732 typename T::Content content2;
733 content2.AddStream(stream2);
734 content2.AddStream(stream3);
735 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000736 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 ASSERT_EQ(3u, media_channel1_->send_streams().size());
738 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
739 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
740 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
741
742 // Update the local streams by removing the first sending stream.
743 // This is done by removing all SSRCS for this particular stream.
744 typename T::Content content3;
745 stream1.ssrcs.clear();
746 content3.AddStream(stream1);
747 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000748 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 ASSERT_EQ(2u, media_channel1_->send_streams().size());
750 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
751 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
752
753 // Update the local streams with a stream that does not change.
754 // THe update is ignored.
755 typename T::Content content4;
756 content4.AddStream(stream2);
757 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000758 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 ASSERT_EQ(2u, media_channel1_->send_streams().size());
760 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
761 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
762 }
763
764 // Test that SetRemoteContent properly handles adding and removing
765 // StreamParams to the remote content description.
766 // This test uses the CA_UPDATE action that don't require a full
767 // MediaContentDescription to do an update.
768 void TestUpdateStreamsInRemoteContent() {
769 cricket::StreamParams stream1;
770 stream1.id = "Stream1";
771 stream1.groupid = "1";
772 stream1.ssrcs.push_back(kSsrc1);
773 stream1.cname = "stream1_cname";
774
775 cricket::StreamParams stream2;
776 stream2.id = "Stream2";
777 stream2.groupid = "2";
778 stream2.ssrcs.push_back(kSsrc2);
779 stream2.cname = "stream2_cname";
780
781 cricket::StreamParams stream3;
782 stream3.id = "Stream3";
783 stream3.groupid = "3";
784 stream3.ssrcs.push_back(kSsrc3);
785 stream3.cname = "stream3_cname";
786
787 CreateChannels(0, 0);
788 typename T::Content content1;
789 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
790 content1.AddStream(stream1);
791 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000792 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
794 ASSERT_EQ(1u, media_channel1_->codecs().size());
795 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
796 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
797
798 // Update the remote streams by adding another sending stream.
799 // Use a partial updated session description.
800 typename T::Content content2;
801 content2.AddStream(stream2);
802 content2.AddStream(stream3);
803 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000804 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805 ASSERT_EQ(3u, media_channel1_->recv_streams().size());
806 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
807 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
808 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
809
810 // Update the remote streams by removing the first stream.
811 // This is done by removing all SSRCS for this particular stream.
812 typename T::Content content3;
813 stream1.ssrcs.clear();
814 content3.AddStream(stream1);
815 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000816 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
818 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
819 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
820
821 // Update the remote streams with a stream that does not change.
822 // The update is ignored.
823 typename T::Content content4;
824 content4.AddStream(stream2);
825 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000826 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
828 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
829 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
830 }
831
832 // Test that SetLocalContent and SetRemoteContent properly
833 // handles adding and removing StreamParams when the action is a full
834 // CA_OFFER / CA_ANSWER.
835 void TestChangeStreamParamsInContent() {
836 cricket::StreamParams stream1;
837 stream1.groupid = "group1";
838 stream1.id = "stream1";
839 stream1.ssrcs.push_back(kSsrc1);
840 stream1.cname = "stream1_cname";
841
842 cricket::StreamParams stream2;
843 stream2.groupid = "group1";
844 stream2.id = "stream2";
845 stream2.ssrcs.push_back(kSsrc2);
846 stream2.cname = "stream2_cname";
847
848 // Setup a call where channel 1 send |stream1| to channel 2.
849 CreateChannels(0, 0);
850 typename T::Content content1;
851 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
852 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000853 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854 EXPECT_TRUE(channel1_->Enable(true));
855 EXPECT_EQ(1u, media_channel1_->send_streams().size());
856
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000857 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800859 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860
861 // Channel 2 do not send anything.
862 typename T::Content content2;
863 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000864 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000866 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 EXPECT_TRUE(channel2_->Enable(true));
868 EXPECT_EQ(0u, media_channel2_->send_streams().size());
869
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200870 SendCustomRtp1(kSsrc1, 0);
871 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
873
874 // Let channel 2 update the content by sending |stream2| and enable SRTP.
875 typename T::Content content3;
876 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
877 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000878 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 ASSERT_EQ(1u, media_channel2_->send_streams().size());
880 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
881
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000882 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
884 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
885
886 // Channel 1 replies but stop sending stream1.
887 typename T::Content content4;
888 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000889 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 EXPECT_EQ(0u, media_channel1_->send_streams().size());
891
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000892 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
894
zhihuange683c682017-08-31 16:00:07 -0700895 EXPECT_TRUE(channel1_->srtp_active());
896 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200897 SendCustomRtp2(kSsrc2, 0);
898 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
900 }
901
jbauch5869f502017-06-29 12:31:36 -0700902 enum EncryptedHeaderTestScenario {
903 // Offer/Answer are processed before DTLS completes.
904 DEFAULT,
905 // DTLS completes before any Offer/Answer have been sent.
906 DTLS_BEFORE_OFFER_ANSWER,
907 // DTLS completes after channel 2 has processed (remote) Offer and (local)
908 // Answer.
909 DTLS_AFTER_CHANNEL2_READY,
910 };
911
912 // Test that encrypted header extensions are working and can be changed when
913 // sending a new OFFER/ANSWER.
914 void TestChangeEncryptedHeaderExtensions(int flags,
915 EncryptedHeaderTestScenario scenario = DEFAULT) {
916 RTC_CHECK(scenario == 0 || (flags & DTLS));
917 struct PacketListener : public sigslot::has_slots<> {
918 PacketListener() {}
919 void OnReadPacket(rtc::PacketTransportInternal* transport,
920 const char* data, size_t size, const rtc::PacketTime& time,
921 int flags) {
922 CompareHeaderExtensions(
923 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
924 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
925 false);
926 }
927 std::vector<int> encrypted_headers;
928 } packet_listener1, packet_listener2;
929
930 cricket::StreamParams stream1;
931 stream1.groupid = "group1";
932 stream1.id = "stream1";
933 stream1.ssrcs.push_back(kSsrc1);
934 stream1.cname = "stream1_cname";
935
936 cricket::StreamParams stream2;
937 stream2.groupid = "group1";
938 stream2.id = "stream2";
939 stream2.ssrcs.push_back(kSsrc2);
940 stream2.cname = "stream2_cname";
941
942 // Use SRTP when testing encrypted extensions.
943 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
944 // Enable SDES if channel is not using DTLS.
945 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
946
947 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
948 // Make sure to use URIs that are supported for encryption.
949 cricket::RtpHeaderExtensions extensions1;
950 extensions1.push_back(
951 RtpExtension(RtpExtension::kAudioLevelUri, 10));
952 extensions1.push_back(
953 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
954
955 cricket::RtpHeaderExtensions extensions2;
956 extensions2.push_back(
957 RtpExtension(RtpExtension::kAudioLevelUri, 10));
958 extensions2.push_back(
959 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
960 extensions2.push_back(
961 RtpExtension(RtpExtension::kVideoRotationUri, 3));
962 extensions2.push_back(
963 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
964
965 // Setup a call where channel 1 send |stream1| to channel 2.
966 CreateChannels(channel_flags, channel_flags);
967 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
968 &packet_listener1, &PacketListener::OnReadPacket);
969 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
970 &packet_listener2, &PacketListener::OnReadPacket);
971
972 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
973 ConnectFakeTransports();
974 WaitForThreads();
975 }
976
977 typename T::Content content1;
978 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
979 content1.AddStream(stream1);
980 content1.set_rtp_header_extensions(extensions1);
981 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
982 EXPECT_TRUE(channel1_->Enable(true));
983 EXPECT_EQ(1u, media_channel1_->send_streams().size());
984 packet_listener1.encrypted_headers.push_back(1);
985
986 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
987 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
988
989 // Channel 2 sends back |stream2|.
990 typename T::Content content2;
991 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
992 content2.AddStream(stream2);
993 content2.set_rtp_header_extensions(extensions1);
994 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
995 EXPECT_TRUE(channel2_->Enable(true));
996 EXPECT_EQ(1u, media_channel2_->send_streams().size());
997 packet_listener2.encrypted_headers.push_back(1);
998
999 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
1000 ConnectFakeTransports();
1001 WaitForThreads();
1002 }
1003
1004 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
1005 scenario == DTLS_AFTER_CHANNEL2_READY) {
1006 // In both scenarios with partially completed Offer/Answer, sending
1007 // packets from Channel 2 to Channel 1 should work.
1008 SendCustomRtp2(kSsrc2, 0);
1009 WaitForThreads();
1010 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1011 }
1012
1013 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
1014 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
1015
1016 if (scenario == DEFAULT) {
1017 ConnectFakeTransports();
1018 WaitForThreads();
1019 }
1020
1021 SendCustomRtp1(kSsrc1, 0);
1022 SendCustomRtp2(kSsrc2, 0);
1023 WaitForThreads();
1024 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1025 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1026
1027 // Let channel 2 update the encrypted header extensions.
1028 typename T::Content content3;
1029 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
1030 content3.AddStream(stream2);
1031 content3.set_rtp_header_extensions(extensions2);
1032 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
1033 ASSERT_EQ(1u, media_channel2_->send_streams().size());
1034 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
1035 packet_listener2.encrypted_headers.clear();
1036 packet_listener2.encrypted_headers.push_back(2);
1037 packet_listener2.encrypted_headers.push_back(4);
1038
1039 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
1040 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
1041 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
1042
1043 // Channel 1 is already sending the new encrypted extensions. These
1044 // can be decrypted by channel 2. Channel 2 is still sending the old
1045 // encrypted extensions (which can be decrypted by channel 1).
1046
1047 if (flags & DTLS) {
1048 // DTLS supports updating the encrypted extensions with only the OFFER
1049 // being processed. For SDES both the OFFER and ANSWER must have been
1050 // processed to update encrypted extensions, so we can't check this case.
1051 SendCustomRtp1(kSsrc1, 0);
1052 SendCustomRtp2(kSsrc2, 0);
1053 WaitForThreads();
1054 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1055 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1056 }
1057
1058 // Channel 1 replies with the same extensions.
1059 typename T::Content content4;
1060 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
1061 content4.AddStream(stream1);
1062 content4.set_rtp_header_extensions(extensions2);
1063 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
1064 EXPECT_EQ(1u, media_channel1_->send_streams().size());
1065 packet_listener1.encrypted_headers.clear();
1066 packet_listener1.encrypted_headers.push_back(2);
1067 packet_listener1.encrypted_headers.push_back(4);
1068
1069 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
1070 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
1071
1072 SendCustomRtp1(kSsrc1, 0);
1073 SendCustomRtp2(kSsrc2, 0);
1074 WaitForThreads();
1075 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1076 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1077 }
1078
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 // Test that we only start playout and sending at the right times.
1080 void TestPlayoutAndSendingStates() {
1081 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +02001082 if (verify_playout_) {
1083 EXPECT_FALSE(media_channel1_->playout());
1084 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001086 if (verify_playout_) {
1087 EXPECT_FALSE(media_channel2_->playout());
1088 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089 EXPECT_FALSE(media_channel2_->sending());
1090 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001091 if (verify_playout_) {
1092 EXPECT_FALSE(media_channel1_->playout());
1093 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001095 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1096 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001097 if (verify_playout_) {
1098 EXPECT_TRUE(media_channel1_->playout());
1099 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001101 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
1102 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001103 if (verify_playout_) {
1104 EXPECT_FALSE(media_channel2_->playout());
1105 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001107 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
1108 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001109 if (verify_playout_) {
1110 EXPECT_FALSE(media_channel2_->playout());
1111 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -08001113 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +02001114 if (verify_playout_) {
1115 EXPECT_TRUE(media_channel1_->playout());
1116 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001118 if (verify_playout_) {
1119 EXPECT_FALSE(media_channel2_->playout());
1120 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 EXPECT_FALSE(media_channel2_->sending());
1122 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001123 if (verify_playout_) {
1124 EXPECT_TRUE(media_channel2_->playout());
1125 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001127 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
1128 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001129 if (verify_playout_) {
1130 EXPECT_TRUE(media_channel1_->playout());
1131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 EXPECT_TRUE(media_channel1_->sending());
1133 }
1134
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 // Test that changing the MediaContentDirection in the local and remote
1136 // session description start playout and sending at the right time.
1137 void TestMediaContentDirection() {
1138 CreateChannels(0, 0);
1139 typename T::Content content1;
1140 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
1141 typename T::Content content2;
1142 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
1143 // Set |content2| to be InActive.
1144 content2.set_direction(cricket::MD_INACTIVE);
1145
1146 EXPECT_TRUE(channel1_->Enable(true));
1147 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001148 if (verify_playout_) {
1149 EXPECT_FALSE(media_channel1_->playout());
1150 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001152 if (verify_playout_) {
1153 EXPECT_FALSE(media_channel2_->playout());
1154 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_FALSE(media_channel2_->sending());
1156
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001157 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
1158 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
1159 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1160 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001161 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162
Peter Boström34fbfff2015-09-24 19:20:30 +02001163 if (verify_playout_) {
1164 EXPECT_TRUE(media_channel1_->playout());
1165 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001167 if (verify_playout_) {
1168 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1169 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1171
1172 // Update |content2| to be RecvOnly.
1173 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001174 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1175 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176
Peter Boström34fbfff2015-09-24 19:20:30 +02001177 if (verify_playout_) {
1178 EXPECT_TRUE(media_channel1_->playout());
1179 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001181 if (verify_playout_) {
1182 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1183 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1185
1186 // Update |content2| to be SendRecv.
1187 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001188 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1189 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190
Peter Boström34fbfff2015-09-24 19:20:30 +02001191 if (verify_playout_) {
1192 EXPECT_TRUE(media_channel1_->playout());
1193 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001195 if (verify_playout_) {
1196 EXPECT_TRUE(media_channel2_->playout());
1197 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198 EXPECT_TRUE(media_channel2_->sending());
1199 }
1200
Honghai Zhangcc411c02016-03-29 17:27:21 -07001201 // Tests that when the transport channel signals a candidate pair change
1202 // event, the media channel will receive a call on the network route change.
1203 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001204 static constexpr uint16_t kLocalNetId = 1;
1205 static constexpr uint16_t kRemoteNetId = 2;
1206 static constexpr int kLastPacketId = 100;
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
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001214 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001215 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001216 // The transport channel becomes disconnected.
deadbeeff5346592017-01-24 21:51:21 -08001217 fake_rtp_dtls_transport1_->ice_transport()
1218 ->SignalSelectedCandidatePairChanged(
1219 fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001220 });
1221 WaitForThreads();
1222 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001223 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001224 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001225
eladalon05b07bb2017-08-24 07:40:16 -07001226 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001227 // The transport channel becomes connected.
1228 rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
1229 rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
deadbeeff5346592017-01-24 21:51:21 -08001230 auto candidate_pair = cricket::FakeCandidatePair::Create(
1231 local_address, kLocalNetId, remote_address, kRemoteNetId);
1232 fake_rtp_dtls_transport1_->ice_transport()
1233 ->SignalSelectedCandidatePairChanged(
1234 fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
1235 kLastPacketId, true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001236 });
1237 WaitForThreads();
1238 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001239 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001240 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001241 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001242 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001243 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001244 constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
1245 EXPECT_EQ(kTransportOverheadPerPacket,
1246 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001247 }
1248
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249 // Test setting up a call.
1250 void TestCallSetup() {
1251 CreateChannels(0, 0);
zhihuange683c682017-08-31 16:00:07 -07001252 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001254 if (verify_playout_) {
1255 EXPECT_TRUE(media_channel1_->playout());
1256 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257 EXPECT_FALSE(media_channel1_->sending());
1258 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001259 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260 EXPECT_TRUE(media_channel1_->sending());
1261 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001262 if (verify_playout_) {
1263 EXPECT_TRUE(media_channel2_->playout());
1264 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 EXPECT_TRUE(media_channel2_->sending());
1266 EXPECT_EQ(1U, media_channel2_->codecs().size());
1267 }
1268
1269 // Test that we don't crash if packets are sent during call teardown
1270 // when RTCP mux is enabled. This is a regression test against a specific
1271 // race condition that would only occur when a RTCP packet was sent during
1272 // teardown of a channel on which RTCP mux was enabled.
1273 void TestCallTeardownRtcpMux() {
1274 class LastWordMediaChannel : public T::MediaChannel {
1275 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001276 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001277 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001278 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1279 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1281 }
1282 };
1283 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
deadbeefac22f702017-01-12 21:59:29 -08001284 RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 EXPECT_TRUE(SendInitiate());
1286 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001287 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001288 }
1289
1290 // Send voice RTP data to the other side and ensure it gets there.
1291 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001292 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 EXPECT_TRUE(SendInitiate());
1294 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001295 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1296 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001297 SendRtp1();
1298 SendRtp2();
1299 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 EXPECT_TRUE(CheckRtp1());
1301 EXPECT_TRUE(CheckRtp2());
1302 EXPECT_TRUE(CheckNoRtp1());
1303 EXPECT_TRUE(CheckNoRtp2());
1304 }
1305
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001306 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001307 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001308 EXPECT_TRUE(SendInitiate());
1309 EXPECT_TRUE(SendAccept());
1310 SendRtp1();
1311 SendRtp2();
1312 SendRtcp1();
1313 SendRtcp2();
1314 // Do not wait, destroy channels.
1315 channel1_.reset(nullptr);
1316 channel2_.reset(nullptr);
1317 }
1318
deadbeefac22f702017-01-12 21:59:29 -08001319 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001321 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 EXPECT_TRUE(SendInitiate());
1323 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001324 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1325 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001326 SendRtcp1();
1327 SendRtcp2();
1328 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329 EXPECT_TRUE(CheckRtcp1());
1330 EXPECT_TRUE(CheckRtcp2());
1331 EXPECT_TRUE(CheckNoRtcp1());
1332 EXPECT_TRUE(CheckNoRtcp2());
1333 }
1334
1335 // Check that RTCP is transmitted if only the initiator supports mux.
1336 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001337 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001338 EXPECT_TRUE(SendInitiate());
1339 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001340 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1341 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001342 SendRtcp1();
1343 SendRtcp2();
1344 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 EXPECT_TRUE(CheckRtcp1());
1346 EXPECT_TRUE(CheckRtcp2());
1347 EXPECT_TRUE(CheckNoRtcp1());
1348 EXPECT_TRUE(CheckNoRtcp2());
1349 }
1350
1351 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1352 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001353 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001354 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001355 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1356 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1357 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001359 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1360 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001361 SendRtp1();
1362 SendRtp2();
1363 SendRtcp1();
1364 SendRtcp2();
1365 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366 EXPECT_TRUE(CheckRtp1());
1367 EXPECT_TRUE(CheckRtp2());
1368 EXPECT_TRUE(CheckNoRtp1());
1369 EXPECT_TRUE(CheckNoRtp2());
1370 EXPECT_TRUE(CheckRtcp1());
1371 EXPECT_TRUE(CheckRtcp2());
1372 EXPECT_TRUE(CheckNoRtcp1());
1373 EXPECT_TRUE(CheckNoRtcp2());
1374 }
1375
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001376 // Check that RTP and RTCP are transmitted ok when both sides
1377 // support mux and one the offerer requires mux.
1378 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001379 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001380 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001381 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1382 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001383 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001384 SendRtp1();
1385 SendRtp2();
1386 SendRtcp1();
1387 SendRtcp2();
1388 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001389 EXPECT_TRUE(CheckRtp1());
1390 EXPECT_TRUE(CheckRtp2());
1391 EXPECT_TRUE(CheckNoRtp1());
1392 EXPECT_TRUE(CheckNoRtp2());
1393 EXPECT_TRUE(CheckRtcp1());
1394 EXPECT_TRUE(CheckRtcp2());
1395 EXPECT_TRUE(CheckNoRtcp1());
1396 EXPECT_TRUE(CheckNoRtcp2());
1397 }
1398
1399 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001400 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001401 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001402 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001403 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001404 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1405 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1406 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001407 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001408 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1409 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001410 SendRtp1();
1411 SendRtp2();
1412 SendRtcp1();
1413 SendRtcp2();
1414 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001415 EXPECT_TRUE(CheckRtp1());
1416 EXPECT_TRUE(CheckRtp2());
1417 EXPECT_TRUE(CheckNoRtp1());
1418 EXPECT_TRUE(CheckNoRtp2());
1419 EXPECT_TRUE(CheckRtcp1());
1420 EXPECT_TRUE(CheckRtcp2());
1421 EXPECT_TRUE(CheckNoRtcp1());
1422 EXPECT_TRUE(CheckNoRtcp2());
1423 }
1424
1425 // Check that RTP and RTCP are transmitted ok when both sides
1426 // require mux.
1427 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001428 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001429 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001430 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1431 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001432 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001433 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001434 SendRtp1();
1435 SendRtp2();
1436 SendRtcp1();
1437 SendRtcp2();
1438 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001439 EXPECT_TRUE(CheckRtp1());
1440 EXPECT_TRUE(CheckRtp2());
1441 EXPECT_TRUE(CheckNoRtp1());
1442 EXPECT_TRUE(CheckNoRtp2());
1443 EXPECT_TRUE(CheckRtcp1());
1444 EXPECT_TRUE(CheckRtcp2());
1445 EXPECT_TRUE(CheckNoRtcp1());
1446 EXPECT_TRUE(CheckNoRtcp2());
1447 }
1448
1449 // Check that SendAccept fails if the answerer doesn't support mux
1450 // and the offerer requires it.
1451 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001452 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001453 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001454 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1455 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001456 EXPECT_FALSE(SendAccept());
1457 }
1458
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001459 // Check that RTCP data sent by the initiator before the accept is not muxed.
1460 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001461 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001463 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1464 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465
1466 // RTCP can be sent before the call is accepted, if the transport is ready.
1467 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001468 SendRtcp1();
1469 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(CheckNoRtp2());
1471 EXPECT_TRUE(CheckRtcp2());
1472
1473 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001474 SendRtcp2();
1475 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476 EXPECT_TRUE(CheckNoRtp1());
1477 EXPECT_TRUE(CheckRtcp1());
1478
1479 // Complete call setup and ensure everything is still OK.
1480 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001481 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001482 SendRtcp1();
1483 SendRtcp2();
1484 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001485 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486 EXPECT_TRUE(CheckRtcp1());
1487 }
1488
1489
1490 // Check that RTCP data is not muxed until both sides have enabled muxing,
1491 // but that we properly demux before we get the accept message, since there
1492 // is a race between RTP data and the jingle accept.
1493 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001494 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001496 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1497 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498
1499 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1500 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001501 SendRtcp1();
1502 WaitForThreads();
1503 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504
1505 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001506 SendRtcp2();
1507 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508 EXPECT_TRUE(CheckNoRtp1());
1509 EXPECT_TRUE(CheckRtcp1());
1510
1511 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001512 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001514 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1515 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001516 SendRtcp1();
1517 SendRtcp2();
1518 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520 EXPECT_TRUE(CheckRtcp1());
1521 }
1522
1523 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001524 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001526 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1527 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528
deadbeefac22f702017-01-12 21:59:29 -08001529 int flags1 = SECURE | flags1_in;
1530 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 bool dtls1 = !!(flags1_in & DTLS);
1532 bool dtls2 = !!(flags2_in & DTLS);
1533 CreateChannels(flags1, flags2);
zhihuange683c682017-08-31 16:00:07 -07001534 EXPECT_FALSE(channel1_->srtp_active());
1535 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001537 WaitForThreads();
1538 EXPECT_TRUE(channel1_->writable());
1539 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001541 EXPECT_TRUE(channel1_->srtp_active());
1542 EXPECT_TRUE(channel2_->srtp_active());
1543 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1544 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001545 SendRtp1();
1546 SendRtp2();
1547 SendRtcp1();
1548 SendRtcp2();
1549 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 EXPECT_TRUE(CheckRtp1());
1551 EXPECT_TRUE(CheckRtp2());
1552 EXPECT_TRUE(CheckNoRtp1());
1553 EXPECT_TRUE(CheckNoRtp2());
1554 EXPECT_TRUE(CheckRtcp1());
1555 EXPECT_TRUE(CheckRtcp2());
1556 EXPECT_TRUE(CheckNoRtcp1());
1557 EXPECT_TRUE(CheckNoRtcp2());
1558 }
1559
1560 // Test that we properly handling SRTP negotiating down to RTP.
1561 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001562 CreateChannels(SECURE, 0);
zhihuange683c682017-08-31 16:00:07 -07001563 EXPECT_FALSE(channel1_->srtp_active());
1564 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001565 EXPECT_TRUE(SendInitiate());
1566 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001567 EXPECT_FALSE(channel1_->srtp_active());
1568 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001569 SendRtp1();
1570 SendRtp2();
1571 SendRtcp1();
1572 SendRtcp2();
1573 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001574 EXPECT_TRUE(CheckRtp1());
1575 EXPECT_TRUE(CheckRtp2());
1576 EXPECT_TRUE(CheckNoRtp1());
1577 EXPECT_TRUE(CheckNoRtp2());
1578 EXPECT_TRUE(CheckRtcp1());
1579 EXPECT_TRUE(CheckRtcp2());
1580 EXPECT_TRUE(CheckNoRtcp1());
1581 EXPECT_TRUE(CheckNoRtcp2());
1582 }
1583
1584 // Test that we can send and receive early media when a provisional answer is
1585 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1586 void SendEarlyMediaUsingRtcpMuxSrtp() {
1587 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1588
deadbeefac22f702017-01-12 21:59:29 -08001589 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1590 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 EXPECT_TRUE(SendOffer());
1592 EXPECT_TRUE(SendProvisionalAnswer());
zhihuange683c682017-08-31 16:00:07 -07001593 EXPECT_TRUE(channel1_->srtp_active());
1594 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001595 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1596 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001597 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1598 SendCustomRtcp1(kSsrc1);
1599 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1600 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1603
1604 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001605 SendCustomRtcp2(kSsrc2);
1606 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1607 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1610
1611 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001612 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1613 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001615 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1616 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1617 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1618 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
zhihuange683c682017-08-31 16:00:07 -07001619 EXPECT_TRUE(channel1_->srtp_active());
1620 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001621 SendCustomRtcp1(kSsrc1);
1622 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1623 SendCustomRtcp2(kSsrc2);
1624 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1625 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1630 }
1631
1632 // Test that we properly send RTP without SRTP from a thread.
1633 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001634 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 EXPECT_TRUE(SendInitiate());
1636 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1638 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1639 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1640 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1641 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1642 send_rtcp1.thread(),
1643 send_rtcp2.thread()};
1644 WaitForThreads(involved_threads);
1645 EXPECT_TRUE(CheckRtp1());
1646 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 EXPECT_TRUE(CheckNoRtp1());
1648 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001649 EXPECT_TRUE(CheckRtcp1());
1650 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 EXPECT_TRUE(CheckNoRtcp1());
1652 EXPECT_TRUE(CheckNoRtcp2());
1653 }
1654
1655 // Test that we properly send SRTP with RTCP from a thread.
1656 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001657 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 EXPECT_TRUE(SendInitiate());
1659 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001660 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1661 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1662 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1663 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1664 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1665 send_rtcp1.thread(),
1666 send_rtcp2.thread()};
1667 WaitForThreads(involved_threads);
1668 EXPECT_TRUE(CheckRtp1());
1669 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 EXPECT_TRUE(CheckNoRtp1());
1671 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001672 EXPECT_TRUE(CheckRtcp1());
1673 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 EXPECT_TRUE(CheckNoRtcp1());
1675 EXPECT_TRUE(CheckNoRtcp2());
1676 }
1677
1678 // Test that the mediachannel retains its sending state after the transport
1679 // becomes non-writable.
1680 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001681 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 EXPECT_TRUE(SendInitiate());
1683 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001684 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1685 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686 SendRtp1();
1687 SendRtp2();
1688 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689 EXPECT_TRUE(CheckRtp1());
1690 EXPECT_TRUE(CheckRtp2());
1691 EXPECT_TRUE(CheckNoRtp1());
1692 EXPECT_TRUE(CheckNoRtp2());
1693
wu@webrtc.org97077a32013-10-25 21:18:33 +00001694 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001695 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1696 fake_rtp_dtls_transport1_->SetWritable(false);
1697 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698 SendRtp1();
1699 SendRtp2();
1700 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 EXPECT_TRUE(CheckRtp1());
1702 EXPECT_TRUE(CheckNoRtp2());
1703
1704 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001705 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1706 fake_rtp_dtls_transport1_->SetWritable(true);
1707 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709 SendRtp1();
1710 SendRtp2();
1711 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 EXPECT_TRUE(CheckRtp1());
1713 EXPECT_TRUE(CheckRtp2());
1714 EXPECT_TRUE(CheckNoRtp1());
1715 EXPECT_TRUE(CheckNoRtp2());
1716
1717 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001718 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1719 bool asymmetric = true;
1720 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1721 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722 EXPECT_TRUE(media_channel1_->sending());
1723
wu@webrtc.org97077a32013-10-25 21:18:33 +00001724 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725 SendRtp1();
1726 SendRtp2();
1727 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 EXPECT_TRUE(CheckRtp1());
1729 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001730 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731
1732 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001733 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001734 bool asymmetric = true;
1735 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1736 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001737 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001739 SendRtp1();
1740 SendRtp2();
1741 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 EXPECT_TRUE(CheckRtp1());
1743 EXPECT_TRUE(CheckRtp2());
1744 EXPECT_TRUE(CheckNoRtp1());
1745 EXPECT_TRUE(CheckNoRtp2());
1746 }
1747
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001748 void SendBundleToBundle(
1749 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1750 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001752 // Only pl_type1 was added to the bundle filter for both |channel1_|
1753 // and |channel2_|.
1754 int pl_type1 = pl_types[0];
1755 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001756 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001757 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001758 if (rtcp_mux) {
1759 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001760 }
1761 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001763 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1764 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001766 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1767 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001768 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1769 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1770 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1771 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001772
1773 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1775 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1776 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001777 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001778 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1779 EXPECT_TRUE(CheckNoRtp1());
1780 EXPECT_TRUE(CheckNoRtp2());
1781
1782 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1784 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1785 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001786 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001787 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1788
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789 SendCustomRtcp1(kSsrc1);
1790 SendCustomRtcp2(kSsrc2);
1791 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1793 EXPECT_TRUE(CheckNoRtcp1());
1794 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1795 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797 SendCustomRtcp1(kSsrc2);
1798 SendCustomRtcp2(kSsrc1);
1799 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001800 // Bundle filter shouldn't filter out any RTCP.
1801 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1802 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 }
1804
deadbeefc6b6e092016-12-01 12:49:20 -08001805 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 CreateChannels(0, 0);
1808 EXPECT_TRUE(SendInitiate());
1809 EXPECT_TRUE(SendAccept());
1810 channel1_->StartMediaMonitor(100);
1811 channel2_->StartMediaMonitor(100);
1812 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001813 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1814 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 channel1_->StopMediaMonitor();
1816 channel2_->StopMediaMonitor();
1817 // Ensure a restart of a stopped monitor works.
1818 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001819 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 channel1_->StopMediaMonitor();
1821 // Ensure stopping a stopped monitor is OK.
1822 channel1_->StopMediaMonitor();
1823 }
1824
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 void TestSetContentFailure() {
1826 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827
Peter Thatchera6d24442015-07-09 21:26:36 -07001828 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001829 std::unique_ptr<typename T::Content> content(
1830 CreateMediaContentWithStream(1));
1831
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001833 EXPECT_FALSE(
1834 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1835 EXPECT_FALSE(
1836 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001839 EXPECT_FALSE(
1840 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1841
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001843 EXPECT_FALSE(
1844 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 }
1846
1847 void TestSendTwoOffers() {
1848 CreateChannels(0, 0);
1849
Peter Thatchera6d24442015-07-09 21:26:36 -07001850 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001851 std::unique_ptr<typename T::Content> content1(
1852 CreateMediaContentWithStream(1));
1853 EXPECT_TRUE(
1854 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1856
Steve Anton18ee1d52017-09-11 11:32:35 -07001857 std::unique_ptr<typename T::Content> content2(
1858 CreateMediaContentWithStream(2));
1859 EXPECT_TRUE(
1860 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1862 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1863 }
1864
1865 void TestReceiveTwoOffers() {
1866 CreateChannels(0, 0);
1867
Peter Thatchera6d24442015-07-09 21:26:36 -07001868 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001869 std::unique_ptr<typename T::Content> content1(
1870 CreateMediaContentWithStream(1));
1871 EXPECT_TRUE(
1872 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001873 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1874
Steve Anton18ee1d52017-09-11 11:32:35 -07001875 std::unique_ptr<typename T::Content> content2(
1876 CreateMediaContentWithStream(2));
1877 EXPECT_TRUE(
1878 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1880 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1881 }
1882
1883 void TestSendPrAnswer() {
1884 CreateChannels(0, 0);
1885
Peter Thatchera6d24442015-07-09 21:26:36 -07001886 std::string err;
1887 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001888 std::unique_ptr<typename T::Content> content1(
1889 CreateMediaContentWithStream(1));
1890 EXPECT_TRUE(
1891 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1893
Peter Thatchera6d24442015-07-09 21:26:36 -07001894 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001895 std::unique_ptr<typename T::Content> content2(
1896 CreateMediaContentWithStream(2));
1897 EXPECT_TRUE(
1898 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1900 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1901
Peter Thatchera6d24442015-07-09 21:26:36 -07001902 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001903 std::unique_ptr<typename T::Content> content3(
1904 CreateMediaContentWithStream(3));
1905 EXPECT_TRUE(
1906 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1908 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1909 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1910 }
1911
1912 void TestReceivePrAnswer() {
1913 CreateChannels(0, 0);
1914
Peter Thatchera6d24442015-07-09 21:26:36 -07001915 std::string err;
1916 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001917 std::unique_ptr<typename T::Content> content1(
1918 CreateMediaContentWithStream(1));
1919 EXPECT_TRUE(
1920 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1922
Peter Thatchera6d24442015-07-09 21:26:36 -07001923 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001924 std::unique_ptr<typename T::Content> content2(
1925 CreateMediaContentWithStream(2));
1926 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1927 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1929 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1930
Peter Thatchera6d24442015-07-09 21:26:36 -07001931 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001932 std::unique_ptr<typename T::Content> content3(
1933 CreateMediaContentWithStream(3));
1934 EXPECT_TRUE(
1935 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1937 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1938 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1939 }
1940
1941 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001942 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 EXPECT_TRUE(SendInitiate());
1944 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001945 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1946 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947
1948 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 // The sending message is only posted. channel2_ should be empty.
1951 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001952 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1953 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954
1955 // When channel1_ is deleted, the RTCP packet should be sent out to
1956 // channel2_.
1957 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 EXPECT_TRUE(CheckRtcp2());
1960 }
1961
zstein56162b92017-04-24 16:54:35 -07001962 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001963 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965
zstein56162b92017-04-24 16:54:35 -07001966 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 EXPECT_TRUE(media_channel1_->ready_to_send());
1969
zstein56162b92017-04-24 16:54:35 -07001970 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 }
1974
zstein56162b92017-04-24 16:54:35 -07001975 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001976 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977 typename T::Content content;
1978 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001979 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001981 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001982 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001983 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001984 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1985 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986 EXPECT_FALSE(media_channel1_->ready_to_send());
1987 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1988 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001989 network_thread_->Invoke<void>(RTC_FROM_HERE,
1990 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001993
zstein56162b92017-04-24 16:54:35 -07001994 // TODO(zstein): Find a way to test this without making
1995 // OnTransportReadyToSend public.
1996 network_thread_->Invoke<void>(
1997 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999 EXPECT_FALSE(media_channel1_->ready_to_send());
2000 }
2001
skvladdc1c62c2016-03-16 19:07:43 -07002002 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
2003 typename T::Content content;
2004 CreateContent(0, kPcmuCodec, kH264Codec, &content);
2005 content.set_bandwidth(remote_limit);
2006 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
2007 }
2008
deadbeefe702b302017-02-04 12:09:01 -08002009 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07002010 webrtc::RtpParameters parameters;
2011 webrtc::RtpEncodingParameters encoding;
2012 encoding.max_bitrate_bps = limit;
2013 parameters.encodings.push_back(encoding);
2014 return parameters;
2015 }
2016
2017 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08002018 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07002019 EXPECT_EQ(1UL, parameters.encodings.size());
2020 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
2021 }
2022
2023 void DefaultMaxBitrateIsUnlimited() {
2024 CreateChannels(0, 0);
2025 EXPECT_TRUE(
2026 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2027 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08002028 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2029 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002030 }
2031
2032 void CanChangeMaxBitrate() {
2033 CreateChannels(0, 0);
2034 EXPECT_TRUE(
2035 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2036
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07002037 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08002038 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
2039 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2040 rtc::Optional<int>(1000));
2041 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2042 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07002043 EXPECT_EQ(-1, media_channel1_->max_bps());
2044
deadbeefe702b302017-02-04 12:09:01 -08002045 EXPECT_TRUE(channel1_->SetRtpSendParameters(
2046 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
2047 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2048 rtc::Optional<int>());
2049 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2050 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002051 EXPECT_EQ(-1, media_channel1_->max_bps());
2052 }
2053
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002055 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2056 static void ProcessThreadQueue(rtc::Thread* thread) {
2057 RTC_DCHECK(thread->IsCurrent());
2058 while (!thread->empty()) {
2059 thread->ProcessMessages(0);
2060 }
2061 }
2062 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2063 // |threads| and current thread post packets to network thread.
2064 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002065 thread->Invoke<void>(RTC_FROM_HERE,
2066 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002067 }
2068 ProcessThreadQueue(rtc::Thread::Current());
2069 // Network thread move them around and post back to worker = current thread.
2070 if (!network_thread_->IsCurrent()) {
2071 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002072 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073 }
2074 // Worker thread = current Thread process received messages.
2075 ProcessThreadQueue(rtc::Thread::Current());
2076 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002077 // TODO(pbos): Remove playout from all media channels and let renderers mute
2078 // themselves.
2079 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002080 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2081 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002082 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2083 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2084 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2085 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2086 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2087 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2088 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2089 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 cricket::FakeMediaEngine media_engine_;
2091 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002092 typename T::MediaChannel* media_channel1_ = nullptr;
2093 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002094 std::unique_ptr<typename T::Channel> channel1_;
2095 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002096 typename T::Content local_media_content1_;
2097 typename T::Content local_media_content2_;
2098 typename T::Content remote_media_content1_;
2099 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101 rtc::Buffer rtp_packet_;
2102 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002103 int media_info_callbacks1_ = 0;
2104 int media_info_callbacks2_ = 0;
2105 int rtcp_mux_activated_callbacks1_ = 0;
2106 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002107 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108};
2109
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110template<>
2111void ChannelTest<VoiceTraits>::CreateContent(
2112 int flags,
2113 const cricket::AudioCodec& audio_codec,
2114 const cricket::VideoCodec& video_codec,
2115 cricket::AudioContentDescription* audio) {
2116 audio->AddCodec(audio_codec);
2117 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2118 if (flags & SECURE) {
2119 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002120 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2121 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122 }
2123}
2124
2125template<>
2126void ChannelTest<VoiceTraits>::CopyContent(
2127 const cricket::AudioContentDescription& source,
2128 cricket::AudioContentDescription* audio) {
2129 *audio = source;
2130}
2131
2132template<>
2133bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2134 const cricket::AudioCodec& c2) {
2135 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2136 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2137}
2138
Peter Boström0c4e06b2015-10-07 12:23:21 +02002139template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002140void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002141 uint32_t ssrc,
2142 int flags,
2143 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144 audio->AddLegacyStream(ssrc);
2145}
2146
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148 public:
solenberg1dd98f32015-09-10 01:57:14 -07002149 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002150 VoiceChannelSingleThreadTest()
2151 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2152};
2153
2154class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2155 public:
2156 typedef ChannelTest<VoiceTraits> Base;
2157 VoiceChannelDoubleThreadTest()
2158 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159};
2160
jbauch5869f502017-06-29 12:31:36 -07002161class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2162 : public ChannelTest<VoiceTraits> {
2163 public:
2164 typedef ChannelTest<VoiceTraits> Base;
2165 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2166 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2167 NetworkIsWorker::Yes) {}
2168};
2169
2170class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2171 : public ChannelTest<VoiceTraits> {
2172 public:
2173 typedef ChannelTest<VoiceTraits> Base;
2174 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2175 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2176 NetworkIsWorker::No) {}
2177};
2178
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002180template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182 rtc::Thread* worker_thread,
2183 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002184 cricket::MediaEngineInterface* engine,
2185 cricket::FakeVideoMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08002186 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2187 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002188 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2189 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002190 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002191 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -08002192 cricket::VideoChannel* channel = new cricket::VideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08002193 worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
deadbeefac22f702017-01-12 21:59:29 -08002194 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002195 if (!channel->NeedsRtcpTransport()) {
2196 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002197 }
deadbeeff5346592017-01-24 21:51:21 -08002198 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2199 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 delete channel;
2201 channel = NULL;
2202 }
2203 return channel;
2204}
2205
2206// override to add 0 parameter
2207template<>
2208bool ChannelTest<VideoTraits>::AddStream1(int id) {
2209 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2210}
2211
2212template<>
2213void ChannelTest<VideoTraits>::CreateContent(
2214 int flags,
2215 const cricket::AudioCodec& audio_codec,
2216 const cricket::VideoCodec& video_codec,
2217 cricket::VideoContentDescription* video) {
2218 video->AddCodec(video_codec);
2219 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2220 if (flags & SECURE) {
2221 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002222 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2223 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224 }
2225}
2226
2227template<>
2228void ChannelTest<VideoTraits>::CopyContent(
2229 const cricket::VideoContentDescription& source,
2230 cricket::VideoContentDescription* video) {
2231 *video = source;
2232}
2233
2234template<>
2235bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2236 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002237 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238}
2239
Peter Boström0c4e06b2015-10-07 12:23:21 +02002240template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002242 uint32_t ssrc,
2243 int flags,
2244 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 video->AddLegacyStream(ssrc);
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 public:
solenberg1dd98f32015-09-10 01:57:14 -07002250 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251 VideoChannelSingleThreadTest()
2252 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253};
2254
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002255class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2256 public:
2257 typedef ChannelTest<VideoTraits> Base;
2258 VideoChannelDoubleThreadTest()
2259 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2260};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002262// VoiceChannelSingleThreadTest
kjellander7c856582017-02-26 19:53:40 -08002263// Flaky on iOS Simualtor: bugs.webrtc.org/7247
2264#if defined(WEBRTC_IOS)
2265#define MAYBE_TestInit DISABLED_TestInit
2266#else
2267#define MAYBE_TestInit TestInit
2268#endif
2269TEST_F(VoiceChannelSingleThreadTest, MAYBE_TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270 Base::TestInit();
2271 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2272 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2273}
2274
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002275TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2276 Base::TestDeinit();
2277}
2278
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002279TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280 Base::TestSetContents();
2281}
2282
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284 Base::TestSetContentsNullOffer();
2285}
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 Base::TestSetContentsRtcpMux();
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292 Base::TestSetContentsRtcpMux();
2293}
2294
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296 Base::TestSetRemoteContentUpdate();
2297}
2298
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002299TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300 Base::TestStreams();
2301}
2302
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002303TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304 Base::TestUpdateStreamsInLocalContent();
2305}
2306
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002307TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308 Base::TestUpdateStreamsInRemoteContent();
2309}
2310
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002311TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312 Base::TestChangeStreamParamsInContent();
2313}
2314
jbauch5869f502017-06-29 12:31:36 -07002315TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2316 TestChangeEncryptedHeaderExtensionsDtls) {
2317 int flags = DTLS;
2318 Base::TestChangeEncryptedHeaderExtensions(flags);
2319}
2320
2321TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2322 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2323 int flags = DTLS;
2324 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2325}
2326
2327TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2328 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2329 int flags = DTLS;
2330 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2331}
2332
2333TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2334 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2335 int flags = DTLS | GCM_CIPHER;
2336 Base::TestChangeEncryptedHeaderExtensions(flags);
2337}
2338
2339TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2340 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2341 int flags = DTLS | GCM_CIPHER;
2342 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2343}
2344
2345TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2346 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2347 int flags = DTLS | GCM_CIPHER;
2348 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2349}
2350
2351TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2352 TestChangeEncryptedHeaderExtensionsSDES) {
2353 int flags = 0;
2354 Base::TestChangeEncryptedHeaderExtensions(flags);
2355}
2356
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002357TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 Base::TestPlayoutAndSendingStates();
2359}
2360
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002361TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002362 CreateChannels(0, 0);
2363 // Test that we can Mute the default channel even though the sending SSRC
2364 // is unknown.
2365 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002366 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002367 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2368 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002369 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2370
2371 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002372 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002373
2374 SendInitiate();
2375 // After the local session description has been set, we can mute a stream
2376 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002377 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002378 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2379 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002380 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381}
2382
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002383TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 Base::TestMediaContentDirection();
2385}
2386
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002387TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002388 Base::TestNetworkRouteChanges();
2389}
2390
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002391TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 Base::TestCallSetup();
2393}
2394
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002395TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 Base::TestCallTeardownRtcpMux();
2397}
2398
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002399TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400 Base::SendRtpToRtp();
2401}
2402
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 Base::SendRtcpToRtcp();
2405}
2406
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002407TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 Base::SendRtcpMuxToRtcp();
2409}
2410
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002411TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 Base::SendRtcpMuxToRtcpMux();
2413}
2414
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002415TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002416 Base::SendRequireRtcpMuxToRtcpMux();
2417}
2418
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002419TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002420 Base::SendRtcpMuxToRequireRtcpMux();
2421}
2422
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002423TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002424 Base::SendRequireRtcpMuxToRequireRtcpMux();
2425}
2426
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002428 Base::SendRequireRtcpMuxToNoRtcpMux();
2429}
2430
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432 Base::SendEarlyRtcpMuxToRtcp();
2433}
2434
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002435TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 Base::SendEarlyRtcpMuxToRtcpMux();
2437}
2438
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002439TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2441}
2442
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002443TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 Base::SendSrtpToSrtp();
2445}
2446
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2449}
2450
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452 Base::SendSrtpToSrtp(DTLS, 0);
2453}
2454
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002455TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 Base::SendSrtpToSrtp(DTLS, DTLS);
2457}
2458
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2461}
2462
deadbeeff5346592017-01-24 21:51:21 -08002463// Test using the channel with a raw packet interface, as opposed to a DTLS
2464// transport interface.
2465TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2466 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2467}
2468
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2471}
2472
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002473TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 Base::SendRtpToRtpOnThread();
2475}
2476
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002477TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 Base::SendSrtpToSrtpOnThread();
2479}
2480
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002481TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482 Base::SendWithWritabilityLoss();
2483}
2484
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002485TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486 Base::TestMediaMonitor();
2487}
2488
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002490TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 CreateChannels(0, 0);
2492 EXPECT_TRUE(SendInitiate());
2493 EXPECT_TRUE(SendAccept());
2494 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2495
solenberg1d63dd02015-12-02 12:35:09 -08002496 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2497 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2498 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002500 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002502 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002503 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002504 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002505 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002506 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507}
2508
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002509TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 Base::TestSetContentFailure();
2511}
2512
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002513TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 Base::TestSendTwoOffers();
2515}
2516
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002517TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518 Base::TestReceiveTwoOffers();
2519}
2520
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002521TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522 Base::TestSendPrAnswer();
2523}
2524
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002525TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 Base::TestReceivePrAnswer();
2527}
2528
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002529TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 Base::TestFlushRtcp();
2531}
2532
zstein56162b92017-04-24 16:54:35 -07002533TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2534 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002535}
2536
zstein56162b92017-04-24 16:54:35 -07002537TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2538 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539}
2540
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002542TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002543 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 EXPECT_TRUE(SendInitiate());
2545 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002546 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547
solenberg4bac9c52015-10-09 02:32:53 -07002548 // Default is (1.0).
2549 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2550 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002552 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553
solenberg4bac9c52015-10-09 02:32:53 -07002554 // Set scale to (1.5).
2555 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2556 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2557 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558
solenberg4bac9c52015-10-09 02:32:53 -07002559 // Set scale to (0).
2560 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2561 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2562 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002563}
2564
2565// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002566TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002567 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568 EXPECT_TRUE(SendInitiate());
2569 EXPECT_TRUE(SendAccept());
2570 EXPECT_TRUE(AddStream1(1));
2571 EXPECT_TRUE(AddStream1(2));
2572
solenberg4bac9c52015-10-09 02:32:53 -07002573 double volume;
2574 // Default is (1.0).
2575 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2576 EXPECT_DOUBLE_EQ(1.0, volume);
2577 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2578 EXPECT_DOUBLE_EQ(1.0, volume);
2579 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2580 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002581 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002582 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583
solenberg4bac9c52015-10-09 02:32:53 -07002584 // Set scale to (1.5) for ssrc = 1.
2585 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2586 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2587 EXPECT_DOUBLE_EQ(1.5, volume);
2588 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2589 EXPECT_DOUBLE_EQ(1.0, volume);
2590 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2591 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002592
solenberg4bac9c52015-10-09 02:32:53 -07002593 // Set scale to (0) for all ssrcs.
2594 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2595 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2596 EXPECT_DOUBLE_EQ(0.0, volume);
2597 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2598 EXPECT_DOUBLE_EQ(0.0, volume);
2599 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2600 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601}
2602
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002603TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002604 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605}
2606
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002607TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002608 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002609}
2610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002611TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002612 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002613}
2614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002615TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002616 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002617}
2618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002619TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002620 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002621}
2622
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002623TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002624 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002625}
2626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002627// VoiceChannelDoubleThreadTest
2628TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002629 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002630 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2631 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632}
2633
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002634TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2635 Base::TestDeinit();
2636}
2637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002638TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639 Base::TestSetContents();
2640}
2641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002642TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 Base::TestSetContentsNullOffer();
2644}
2645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002646TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 Base::TestSetContentsRtcpMux();
2648}
2649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002650TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 Base::TestSetContentsRtcpMux();
2652}
2653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002654TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 Base::TestSetRemoteContentUpdate();
2656}
2657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002658TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 Base::TestStreams();
2660}
2661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002662TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 Base::TestUpdateStreamsInLocalContent();
2664}
2665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002666TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 Base::TestUpdateStreamsInRemoteContent();
2668}
2669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002670TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 Base::TestChangeStreamParamsInContent();
2672}
2673
jbauch5869f502017-06-29 12:31:36 -07002674TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2675 TestChangeEncryptedHeaderExtensionsDtls) {
2676 int flags = DTLS;
2677 Base::TestChangeEncryptedHeaderExtensions(flags);
2678}
2679
2680TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2681 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2682 int flags = DTLS;
2683 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2684}
2685
2686TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2687 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2688 int flags = DTLS;
2689 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2690}
2691
2692TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2693 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2694 int flags = DTLS | GCM_CIPHER;
2695 Base::TestChangeEncryptedHeaderExtensions(flags);
2696}
2697
2698TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2699 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2700 int flags = DTLS | GCM_CIPHER;
2701 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2702}
2703
2704TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2705 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2706 int flags = DTLS | GCM_CIPHER;
2707 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2708}
2709
2710TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2711 TestChangeEncryptedHeaderExtensionsSDES) {
2712 int flags = 0;
2713 Base::TestChangeEncryptedHeaderExtensions(flags);
2714}
2715
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002716TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002717 Base::TestPlayoutAndSendingStates();
2718}
2719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002720TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2721 CreateChannels(0, 0);
2722 // Test that we can Mute the default channel even though the sending SSRC
2723 // is unknown.
2724 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2725 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2726 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2727 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2728 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2729
2730 // Test that we can not mute an unknown SSRC.
2731 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2732
2733 SendInitiate();
2734 // After the local session description has been set, we can mute a stream
2735 // with its SSRC.
2736 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2737 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2738 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2739 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2740}
2741
2742TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2743 Base::TestMediaContentDirection();
2744}
2745
2746TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2747 Base::TestNetworkRouteChanges();
2748}
2749
2750TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2751 Base::TestCallSetup();
2752}
2753
2754TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2755 Base::TestCallTeardownRtcpMux();
2756}
2757
2758TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2759 Base::SendRtpToRtp();
2760}
2761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002762TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2763 Base::SendRtcpToRtcp();
2764}
2765
2766TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2767 Base::SendRtcpMuxToRtcp();
2768}
2769
2770TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2771 Base::SendRtcpMuxToRtcpMux();
2772}
2773
2774TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2775 Base::SendRequireRtcpMuxToRtcpMux();
2776}
2777
2778TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2779 Base::SendRtcpMuxToRequireRtcpMux();
2780}
2781
2782TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2783 Base::SendRequireRtcpMuxToRequireRtcpMux();
2784}
2785
2786TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2787 Base::SendRequireRtcpMuxToNoRtcpMux();
2788}
2789
2790TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2791 Base::SendEarlyRtcpMuxToRtcp();
2792}
2793
2794TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2795 Base::SendEarlyRtcpMuxToRtcpMux();
2796}
2797
2798TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2799 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2800}
2801
2802TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2803 Base::SendSrtpToSrtp();
2804}
2805
2806TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2807 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2808}
2809
2810TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002811 Base::SendSrtpToSrtp(DTLS, 0);
2812}
2813
2814TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002815 Base::SendSrtpToSrtp(DTLS, DTLS);
2816}
2817
2818TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002819 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2820}
2821
deadbeeff5346592017-01-24 21:51:21 -08002822// Test using the channel with a raw packet interface, as opposed to a DTLS
2823// transport interface.
2824TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2825 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2826}
2827
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002828TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2829 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2830}
2831
2832TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2833 Base::SendRtpToRtpOnThread();
2834}
2835
2836TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2837 Base::SendSrtpToSrtpOnThread();
2838}
2839
2840TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2841 Base::SendWithWritabilityLoss();
2842}
2843
2844TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2845 Base::TestMediaMonitor();
2846}
2847
2848// Test that InsertDtmf properly forwards to the media channel.
2849TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2850 CreateChannels(0, 0);
2851 EXPECT_TRUE(SendInitiate());
2852 EXPECT_TRUE(SendAccept());
2853 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2854
2855 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2856 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2857 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2858
2859 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2860 EXPECT_TRUE(
2861 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2862 EXPECT_TRUE(
2863 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2864 EXPECT_TRUE(
2865 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2866}
2867
2868TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2869 Base::TestSetContentFailure();
2870}
2871
2872TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2873 Base::TestSendTwoOffers();
2874}
2875
2876TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2877 Base::TestReceiveTwoOffers();
2878}
2879
2880TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2881 Base::TestSendPrAnswer();
2882}
2883
2884TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2885 Base::TestReceivePrAnswer();
2886}
2887
2888TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2889 Base::TestFlushRtcp();
2890}
2891
zstein56162b92017-04-24 16:54:35 -07002892TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2893 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002894}
2895
zstein56162b92017-04-24 16:54:35 -07002896TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2897 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002898}
2899
2900// Test that we can scale the output volume properly for 1:1 calls.
2901TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002902 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002903 EXPECT_TRUE(SendInitiate());
2904 EXPECT_TRUE(SendAccept());
2905 double volume;
2906
2907 // Default is (1.0).
2908 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2909 EXPECT_DOUBLE_EQ(1.0, volume);
2910 // invalid ssrc.
2911 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2912
2913 // Set scale to (1.5).
2914 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2915 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2916 EXPECT_DOUBLE_EQ(1.5, volume);
2917
2918 // Set scale to (0).
2919 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2920 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2921 EXPECT_DOUBLE_EQ(0.0, volume);
2922}
2923
2924// Test that we can scale the output volume properly for multiway calls.
2925TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002926 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002927 EXPECT_TRUE(SendInitiate());
2928 EXPECT_TRUE(SendAccept());
2929 EXPECT_TRUE(AddStream1(1));
2930 EXPECT_TRUE(AddStream1(2));
2931
2932 double volume;
2933 // Default is (1.0).
2934 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2935 EXPECT_DOUBLE_EQ(1.0, volume);
2936 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2937 EXPECT_DOUBLE_EQ(1.0, volume);
2938 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2939 EXPECT_DOUBLE_EQ(1.0, volume);
2940 // invalid ssrc.
2941 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2942
2943 // Set scale to (1.5) for ssrc = 1.
2944 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2945 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2946 EXPECT_DOUBLE_EQ(1.5, volume);
2947 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2948 EXPECT_DOUBLE_EQ(1.0, volume);
2949 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2950 EXPECT_DOUBLE_EQ(1.0, volume);
2951
2952 // Set scale to (0) for all ssrcs.
2953 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2954 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2955 EXPECT_DOUBLE_EQ(0.0, volume);
2956 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2957 EXPECT_DOUBLE_EQ(0.0, volume);
2958 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2959 EXPECT_DOUBLE_EQ(0.0, volume);
2960}
2961
2962TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2963 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2964}
2965
2966TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2967 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2968}
2969
2970TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2971 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2972}
2973
2974TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2975 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2976}
2977
2978TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2979 Base::DefaultMaxBitrateIsUnlimited();
2980}
2981
2982TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2983 Base::CanChangeMaxBitrate();
2984}
2985
2986// VideoChannelSingleThreadTest
2987TEST_F(VideoChannelSingleThreadTest, TestInit) {
2988 Base::TestInit();
2989}
2990
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002991TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2992 Base::TestDeinit();
2993}
2994
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002995TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2996 Base::TestSetContents();
2997}
2998
2999TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3000 Base::TestSetContentsNullOffer();
3001}
3002
3003TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3004 Base::TestSetContentsRtcpMux();
3005}
3006
3007TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3008 Base::TestSetContentsRtcpMux();
3009}
3010
3011TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3012 Base::TestSetRemoteContentUpdate();
3013}
3014
3015TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3016 Base::TestStreams();
3017}
3018
3019TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3020 Base::TestUpdateStreamsInLocalContent();
3021}
3022
3023TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3024 Base::TestUpdateStreamsInRemoteContent();
3025}
3026
3027TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3028 Base::TestChangeStreamParamsInContent();
3029}
3030
3031TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3032 Base::TestPlayoutAndSendingStates();
3033}
3034
3035TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003036 CreateChannels(0, 0);
3037 // Test that we can Mute the default channel even though the sending SSRC
3038 // is unknown.
3039 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003040 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003041 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003042 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003043 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3044 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003045 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003046 SendInitiate();
3047 // After the local session description has been set, we can mute a stream
3048 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003049 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003050 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003051 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003052 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003053}
3054
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003055TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003056 Base::TestMediaContentDirection();
3057}
3058
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003059TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003060 Base::TestNetworkRouteChanges();
3061}
3062
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003063TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003064 Base::TestCallSetup();
3065}
3066
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003067TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003068 Base::TestCallTeardownRtcpMux();
3069}
3070
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003071TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072 Base::SendRtpToRtp();
3073}
3074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003075TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076 Base::SendRtcpToRtcp();
3077}
3078
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003079TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003080 Base::SendRtcpMuxToRtcp();
3081}
3082
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003083TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003084 Base::SendRtcpMuxToRtcpMux();
3085}
3086
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003087TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003088 Base::SendRequireRtcpMuxToRtcpMux();
3089}
3090
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003091TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003092 Base::SendRtcpMuxToRequireRtcpMux();
3093}
3094
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003095TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003096 Base::SendRequireRtcpMuxToRequireRtcpMux();
3097}
3098
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003099TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003100 Base::SendRequireRtcpMuxToNoRtcpMux();
3101}
3102
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003103TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003104 Base::SendEarlyRtcpMuxToRtcp();
3105}
3106
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003107TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003108 Base::SendEarlyRtcpMuxToRtcpMux();
3109}
3110
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003111TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112 Base::SendSrtpToSrtp();
3113}
3114
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003115TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003116 Base::SendSrtpToSrtp();
3117}
3118
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003119TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 Base::SendSrtpToSrtp(DTLS, 0);
3121}
3122
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003123TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124 Base::SendSrtpToSrtp(DTLS, DTLS);
3125}
3126
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003127TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3129}
3130
deadbeeff5346592017-01-24 21:51:21 -08003131// Test using the channel with a raw packet interface, as opposed to a DTLS
3132// transport interface.
3133TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3134 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3135}
3136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003137TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003138 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3139}
3140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003141TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003142 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3143}
3144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003145TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003146 Base::SendRtpToRtpOnThread();
3147}
3148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003149TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003150 Base::SendSrtpToSrtpOnThread();
3151}
3152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003153TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003154 Base::SendWithWritabilityLoss();
3155}
3156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003157TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003158 Base::TestMediaMonitor();
3159}
3160
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003161TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003162 Base::TestSetContentFailure();
3163}
3164
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003165TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003166 Base::TestSendTwoOffers();
3167}
3168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003169TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003170 Base::TestReceiveTwoOffers();
3171}
3172
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003173TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174 Base::TestSendPrAnswer();
3175}
3176
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003177TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178 Base::TestReceivePrAnswer();
3179}
3180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003181TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003182 Base::TestFlushRtcp();
3183}
3184
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003185TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003186 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003187}
3188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003189TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003190 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003191}
3192
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003193TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003194 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003195}
3196
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003197TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003198 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003199}
3200
zstein56162b92017-04-24 16:54:35 -07003201TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3202 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003203}
3204
zstein56162b92017-04-24 16:54:35 -07003205TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3206 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003207}
3208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003209TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003210 Base::DefaultMaxBitrateIsUnlimited();
3211}
3212
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003213TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003214 Base::CanChangeMaxBitrate();
3215}
3216
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003217// VideoChannelDoubleThreadTest
3218TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3219 Base::TestInit();
3220}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003221
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003222TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3223 Base::TestDeinit();
3224}
3225
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003226TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3227 Base::TestSetContents();
3228}
3229
3230TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3231 Base::TestSetContentsNullOffer();
3232}
3233
3234TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3235 Base::TestSetContentsRtcpMux();
3236}
3237
3238TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3239 Base::TestSetContentsRtcpMux();
3240}
3241
3242TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3243 Base::TestSetRemoteContentUpdate();
3244}
3245
3246TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3247 Base::TestStreams();
3248}
3249
3250TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3251 Base::TestUpdateStreamsInLocalContent();
3252}
3253
3254TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3255 Base::TestUpdateStreamsInRemoteContent();
3256}
3257
3258TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3259 Base::TestChangeStreamParamsInContent();
3260}
3261
3262TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3263 Base::TestPlayoutAndSendingStates();
3264}
3265
3266TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3267 CreateChannels(0, 0);
3268 // Test that we can Mute the default channel even though the sending SSRC
3269 // is unknown.
3270 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003271 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003272 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003273 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003274 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3275 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003276 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003277 SendInitiate();
3278 // After the local session description has been set, we can mute a stream
3279 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003280 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003281 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003282 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003283 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3284}
3285
3286TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3287 Base::TestMediaContentDirection();
3288}
3289
3290TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3291 Base::TestNetworkRouteChanges();
3292}
3293
3294TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3295 Base::TestCallSetup();
3296}
3297
3298TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3299 Base::TestCallTeardownRtcpMux();
3300}
3301
3302TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3303 Base::SendRtpToRtp();
3304}
3305
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003306TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3307 Base::SendRtcpToRtcp();
3308}
3309
3310TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3311 Base::SendRtcpMuxToRtcp();
3312}
3313
3314TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3315 Base::SendRtcpMuxToRtcpMux();
3316}
3317
3318TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3319 Base::SendRequireRtcpMuxToRtcpMux();
3320}
3321
3322TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3323 Base::SendRtcpMuxToRequireRtcpMux();
3324}
3325
3326TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3327 Base::SendRequireRtcpMuxToRequireRtcpMux();
3328}
3329
3330TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3331 Base::SendRequireRtcpMuxToNoRtcpMux();
3332}
3333
3334TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3335 Base::SendEarlyRtcpMuxToRtcp();
3336}
3337
3338TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3339 Base::SendEarlyRtcpMuxToRtcpMux();
3340}
3341
3342TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3343 Base::SendSrtpToSrtp();
3344}
3345
3346TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3347 Base::SendSrtpToSrtp();
3348}
3349
3350TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003351 Base::SendSrtpToSrtp(DTLS, 0);
3352}
3353
3354TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003355 Base::SendSrtpToSrtp(DTLS, DTLS);
3356}
3357
3358TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003359 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3360}
3361
deadbeeff5346592017-01-24 21:51:21 -08003362// Test using the channel with a raw packet interface, as opposed to a DTLS
3363// transport interface.
3364TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3365 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3366}
3367
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003368TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3369 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3370}
3371
3372TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3373 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3374}
3375
3376TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3377 Base::SendRtpToRtpOnThread();
3378}
3379
3380TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3381 Base::SendSrtpToSrtpOnThread();
3382}
3383
3384TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3385 Base::SendWithWritabilityLoss();
3386}
3387
3388TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3389 Base::TestMediaMonitor();
3390}
3391
3392TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3393 Base::TestSetContentFailure();
3394}
3395
3396TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3397 Base::TestSendTwoOffers();
3398}
3399
3400TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3401 Base::TestReceiveTwoOffers();
3402}
3403
3404TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3405 Base::TestSendPrAnswer();
3406}
3407
3408TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3409 Base::TestReceivePrAnswer();
3410}
3411
3412TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3413 Base::TestFlushRtcp();
3414}
3415
3416TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3417 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3418}
3419
3420TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3421 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3422}
3423
3424TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3425 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3426}
3427
3428TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3429 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3430}
3431
zstein56162b92017-04-24 16:54:35 -07003432TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3433 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003434}
3435
zstein56162b92017-04-24 16:54:35 -07003436TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3437 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003438}
3439
3440TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3441 Base::DefaultMaxBitrateIsUnlimited();
3442}
3443
3444TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3445 Base::CanChangeMaxBitrate();
3446}
3447
deadbeef953c2ce2017-01-09 14:53:41 -08003448// RtpDataChannelSingleThreadTest
3449class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003450 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003451 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003452 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003453 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3454};
3455
deadbeef953c2ce2017-01-09 14:53:41 -08003456// RtpDataChannelDoubleThreadTest
3457class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003458 public:
3459 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003460 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003461 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003462};
3463
3464// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003465template <>
deadbeef953c2ce2017-01-09 14:53:41 -08003466cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003467 rtc::Thread* worker_thread,
3468 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003469 cricket::MediaEngineInterface* engine,
3470 cricket::FakeDataMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08003471 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3472 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003473 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3474 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003475 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003476 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef953c2ce2017-01-09 14:53:41 -08003477 cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08003478 worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
deadbeefac22f702017-01-12 21:59:29 -08003479 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003480 if (!channel->NeedsRtcpTransport()) {
3481 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003482 }
deadbeeff5346592017-01-24 21:51:21 -08003483 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3484 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003485 delete channel;
3486 channel = NULL;
3487 }
3488 return channel;
3489}
3490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003491template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003492void ChannelTest<DataTraits>::CreateContent(
3493 int flags,
3494 const cricket::AudioCodec& audio_codec,
3495 const cricket::VideoCodec& video_codec,
3496 cricket::DataContentDescription* data) {
3497 data->AddCodec(kGoogleDataCodec);
3498 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3499 if (flags & SECURE) {
3500 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003501 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3502 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003503 }
3504}
3505
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003506template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003507void ChannelTest<DataTraits>::CopyContent(
3508 const cricket::DataContentDescription& source,
3509 cricket::DataContentDescription* data) {
3510 *data = source;
3511}
3512
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003513template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003514bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3515 const cricket::DataCodec& c2) {
3516 return c1.name == c2.name;
3517}
3518
Peter Boström0c4e06b2015-10-07 12:23:21 +02003519template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003520void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003521 uint32_t ssrc,
3522 int flags,
3523 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003524 data->AddLegacyStream(ssrc);
3525}
3526
deadbeef953c2ce2017-01-09 14:53:41 -08003527TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003528 Base::TestInit();
3529 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3530}
3531
deadbeef953c2ce2017-01-09 14:53:41 -08003532TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003533 Base::TestDeinit();
3534}
3535
deadbeef953c2ce2017-01-09 14:53:41 -08003536TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003537 Base::TestSetContents();
3538}
3539
deadbeef953c2ce2017-01-09 14:53:41 -08003540TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003541 Base::TestSetContentsNullOffer();
3542}
3543
deadbeef953c2ce2017-01-09 14:53:41 -08003544TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003545 Base::TestSetContentsRtcpMux();
3546}
3547
deadbeef953c2ce2017-01-09 14:53:41 -08003548TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003549 Base::TestSetRemoteContentUpdate();
3550}
3551
deadbeef953c2ce2017-01-09 14:53:41 -08003552TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003553 Base::TestStreams();
3554}
3555
deadbeef953c2ce2017-01-09 14:53:41 -08003556TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003557 Base::TestUpdateStreamsInLocalContent();
3558}
3559
deadbeef953c2ce2017-01-09 14:53:41 -08003560TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003561 Base::TestUpdateStreamsInRemoteContent();
3562}
3563
deadbeef953c2ce2017-01-09 14:53:41 -08003564TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003565 Base::TestChangeStreamParamsInContent();
3566}
3567
deadbeef953c2ce2017-01-09 14:53:41 -08003568TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003569 Base::TestPlayoutAndSendingStates();
3570}
3571
deadbeef953c2ce2017-01-09 14:53:41 -08003572TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003573 Base::TestMediaContentDirection();
3574}
3575
deadbeef953c2ce2017-01-09 14:53:41 -08003576TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003577 Base::TestCallSetup();
3578}
3579
deadbeef953c2ce2017-01-09 14:53:41 -08003580TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003581 Base::TestCallTeardownRtcpMux();
3582}
3583
zstein56162b92017-04-24 16:54:35 -07003584TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3585 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003586}
3587
zstein56162b92017-04-24 16:54:35 -07003588TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3589 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003590}
3591
deadbeef953c2ce2017-01-09 14:53:41 -08003592TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003593 Base::SendRtpToRtp();
3594}
3595
deadbeef953c2ce2017-01-09 14:53:41 -08003596TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003597 Base::SendRtcpToRtcp();
3598}
3599
deadbeef953c2ce2017-01-09 14:53:41 -08003600TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003601 Base::SendRtcpMuxToRtcp();
3602}
3603
deadbeef953c2ce2017-01-09 14:53:41 -08003604TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003605 Base::SendRtcpMuxToRtcpMux();
3606}
3607
deadbeef953c2ce2017-01-09 14:53:41 -08003608TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003609 Base::SendEarlyRtcpMuxToRtcp();
3610}
3611
deadbeef953c2ce2017-01-09 14:53:41 -08003612TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003613 Base::SendEarlyRtcpMuxToRtcpMux();
3614}
3615
deadbeef953c2ce2017-01-09 14:53:41 -08003616TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003617 Base::SendSrtpToSrtp();
3618}
3619
deadbeef953c2ce2017-01-09 14:53:41 -08003620TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003621 Base::SendSrtpToSrtp();
3622}
3623
deadbeef953c2ce2017-01-09 14:53:41 -08003624TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003625 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3626}
3627
deadbeef953c2ce2017-01-09 14:53:41 -08003628TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003629 Base::SendRtpToRtpOnThread();
3630}
3631
deadbeef953c2ce2017-01-09 14:53:41 -08003632TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003633 Base::SendSrtpToSrtpOnThread();
3634}
3635
deadbeef953c2ce2017-01-09 14:53:41 -08003636TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003637 Base::SendWithWritabilityLoss();
3638}
3639
deadbeef953c2ce2017-01-09 14:53:41 -08003640TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003641 Base::TestMediaMonitor();
3642}
3643
deadbeef953c2ce2017-01-09 14:53:41 -08003644TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003645 CreateChannels(0, 0);
3646 EXPECT_TRUE(SendInitiate());
3647 EXPECT_TRUE(SendAccept());
3648
3649 cricket::SendDataParams params;
3650 params.ssrc = 42;
3651 unsigned char data[] = {'f', 'o', 'o'};
3652 rtc::CopyOnWriteBuffer payload(data, 3);
3653 cricket::SendDataResult result;
3654 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3655 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3656 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3657}
3658
deadbeef953c2ce2017-01-09 14:53:41 -08003659TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003660 Base::TestInit();
3661 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3662}
3663
deadbeef953c2ce2017-01-09 14:53:41 -08003664TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003665 Base::TestDeinit();
3666}
3667
deadbeef953c2ce2017-01-09 14:53:41 -08003668TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003669 Base::TestSetContents();
3670}
3671
deadbeef953c2ce2017-01-09 14:53:41 -08003672TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003673 Base::TestSetContentsNullOffer();
3674}
3675
deadbeef953c2ce2017-01-09 14:53:41 -08003676TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003677 Base::TestSetContentsRtcpMux();
3678}
3679
deadbeef953c2ce2017-01-09 14:53:41 -08003680TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003681 Base::TestSetRemoteContentUpdate();
3682}
3683
deadbeef953c2ce2017-01-09 14:53:41 -08003684TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003685 Base::TestStreams();
3686}
3687
deadbeef953c2ce2017-01-09 14:53:41 -08003688TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003689 Base::TestUpdateStreamsInLocalContent();
3690}
3691
deadbeef953c2ce2017-01-09 14:53:41 -08003692TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003693 Base::TestUpdateStreamsInRemoteContent();
3694}
3695
deadbeef953c2ce2017-01-09 14:53:41 -08003696TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003697 Base::TestChangeStreamParamsInContent();
3698}
3699
deadbeef953c2ce2017-01-09 14:53:41 -08003700TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003701 Base::TestPlayoutAndSendingStates();
3702}
3703
deadbeef953c2ce2017-01-09 14:53:41 -08003704TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003705 Base::TestMediaContentDirection();
3706}
3707
deadbeef953c2ce2017-01-09 14:53:41 -08003708TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003709 Base::TestCallSetup();
3710}
3711
deadbeef953c2ce2017-01-09 14:53:41 -08003712TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003713 Base::TestCallTeardownRtcpMux();
3714}
3715
zstein56162b92017-04-24 16:54:35 -07003716TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3717 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003718}
3719
zstein56162b92017-04-24 16:54:35 -07003720TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3721 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003722}
3723
deadbeef953c2ce2017-01-09 14:53:41 -08003724TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003725 Base::SendRtpToRtp();
3726}
3727
deadbeef953c2ce2017-01-09 14:53:41 -08003728TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003729 Base::SendRtcpToRtcp();
3730}
3731
deadbeef953c2ce2017-01-09 14:53:41 -08003732TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003733 Base::SendRtcpMuxToRtcp();
3734}
3735
deadbeef953c2ce2017-01-09 14:53:41 -08003736TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003737 Base::SendRtcpMuxToRtcpMux();
3738}
3739
deadbeef953c2ce2017-01-09 14:53:41 -08003740TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003741 Base::SendEarlyRtcpMuxToRtcp();
3742}
3743
deadbeef953c2ce2017-01-09 14:53:41 -08003744TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003745 Base::SendEarlyRtcpMuxToRtcpMux();
3746}
3747
deadbeef953c2ce2017-01-09 14:53:41 -08003748TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003749 Base::SendSrtpToSrtp();
3750}
3751
deadbeef953c2ce2017-01-09 14:53:41 -08003752TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003753 Base::SendSrtpToSrtp();
3754}
3755
deadbeef953c2ce2017-01-09 14:53:41 -08003756TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003757 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3758}
3759
deadbeef953c2ce2017-01-09 14:53:41 -08003760TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003761 Base::SendRtpToRtpOnThread();
3762}
3763
deadbeef953c2ce2017-01-09 14:53:41 -08003764TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003765 Base::SendSrtpToSrtpOnThread();
3766}
3767
deadbeef953c2ce2017-01-09 14:53:41 -08003768TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003769 Base::SendWithWritabilityLoss();
3770}
3771
deadbeef953c2ce2017-01-09 14:53:41 -08003772TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003773 Base::TestMediaMonitor();
3774}
3775
deadbeef953c2ce2017-01-09 14:53:41 -08003776TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003777 CreateChannels(0, 0);
3778 EXPECT_TRUE(SendInitiate());
3779 EXPECT_TRUE(SendAccept());
3780
3781 cricket::SendDataParams params;
3782 params.ssrc = 42;
3783 unsigned char data[] = {
3784 'f', 'o', 'o'
3785 };
jbaucheec21bd2016-03-20 06:15:43 -07003786 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003787 cricket::SendDataResult result;
3788 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3789 EXPECT_EQ(params.ssrc,
3790 media_channel1_->last_sent_data_params().ssrc);
3791 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3792}
3793
deadbeefbad5dad2017-01-17 18:32:35 -08003794#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3795
3796// Verifies some DCHECKs are in place.
3797// Uses VoiceChannel, but any BaseChannel subclass would work.
3798class BaseChannelDeathTest : public testing::Test {
3799 public:
3800 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003801 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3802 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3803 // RTCP mux not required, SRTP required.
deadbeefbad5dad2017-01-17 18:32:35 -08003804 voice_channel_(
3805 rtc::Thread::Current(),
3806 rtc::Thread::Current(),
3807 rtc::Thread::Current(),
3808 &fake_media_engine_,
3809 new cricket::FakeVoiceMediaChannel(nullptr,
3810 cricket::AudioOptions()),
3811 cricket::CN_AUDIO,
3812 false,
deadbeeff5346592017-01-24 21:51:21 -08003813 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003814
3815 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003816 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003817 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3818 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003819 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003820};
3821
deadbeeff5346592017-01-24 21:51:21 -08003822TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
3823 ASSERT_TRUE(voice_channel_.Init_w(
3824 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3825 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3826 cricket::FakeDtlsTransport new_rtcp_transport(
3827 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3828 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003829}
3830
deadbeeff5346592017-01-24 21:51:21 -08003831TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
3832 ASSERT_TRUE(voice_channel_.Init_w(
3833 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3834 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3835 cricket::FakeDtlsTransport new_rtp_transport(
3836 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3837 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003838}
3839
deadbeeff5346592017-01-24 21:51:21 -08003840TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
3841 ASSERT_TRUE(voice_channel_.Init_w(
3842 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3843 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
deadbeefbad5dad2017-01-17 18:32:35 -08003844 // Activate RTCP muxing, simulating offer/answer negotiation.
3845 cricket::AudioContentDescription content;
3846 content.set_rtcp_mux(true);
3847 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3848 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003849 cricket::FakeDtlsTransport new_rtp_transport(
3850 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3851 cricket::FakeDtlsTransport new_rtcp_transport(
3852 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003853 // After muxing is enabled, no RTCP transport should be passed in here.
3854 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003855 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3856 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003857}
3858
3859// This test will probably go away if/when we move the transport name out of
3860// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003861TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
3862 ASSERT_TRUE(voice_channel_.Init_w(
3863 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3864 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3865 cricket::FakeDtlsTransport new_rtp_transport(
3866 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3867 cricket::FakeDtlsTransport new_rtcp_transport(
3868 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003869 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003870 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3871 "");
3872}
3873
3874// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003875// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003876TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
3877 ASSERT_TRUE(voice_channel_.Init_w(
3878 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3879 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3880 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003881 voice_channel_.SetTransports(
3882 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3883 static_cast<rtc::PacketTransportInternal*>(
3884 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003885 "");
3886}
3887
deadbeef5bd5ca32017-02-10 11:31:50 -08003888// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003889// DtlsTransportInternal.
3890TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
3891 ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3892 &fake_rtcp_dtls_transport_));
3893 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3894 &fake_rtp_dtls_transport_),
3895 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003896}
3897
3898#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3899
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003900// TODO(pthatcher): TestSetReceiver?