blob: 07333b4070c513c424212c15aceea563da13e86f [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>
Steve Anton36b29d12017-10-30 09:57:42 -0700528 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200529 : 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);
Zhi Huangcf990f52017-09-22 12:12:30 -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
Zhi Huangcf990f52017-09-22 12:12:30 -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);
Zhi Huangcf990f52017-09-22 12:12:30 -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());
Zhi Huangcf990f52017-09-22 12:12:30 -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);
Zhi Huangcf990f52017-09-22 12:12:30 -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());
Zhi Huangcf990f52017-09-22 12:12:30 -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);
Zhi Huangcf990f52017-09-22 12:12:30 -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());
Zhi Huangcf990f52017-09-22 12:12:30 -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());
Zhi Huangcf990f52017-09-22 12:12:30 -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_);
Zhi Huangcf990f52017-09-22 12:12:30 -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
Steve Anton8a63f782017-10-23 13:08:53 -07002054 // Test that when a channel gets new transports with a call to
2055 // |SetTransports|, the socket options from the old transports are merged with
2056 // the options on the new transport.
2057 // For example, audio and video may use separate socket options, but initially
2058 // be unbundled, then later become bundled. When this happens, their preferred
2059 // socket options should be merged to the underlying transport they share.
2060 void SocketOptionsMergedOnSetTransport() {
2061 constexpr int kSndBufSize = 4000;
2062 constexpr int kRcvBufSize = 8000;
2063
2064 CreateChannels(0, 0);
2065
2066 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
2067 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
2068 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
2069 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
2070
2071 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
2072 channel2_->rtcp_dtls_transport());
2073
2074 int option_val;
2075 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2076 rtc::Socket::Option::OPT_SNDBUF, &option_val));
2077 EXPECT_EQ(kSndBufSize, option_val);
2078 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2079 rtc::Socket::Option::OPT_RCVBUF, &option_val));
2080 EXPECT_EQ(kRcvBufSize, option_val);
2081 }
2082
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002084 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2085 static void ProcessThreadQueue(rtc::Thread* thread) {
2086 RTC_DCHECK(thread->IsCurrent());
2087 while (!thread->empty()) {
2088 thread->ProcessMessages(0);
2089 }
2090 }
2091 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2092 // |threads| and current thread post packets to network thread.
2093 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002094 thread->Invoke<void>(RTC_FROM_HERE,
2095 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002096 }
2097 ProcessThreadQueue(rtc::Thread::Current());
2098 // Network thread move them around and post back to worker = current thread.
2099 if (!network_thread_->IsCurrent()) {
2100 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002101 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002102 }
2103 // Worker thread = current Thread process received messages.
2104 ProcessThreadQueue(rtc::Thread::Current());
2105 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002106 // TODO(pbos): Remove playout from all media channels and let renderers mute
2107 // themselves.
2108 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2110 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002111 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2112 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2113 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2114 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2115 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2116 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2117 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2118 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119 cricket::FakeMediaEngine media_engine_;
2120 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002121 typename T::MediaChannel* media_channel1_ = nullptr;
2122 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002123 std::unique_ptr<typename T::Channel> channel1_;
2124 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125 typename T::Content local_media_content1_;
2126 typename T::Content local_media_content2_;
2127 typename T::Content remote_media_content1_;
2128 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002130 rtc::Buffer rtp_packet_;
2131 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002132 int media_info_callbacks1_ = 0;
2133 int media_info_callbacks2_ = 0;
2134 int rtcp_mux_activated_callbacks1_ = 0;
2135 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002136 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137};
2138
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002139template<>
2140void ChannelTest<VoiceTraits>::CreateContent(
2141 int flags,
2142 const cricket::AudioCodec& audio_codec,
2143 const cricket::VideoCodec& video_codec,
2144 cricket::AudioContentDescription* audio) {
2145 audio->AddCodec(audio_codec);
2146 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2147 if (flags & SECURE) {
2148 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002149 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2150 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151 }
2152}
2153
2154template<>
2155void ChannelTest<VoiceTraits>::CopyContent(
2156 const cricket::AudioContentDescription& source,
2157 cricket::AudioContentDescription* audio) {
2158 *audio = source;
2159}
2160
2161template<>
2162bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2163 const cricket::AudioCodec& c2) {
2164 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2165 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2166}
2167
Peter Boström0c4e06b2015-10-07 12:23:21 +02002168template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002169void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002170 uint32_t ssrc,
2171 int flags,
2172 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 audio->AddLegacyStream(ssrc);
2174}
2175
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002176class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177 public:
solenberg1dd98f32015-09-10 01:57:14 -07002178 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002179 VoiceChannelSingleThreadTest()
2180 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2181};
2182
2183class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2184 public:
2185 typedef ChannelTest<VoiceTraits> Base;
2186 VoiceChannelDoubleThreadTest()
2187 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188};
2189
jbauch5869f502017-06-29 12:31:36 -07002190class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2191 : public ChannelTest<VoiceTraits> {
2192 public:
2193 typedef ChannelTest<VoiceTraits> Base;
2194 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2195 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2196 NetworkIsWorker::Yes) {}
2197};
2198
2199class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2200 : public ChannelTest<VoiceTraits> {
2201 public:
2202 typedef ChannelTest<VoiceTraits> Base;
2203 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2204 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2205 NetworkIsWorker::No) {}
2206};
2207
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002209template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002210cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002211 rtc::Thread* worker_thread,
2212 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002213 cricket::MediaEngineInterface* engine,
2214 cricket::FakeVideoMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08002215 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2216 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002217 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2218 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002219 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002220 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -08002221 cricket::VideoChannel* channel = new cricket::VideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08002222 worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
deadbeefac22f702017-01-12 21:59:29 -08002223 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002224 if (!channel->NeedsRtcpTransport()) {
2225 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002226 }
deadbeeff5346592017-01-24 21:51:21 -08002227 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2228 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229 delete channel;
2230 channel = NULL;
2231 }
2232 return channel;
2233}
2234
2235// override to add 0 parameter
2236template<>
2237bool ChannelTest<VideoTraits>::AddStream1(int id) {
2238 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2239}
2240
2241template<>
2242void ChannelTest<VideoTraits>::CreateContent(
2243 int flags,
2244 const cricket::AudioCodec& audio_codec,
2245 const cricket::VideoCodec& video_codec,
2246 cricket::VideoContentDescription* video) {
2247 video->AddCodec(video_codec);
2248 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2249 if (flags & SECURE) {
2250 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002251 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2252 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 }
2254}
2255
2256template<>
2257void ChannelTest<VideoTraits>::CopyContent(
2258 const cricket::VideoContentDescription& source,
2259 cricket::VideoContentDescription* video) {
2260 *video = source;
2261}
2262
2263template<>
2264bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2265 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002266 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267}
2268
Peter Boström0c4e06b2015-10-07 12:23:21 +02002269template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002271 uint32_t ssrc,
2272 int flags,
2273 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002274 video->AddLegacyStream(ssrc);
2275}
2276
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002277class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 public:
solenberg1dd98f32015-09-10 01:57:14 -07002279 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280 VideoChannelSingleThreadTest()
2281 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282};
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2285 public:
2286 typedef ChannelTest<VideoTraits> Base;
2287 VideoChannelDoubleThreadTest()
2288 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2289};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002291TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292 Base::TestInit();
2293 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2294 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2295}
2296
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002297TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2298 Base::TestDeinit();
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::TestSetContents();
2303}
2304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::TestSetContentsNullOffer();
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 Base::TestSetContentsRtcpMux();
2311}
2312
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002313TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 Base::TestSetContentsRtcpMux();
2315}
2316
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002317TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 Base::TestSetRemoteContentUpdate();
2319}
2320
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002321TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 Base::TestStreams();
2323}
2324
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 Base::TestUpdateStreamsInLocalContent();
2327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 Base::TestUpdateStreamsInRemoteContent();
2331}
2332
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002333TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 Base::TestChangeStreamParamsInContent();
2335}
2336
jbauch5869f502017-06-29 12:31:36 -07002337TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2338 TestChangeEncryptedHeaderExtensionsDtls) {
2339 int flags = DTLS;
2340 Base::TestChangeEncryptedHeaderExtensions(flags);
2341}
2342
2343TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2344 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2345 int flags = DTLS;
2346 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2347}
2348
2349TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2350 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2351 int flags = DTLS;
2352 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2353}
2354
2355TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2356 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2357 int flags = DTLS | GCM_CIPHER;
2358 Base::TestChangeEncryptedHeaderExtensions(flags);
2359}
2360
2361TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2362 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2363 int flags = DTLS | GCM_CIPHER;
2364 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2365}
2366
2367TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2368 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2369 int flags = DTLS | GCM_CIPHER;
2370 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2371}
2372
2373TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2374 TestChangeEncryptedHeaderExtensionsSDES) {
2375 int flags = 0;
2376 Base::TestChangeEncryptedHeaderExtensions(flags);
2377}
2378
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002379TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380 Base::TestPlayoutAndSendingStates();
2381}
2382
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002383TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002384 CreateChannels(0, 0);
2385 // Test that we can Mute the default channel even though the sending SSRC
2386 // is unknown.
2387 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002388 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002389 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2390 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002391 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2392
2393 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002394 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002395
2396 SendInitiate();
2397 // After the local session description has been set, we can mute a stream
2398 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002399 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002400 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2401 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002402 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403}
2404
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002405TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 Base::TestMediaContentDirection();
2407}
2408
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002409TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002410 Base::TestNetworkRouteChanges();
2411}
2412
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 Base::TestCallSetup();
2415}
2416
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002417TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 Base::TestCallTeardownRtcpMux();
2419}
2420
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002421TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422 Base::SendRtpToRtp();
2423}
2424
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 Base::SendRtcpToRtcp();
2427}
2428
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430 Base::SendRtcpMuxToRtcp();
2431}
2432
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 Base::SendRtcpMuxToRtcpMux();
2435}
2436
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002438 Base::SendRequireRtcpMuxToRtcpMux();
2439}
2440
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002442 Base::SendRtcpMuxToRequireRtcpMux();
2443}
2444
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002446 Base::SendRequireRtcpMuxToRequireRtcpMux();
2447}
2448
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002450 Base::SendRequireRtcpMuxToNoRtcpMux();
2451}
2452
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002454 Base::SendEarlyRtcpMuxToRtcp();
2455}
2456
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 Base::SendEarlyRtcpMuxToRtcpMux();
2459}
2460
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2463}
2464
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466 Base::SendSrtpToSrtp();
2467}
2468
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2471}
2472
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002473TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 Base::SendSrtpToSrtp(DTLS, 0);
2475}
2476
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002477TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 Base::SendSrtpToSrtp(DTLS, DTLS);
2479}
2480
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002481TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2483}
2484
deadbeeff5346592017-01-24 21:51:21 -08002485// Test using the channel with a raw packet interface, as opposed to a DTLS
2486// transport interface.
2487TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2488 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2489}
2490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002491TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2493}
2494
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002495TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 Base::SendRtpToRtpOnThread();
2497}
2498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002499TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::SendSrtpToSrtpOnThread();
2501}
2502
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002503TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::SendWithWritabilityLoss();
2505}
2506
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002507TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 Base::TestMediaMonitor();
2509}
2510
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002512TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513 CreateChannels(0, 0);
2514 EXPECT_TRUE(SendInitiate());
2515 EXPECT_TRUE(SendAccept());
2516 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2517
solenberg1d63dd02015-12-02 12:35:09 -08002518 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2519 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2520 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002522 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002524 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002525 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002526 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002527 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002528 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529}
2530
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002531TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 Base::TestSetContentFailure();
2533}
2534
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002535TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 Base::TestSendTwoOffers();
2537}
2538
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002539TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 Base::TestReceiveTwoOffers();
2541}
2542
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002543TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 Base::TestSendPrAnswer();
2545}
2546
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002547TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 Base::TestReceivePrAnswer();
2549}
2550
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002551TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 Base::TestFlushRtcp();
2553}
2554
zstein56162b92017-04-24 16:54:35 -07002555TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2556 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557}
2558
zstein56162b92017-04-24 16:54:35 -07002559TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2560 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561}
2562
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002563// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002564TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002565 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566 EXPECT_TRUE(SendInitiate());
2567 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002568 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569
solenberg4bac9c52015-10-09 02:32:53 -07002570 // Default is (1.0).
2571 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2572 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002574 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575
solenberg4bac9c52015-10-09 02:32:53 -07002576 // Set scale to (1.5).
2577 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2578 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2579 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580
solenberg4bac9c52015-10-09 02:32:53 -07002581 // Set scale to (0).
2582 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2583 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2584 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585}
2586
2587// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002588TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002589 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002590 EXPECT_TRUE(SendInitiate());
2591 EXPECT_TRUE(SendAccept());
2592 EXPECT_TRUE(AddStream1(1));
2593 EXPECT_TRUE(AddStream1(2));
2594
solenberg4bac9c52015-10-09 02:32:53 -07002595 double volume;
2596 // Default is (1.0).
2597 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2598 EXPECT_DOUBLE_EQ(1.0, volume);
2599 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2600 EXPECT_DOUBLE_EQ(1.0, volume);
2601 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2602 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002604 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605
solenberg4bac9c52015-10-09 02:32:53 -07002606 // Set scale to (1.5) for ssrc = 1.
2607 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2608 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2609 EXPECT_DOUBLE_EQ(1.5, volume);
2610 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2611 EXPECT_DOUBLE_EQ(1.0, volume);
2612 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2613 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614
solenberg4bac9c52015-10-09 02:32:53 -07002615 // Set scale to (0) for all ssrcs.
2616 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2617 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2618 EXPECT_DOUBLE_EQ(0.0, volume);
2619 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2620 EXPECT_DOUBLE_EQ(0.0, volume);
2621 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2622 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623}
2624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002625TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002626 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627}
2628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002629TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002630 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002631}
2632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002633TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002634 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002635}
2636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002637TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002638 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639}
2640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002641TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002642 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002643}
2644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002645TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002646 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002647}
2648
Steve Anton8a63f782017-10-23 13:08:53 -07002649TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2650 Base::SocketOptionsMergedOnSetTransport();
2651}
2652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002653// VoiceChannelDoubleThreadTest
2654TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002656 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2657 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658}
2659
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002660TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2661 Base::TestDeinit();
2662}
2663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002664TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 Base::TestSetContents();
2666}
2667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002668TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 Base::TestSetContentsNullOffer();
2670}
2671
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002672TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 Base::TestSetContentsRtcpMux();
2674}
2675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002676TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 Base::TestSetContentsRtcpMux();
2678}
2679
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002680TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 Base::TestSetRemoteContentUpdate();
2682}
2683
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002684TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 Base::TestStreams();
2686}
2687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002688TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 Base::TestUpdateStreamsInLocalContent();
2690}
2691
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002692TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 Base::TestUpdateStreamsInRemoteContent();
2694}
2695
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002696TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697 Base::TestChangeStreamParamsInContent();
2698}
2699
jbauch5869f502017-06-29 12:31:36 -07002700TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2701 TestChangeEncryptedHeaderExtensionsDtls) {
2702 int flags = DTLS;
2703 Base::TestChangeEncryptedHeaderExtensions(flags);
2704}
2705
2706TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2707 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2708 int flags = DTLS;
2709 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2710}
2711
2712TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2713 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2714 int flags = DTLS;
2715 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2716}
2717
2718TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2719 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2720 int flags = DTLS | GCM_CIPHER;
2721 Base::TestChangeEncryptedHeaderExtensions(flags);
2722}
2723
2724TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2725 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2726 int flags = DTLS | GCM_CIPHER;
2727 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2728}
2729
2730TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2731 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2732 int flags = DTLS | GCM_CIPHER;
2733 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2734}
2735
2736TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2737 TestChangeEncryptedHeaderExtensionsSDES) {
2738 int flags = 0;
2739 Base::TestChangeEncryptedHeaderExtensions(flags);
2740}
2741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002742TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743 Base::TestPlayoutAndSendingStates();
2744}
2745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002746TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2747 CreateChannels(0, 0);
2748 // Test that we can Mute the default channel even though the sending SSRC
2749 // is unknown.
2750 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2751 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2752 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2753 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2754 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2755
2756 // Test that we can not mute an unknown SSRC.
2757 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2758
2759 SendInitiate();
2760 // After the local session description has been set, we can mute a stream
2761 // with its SSRC.
2762 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2763 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2764 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2765 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2766}
2767
2768TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2769 Base::TestMediaContentDirection();
2770}
2771
2772TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2773 Base::TestNetworkRouteChanges();
2774}
2775
2776TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2777 Base::TestCallSetup();
2778}
2779
2780TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2781 Base::TestCallTeardownRtcpMux();
2782}
2783
2784TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2785 Base::SendRtpToRtp();
2786}
2787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002788TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2789 Base::SendRtcpToRtcp();
2790}
2791
2792TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2793 Base::SendRtcpMuxToRtcp();
2794}
2795
2796TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2797 Base::SendRtcpMuxToRtcpMux();
2798}
2799
2800TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2801 Base::SendRequireRtcpMuxToRtcpMux();
2802}
2803
2804TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2805 Base::SendRtcpMuxToRequireRtcpMux();
2806}
2807
2808TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2809 Base::SendRequireRtcpMuxToRequireRtcpMux();
2810}
2811
2812TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2813 Base::SendRequireRtcpMuxToNoRtcpMux();
2814}
2815
2816TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2817 Base::SendEarlyRtcpMuxToRtcp();
2818}
2819
2820TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2821 Base::SendEarlyRtcpMuxToRtcpMux();
2822}
2823
2824TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2825 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2826}
2827
2828TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2829 Base::SendSrtpToSrtp();
2830}
2831
2832TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2833 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2834}
2835
2836TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002837 Base::SendSrtpToSrtp(DTLS, 0);
2838}
2839
2840TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002841 Base::SendSrtpToSrtp(DTLS, DTLS);
2842}
2843
2844TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002845 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2846}
2847
deadbeeff5346592017-01-24 21:51:21 -08002848// Test using the channel with a raw packet interface, as opposed to a DTLS
2849// transport interface.
2850TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2851 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2852}
2853
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002854TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2855 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2856}
2857
2858TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2859 Base::SendRtpToRtpOnThread();
2860}
2861
2862TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2863 Base::SendSrtpToSrtpOnThread();
2864}
2865
2866TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2867 Base::SendWithWritabilityLoss();
2868}
2869
2870TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2871 Base::TestMediaMonitor();
2872}
2873
2874// Test that InsertDtmf properly forwards to the media channel.
2875TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2876 CreateChannels(0, 0);
2877 EXPECT_TRUE(SendInitiate());
2878 EXPECT_TRUE(SendAccept());
2879 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2880
2881 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2882 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2883 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2884
2885 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2886 EXPECT_TRUE(
2887 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2888 EXPECT_TRUE(
2889 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2890 EXPECT_TRUE(
2891 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2892}
2893
2894TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2895 Base::TestSetContentFailure();
2896}
2897
2898TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2899 Base::TestSendTwoOffers();
2900}
2901
2902TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2903 Base::TestReceiveTwoOffers();
2904}
2905
2906TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2907 Base::TestSendPrAnswer();
2908}
2909
2910TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2911 Base::TestReceivePrAnswer();
2912}
2913
2914TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2915 Base::TestFlushRtcp();
2916}
2917
zstein56162b92017-04-24 16:54:35 -07002918TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2919 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002920}
2921
zstein56162b92017-04-24 16:54:35 -07002922TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2923 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002924}
2925
2926// Test that we can scale the output volume properly for 1:1 calls.
2927TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002928 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002929 EXPECT_TRUE(SendInitiate());
2930 EXPECT_TRUE(SendAccept());
2931 double volume;
2932
2933 // Default is (1.0).
2934 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2935 EXPECT_DOUBLE_EQ(1.0, volume);
2936 // invalid ssrc.
2937 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2938
2939 // Set scale to (1.5).
2940 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2941 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2942 EXPECT_DOUBLE_EQ(1.5, volume);
2943
2944 // Set scale to (0).
2945 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2946 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2947 EXPECT_DOUBLE_EQ(0.0, volume);
2948}
2949
2950// Test that we can scale the output volume properly for multiway calls.
2951TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002952 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002953 EXPECT_TRUE(SendInitiate());
2954 EXPECT_TRUE(SendAccept());
2955 EXPECT_TRUE(AddStream1(1));
2956 EXPECT_TRUE(AddStream1(2));
2957
2958 double volume;
2959 // Default is (1.0).
2960 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2961 EXPECT_DOUBLE_EQ(1.0, volume);
2962 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2963 EXPECT_DOUBLE_EQ(1.0, volume);
2964 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2965 EXPECT_DOUBLE_EQ(1.0, volume);
2966 // invalid ssrc.
2967 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2968
2969 // Set scale to (1.5) for ssrc = 1.
2970 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2971 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2972 EXPECT_DOUBLE_EQ(1.5, volume);
2973 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2974 EXPECT_DOUBLE_EQ(1.0, volume);
2975 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2976 EXPECT_DOUBLE_EQ(1.0, volume);
2977
2978 // Set scale to (0) for all ssrcs.
2979 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2980 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2981 EXPECT_DOUBLE_EQ(0.0, volume);
2982 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2983 EXPECT_DOUBLE_EQ(0.0, volume);
2984 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2985 EXPECT_DOUBLE_EQ(0.0, volume);
2986}
2987
2988TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2989 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2990}
2991
2992TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2993 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2994}
2995
2996TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2997 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2998}
2999
3000TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3001 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
3002}
3003
3004TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3005 Base::DefaultMaxBitrateIsUnlimited();
3006}
3007
3008TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
3009 Base::CanChangeMaxBitrate();
3010}
3011
Steve Anton8a63f782017-10-23 13:08:53 -07003012TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3013 Base::SocketOptionsMergedOnSetTransport();
3014}
3015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003016// VideoChannelSingleThreadTest
3017TEST_F(VideoChannelSingleThreadTest, TestInit) {
3018 Base::TestInit();
3019}
3020
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003021TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
3022 Base::TestDeinit();
3023}
3024
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003025TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
3026 Base::TestSetContents();
3027}
3028
3029TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3030 Base::TestSetContentsNullOffer();
3031}
3032
3033TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3034 Base::TestSetContentsRtcpMux();
3035}
3036
3037TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3038 Base::TestSetContentsRtcpMux();
3039}
3040
3041TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3042 Base::TestSetRemoteContentUpdate();
3043}
3044
3045TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3046 Base::TestStreams();
3047}
3048
3049TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3050 Base::TestUpdateStreamsInLocalContent();
3051}
3052
3053TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3054 Base::TestUpdateStreamsInRemoteContent();
3055}
3056
3057TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3058 Base::TestChangeStreamParamsInContent();
3059}
3060
3061TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3062 Base::TestPlayoutAndSendingStates();
3063}
3064
3065TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003066 CreateChannels(0, 0);
3067 // Test that we can Mute the default channel even though the sending SSRC
3068 // is unknown.
3069 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003070 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003071 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003072 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003073 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3074 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003075 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003076 SendInitiate();
3077 // After the local session description has been set, we can mute a stream
3078 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003079 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003080 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003081 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003082 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003083}
3084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003085TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086 Base::TestMediaContentDirection();
3087}
3088
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003089TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003090 Base::TestNetworkRouteChanges();
3091}
3092
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003093TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094 Base::TestCallSetup();
3095}
3096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003097TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003098 Base::TestCallTeardownRtcpMux();
3099}
3100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003101TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003102 Base::SendRtpToRtp();
3103}
3104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003105TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106 Base::SendRtcpToRtcp();
3107}
3108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003109TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110 Base::SendRtcpMuxToRtcp();
3111}
3112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003113TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114 Base::SendRtcpMuxToRtcpMux();
3115}
3116
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003117TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003118 Base::SendRequireRtcpMuxToRtcpMux();
3119}
3120
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003121TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003122 Base::SendRtcpMuxToRequireRtcpMux();
3123}
3124
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003125TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003126 Base::SendRequireRtcpMuxToRequireRtcpMux();
3127}
3128
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003129TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003130 Base::SendRequireRtcpMuxToNoRtcpMux();
3131}
3132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003133TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003134 Base::SendEarlyRtcpMuxToRtcp();
3135}
3136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003137TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003138 Base::SendEarlyRtcpMuxToRtcpMux();
3139}
3140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003141TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003142 Base::SendSrtpToSrtp();
3143}
3144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003145TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003146 Base::SendSrtpToSrtp();
3147}
3148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003149TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003150 Base::SendSrtpToSrtp(DTLS, 0);
3151}
3152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003153TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003154 Base::SendSrtpToSrtp(DTLS, DTLS);
3155}
3156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003157TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003158 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3159}
3160
deadbeeff5346592017-01-24 21:51:21 -08003161// Test using the channel with a raw packet interface, as opposed to a DTLS
3162// transport interface.
3163TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3164 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3165}
3166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003167TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003168 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3169}
3170
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003171TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003172 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3173}
3174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003175TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003176 Base::SendRtpToRtpOnThread();
3177}
3178
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003179TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003180 Base::SendSrtpToSrtpOnThread();
3181}
3182
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003183TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 Base::SendWithWritabilityLoss();
3185}
3186
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003187TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003188 Base::TestMediaMonitor();
3189}
3190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003191TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003192 Base::TestSetContentFailure();
3193}
3194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003195TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003196 Base::TestSendTwoOffers();
3197}
3198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003199TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003200 Base::TestReceiveTwoOffers();
3201}
3202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003203TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003204 Base::TestSendPrAnswer();
3205}
3206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003207TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003208 Base::TestReceivePrAnswer();
3209}
3210
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003211TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003212 Base::TestFlushRtcp();
3213}
3214
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003215TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003216 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003217}
3218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003219TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003220 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003221}
3222
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003223TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003224 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003225}
3226
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003227TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003228 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003229}
3230
zstein56162b92017-04-24 16:54:35 -07003231TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3232 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003233}
3234
zstein56162b92017-04-24 16:54:35 -07003235TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3236 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003237}
3238
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003239TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003240 Base::DefaultMaxBitrateIsUnlimited();
3241}
3242
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003243TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003244 Base::CanChangeMaxBitrate();
3245}
3246
Steve Anton8a63f782017-10-23 13:08:53 -07003247TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3248 Base::SocketOptionsMergedOnSetTransport();
3249}
3250
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003251// VideoChannelDoubleThreadTest
3252TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3253 Base::TestInit();
3254}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003255
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003256TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3257 Base::TestDeinit();
3258}
3259
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003260TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3261 Base::TestSetContents();
3262}
3263
3264TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3265 Base::TestSetContentsNullOffer();
3266}
3267
3268TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3269 Base::TestSetContentsRtcpMux();
3270}
3271
3272TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3273 Base::TestSetContentsRtcpMux();
3274}
3275
3276TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3277 Base::TestSetRemoteContentUpdate();
3278}
3279
3280TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3281 Base::TestStreams();
3282}
3283
3284TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3285 Base::TestUpdateStreamsInLocalContent();
3286}
3287
3288TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3289 Base::TestUpdateStreamsInRemoteContent();
3290}
3291
3292TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3293 Base::TestChangeStreamParamsInContent();
3294}
3295
3296TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3297 Base::TestPlayoutAndSendingStates();
3298}
3299
3300TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3301 CreateChannels(0, 0);
3302 // Test that we can Mute the default channel even though the sending SSRC
3303 // is unknown.
3304 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003305 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003306 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003307 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003308 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3309 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003310 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003311 SendInitiate();
3312 // After the local session description has been set, we can mute a stream
3313 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003314 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003315 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003316 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003317 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3318}
3319
3320TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3321 Base::TestMediaContentDirection();
3322}
3323
3324TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3325 Base::TestNetworkRouteChanges();
3326}
3327
3328TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3329 Base::TestCallSetup();
3330}
3331
3332TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3333 Base::TestCallTeardownRtcpMux();
3334}
3335
3336TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3337 Base::SendRtpToRtp();
3338}
3339
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003340TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3341 Base::SendRtcpToRtcp();
3342}
3343
3344TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3345 Base::SendRtcpMuxToRtcp();
3346}
3347
3348TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3349 Base::SendRtcpMuxToRtcpMux();
3350}
3351
3352TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3353 Base::SendRequireRtcpMuxToRtcpMux();
3354}
3355
3356TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3357 Base::SendRtcpMuxToRequireRtcpMux();
3358}
3359
3360TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3361 Base::SendRequireRtcpMuxToRequireRtcpMux();
3362}
3363
3364TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3365 Base::SendRequireRtcpMuxToNoRtcpMux();
3366}
3367
3368TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3369 Base::SendEarlyRtcpMuxToRtcp();
3370}
3371
3372TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3373 Base::SendEarlyRtcpMuxToRtcpMux();
3374}
3375
3376TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3377 Base::SendSrtpToSrtp();
3378}
3379
3380TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3381 Base::SendSrtpToSrtp();
3382}
3383
3384TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003385 Base::SendSrtpToSrtp(DTLS, 0);
3386}
3387
3388TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003389 Base::SendSrtpToSrtp(DTLS, DTLS);
3390}
3391
3392TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003393 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3394}
3395
deadbeeff5346592017-01-24 21:51:21 -08003396// Test using the channel with a raw packet interface, as opposed to a DTLS
3397// transport interface.
3398TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3399 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3400}
3401
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003402TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3403 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3404}
3405
3406TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3407 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3408}
3409
3410TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3411 Base::SendRtpToRtpOnThread();
3412}
3413
3414TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3415 Base::SendSrtpToSrtpOnThread();
3416}
3417
3418TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3419 Base::SendWithWritabilityLoss();
3420}
3421
3422TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3423 Base::TestMediaMonitor();
3424}
3425
3426TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3427 Base::TestSetContentFailure();
3428}
3429
3430TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3431 Base::TestSendTwoOffers();
3432}
3433
3434TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3435 Base::TestReceiveTwoOffers();
3436}
3437
3438TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3439 Base::TestSendPrAnswer();
3440}
3441
3442TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3443 Base::TestReceivePrAnswer();
3444}
3445
3446TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3447 Base::TestFlushRtcp();
3448}
3449
3450TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3451 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3452}
3453
3454TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3455 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3456}
3457
3458TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3459 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3460}
3461
3462TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3463 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3464}
3465
zstein56162b92017-04-24 16:54:35 -07003466TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3467 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003468}
3469
zstein56162b92017-04-24 16:54:35 -07003470TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3471 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003472}
3473
3474TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3475 Base::DefaultMaxBitrateIsUnlimited();
3476}
3477
3478TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3479 Base::CanChangeMaxBitrate();
3480}
3481
Steve Anton8a63f782017-10-23 13:08:53 -07003482TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3483 Base::SocketOptionsMergedOnSetTransport();
3484}
3485
deadbeef953c2ce2017-01-09 14:53:41 -08003486// RtpDataChannelSingleThreadTest
3487class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003488 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003489 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003490 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003491 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3492};
3493
deadbeef953c2ce2017-01-09 14:53:41 -08003494// RtpDataChannelDoubleThreadTest
3495class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003496 public:
3497 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003498 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003499 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003500};
3501
3502// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003503template <>
deadbeef953c2ce2017-01-09 14:53:41 -08003504cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003505 rtc::Thread* worker_thread,
3506 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003507 cricket::MediaEngineInterface* engine,
3508 cricket::FakeDataMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08003509 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3510 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003511 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3512 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003513 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003514 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef953c2ce2017-01-09 14:53:41 -08003515 cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08003516 worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
deadbeefac22f702017-01-12 21:59:29 -08003517 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003518 if (!channel->NeedsRtcpTransport()) {
3519 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003520 }
deadbeeff5346592017-01-24 21:51:21 -08003521 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3522 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003523 delete channel;
3524 channel = NULL;
3525 }
3526 return channel;
3527}
3528
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003529template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003530void ChannelTest<DataTraits>::CreateContent(
3531 int flags,
3532 const cricket::AudioCodec& audio_codec,
3533 const cricket::VideoCodec& video_codec,
3534 cricket::DataContentDescription* data) {
3535 data->AddCodec(kGoogleDataCodec);
3536 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3537 if (flags & SECURE) {
3538 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003539 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3540 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003541 }
3542}
3543
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003544template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003545void ChannelTest<DataTraits>::CopyContent(
3546 const cricket::DataContentDescription& source,
3547 cricket::DataContentDescription* data) {
3548 *data = source;
3549}
3550
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003551template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003552bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3553 const cricket::DataCodec& c2) {
3554 return c1.name == c2.name;
3555}
3556
Peter Boström0c4e06b2015-10-07 12:23:21 +02003557template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003558void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003559 uint32_t ssrc,
3560 int flags,
3561 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003562 data->AddLegacyStream(ssrc);
3563}
3564
deadbeef953c2ce2017-01-09 14:53:41 -08003565TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003566 Base::TestInit();
3567 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3568}
3569
deadbeef953c2ce2017-01-09 14:53:41 -08003570TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003571 Base::TestDeinit();
3572}
3573
deadbeef953c2ce2017-01-09 14:53:41 -08003574TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003575 Base::TestSetContents();
3576}
3577
deadbeef953c2ce2017-01-09 14:53:41 -08003578TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003579 Base::TestSetContentsNullOffer();
3580}
3581
deadbeef953c2ce2017-01-09 14:53:41 -08003582TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003583 Base::TestSetContentsRtcpMux();
3584}
3585
deadbeef953c2ce2017-01-09 14:53:41 -08003586TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003587 Base::TestSetRemoteContentUpdate();
3588}
3589
deadbeef953c2ce2017-01-09 14:53:41 -08003590TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003591 Base::TestStreams();
3592}
3593
deadbeef953c2ce2017-01-09 14:53:41 -08003594TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003595 Base::TestUpdateStreamsInLocalContent();
3596}
3597
deadbeef953c2ce2017-01-09 14:53:41 -08003598TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003599 Base::TestUpdateStreamsInRemoteContent();
3600}
3601
deadbeef953c2ce2017-01-09 14:53:41 -08003602TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003603 Base::TestChangeStreamParamsInContent();
3604}
3605
deadbeef953c2ce2017-01-09 14:53:41 -08003606TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003607 Base::TestPlayoutAndSendingStates();
3608}
3609
deadbeef953c2ce2017-01-09 14:53:41 -08003610TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003611 Base::TestMediaContentDirection();
3612}
3613
deadbeef953c2ce2017-01-09 14:53:41 -08003614TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003615 Base::TestCallSetup();
3616}
3617
deadbeef953c2ce2017-01-09 14:53:41 -08003618TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003619 Base::TestCallTeardownRtcpMux();
3620}
3621
zstein56162b92017-04-24 16:54:35 -07003622TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3623 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003624}
3625
zstein56162b92017-04-24 16:54:35 -07003626TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3627 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003628}
3629
deadbeef953c2ce2017-01-09 14:53:41 -08003630TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003631 Base::SendRtpToRtp();
3632}
3633
deadbeef953c2ce2017-01-09 14:53:41 -08003634TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003635 Base::SendRtcpToRtcp();
3636}
3637
deadbeef953c2ce2017-01-09 14:53:41 -08003638TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003639 Base::SendRtcpMuxToRtcp();
3640}
3641
deadbeef953c2ce2017-01-09 14:53:41 -08003642TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003643 Base::SendRtcpMuxToRtcpMux();
3644}
3645
deadbeef953c2ce2017-01-09 14:53:41 -08003646TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003647 Base::SendEarlyRtcpMuxToRtcp();
3648}
3649
deadbeef953c2ce2017-01-09 14:53:41 -08003650TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003651 Base::SendEarlyRtcpMuxToRtcpMux();
3652}
3653
deadbeef953c2ce2017-01-09 14:53:41 -08003654TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003655 Base::SendSrtpToSrtp();
3656}
3657
deadbeef953c2ce2017-01-09 14:53:41 -08003658TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003659 Base::SendSrtpToSrtp();
3660}
3661
deadbeef953c2ce2017-01-09 14:53:41 -08003662TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003663 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3664}
3665
deadbeef953c2ce2017-01-09 14:53:41 -08003666TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003667 Base::SendRtpToRtpOnThread();
3668}
3669
deadbeef953c2ce2017-01-09 14:53:41 -08003670TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003671 Base::SendSrtpToSrtpOnThread();
3672}
3673
deadbeef953c2ce2017-01-09 14:53:41 -08003674TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003675 Base::SendWithWritabilityLoss();
3676}
3677
deadbeef953c2ce2017-01-09 14:53:41 -08003678TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003679 Base::TestMediaMonitor();
3680}
3681
Steve Anton8a63f782017-10-23 13:08:53 -07003682TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3683 Base::SocketOptionsMergedOnSetTransport();
3684}
3685
deadbeef953c2ce2017-01-09 14:53:41 -08003686TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003687 CreateChannels(0, 0);
3688 EXPECT_TRUE(SendInitiate());
3689 EXPECT_TRUE(SendAccept());
3690
3691 cricket::SendDataParams params;
3692 params.ssrc = 42;
3693 unsigned char data[] = {'f', 'o', 'o'};
3694 rtc::CopyOnWriteBuffer payload(data, 3);
3695 cricket::SendDataResult result;
3696 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3697 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3698 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3699}
3700
deadbeef953c2ce2017-01-09 14:53:41 -08003701TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003702 Base::TestInit();
3703 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3704}
3705
deadbeef953c2ce2017-01-09 14:53:41 -08003706TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003707 Base::TestDeinit();
3708}
3709
deadbeef953c2ce2017-01-09 14:53:41 -08003710TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003711 Base::TestSetContents();
3712}
3713
deadbeef953c2ce2017-01-09 14:53:41 -08003714TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003715 Base::TestSetContentsNullOffer();
3716}
3717
deadbeef953c2ce2017-01-09 14:53:41 -08003718TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003719 Base::TestSetContentsRtcpMux();
3720}
3721
deadbeef953c2ce2017-01-09 14:53:41 -08003722TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003723 Base::TestSetRemoteContentUpdate();
3724}
3725
deadbeef953c2ce2017-01-09 14:53:41 -08003726TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003727 Base::TestStreams();
3728}
3729
deadbeef953c2ce2017-01-09 14:53:41 -08003730TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003731 Base::TestUpdateStreamsInLocalContent();
3732}
3733
deadbeef953c2ce2017-01-09 14:53:41 -08003734TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003735 Base::TestUpdateStreamsInRemoteContent();
3736}
3737
deadbeef953c2ce2017-01-09 14:53:41 -08003738TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003739 Base::TestChangeStreamParamsInContent();
3740}
3741
deadbeef953c2ce2017-01-09 14:53:41 -08003742TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003743 Base::TestPlayoutAndSendingStates();
3744}
3745
deadbeef953c2ce2017-01-09 14:53:41 -08003746TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003747 Base::TestMediaContentDirection();
3748}
3749
deadbeef953c2ce2017-01-09 14:53:41 -08003750TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003751 Base::TestCallSetup();
3752}
3753
deadbeef953c2ce2017-01-09 14:53:41 -08003754TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003755 Base::TestCallTeardownRtcpMux();
3756}
3757
zstein56162b92017-04-24 16:54:35 -07003758TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3759 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003760}
3761
zstein56162b92017-04-24 16:54:35 -07003762TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3763 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003764}
3765
deadbeef953c2ce2017-01-09 14:53:41 -08003766TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003767 Base::SendRtpToRtp();
3768}
3769
deadbeef953c2ce2017-01-09 14:53:41 -08003770TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003771 Base::SendRtcpToRtcp();
3772}
3773
deadbeef953c2ce2017-01-09 14:53:41 -08003774TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003775 Base::SendRtcpMuxToRtcp();
3776}
3777
deadbeef953c2ce2017-01-09 14:53:41 -08003778TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003779 Base::SendRtcpMuxToRtcpMux();
3780}
3781
deadbeef953c2ce2017-01-09 14:53:41 -08003782TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003783 Base::SendEarlyRtcpMuxToRtcp();
3784}
3785
deadbeef953c2ce2017-01-09 14:53:41 -08003786TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003787 Base::SendEarlyRtcpMuxToRtcpMux();
3788}
3789
deadbeef953c2ce2017-01-09 14:53:41 -08003790TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003791 Base::SendSrtpToSrtp();
3792}
3793
deadbeef953c2ce2017-01-09 14:53:41 -08003794TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003795 Base::SendSrtpToSrtp();
3796}
3797
deadbeef953c2ce2017-01-09 14:53:41 -08003798TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003799 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3800}
3801
deadbeef953c2ce2017-01-09 14:53:41 -08003802TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003803 Base::SendRtpToRtpOnThread();
3804}
3805
deadbeef953c2ce2017-01-09 14:53:41 -08003806TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003807 Base::SendSrtpToSrtpOnThread();
3808}
3809
deadbeef953c2ce2017-01-09 14:53:41 -08003810TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003811 Base::SendWithWritabilityLoss();
3812}
3813
deadbeef953c2ce2017-01-09 14:53:41 -08003814TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003815 Base::TestMediaMonitor();
3816}
3817
Steve Anton8a63f782017-10-23 13:08:53 -07003818TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3819 Base::SocketOptionsMergedOnSetTransport();
3820}
3821
deadbeef953c2ce2017-01-09 14:53:41 -08003822TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003823 CreateChannels(0, 0);
3824 EXPECT_TRUE(SendInitiate());
3825 EXPECT_TRUE(SendAccept());
3826
3827 cricket::SendDataParams params;
3828 params.ssrc = 42;
3829 unsigned char data[] = {
3830 'f', 'o', 'o'
3831 };
jbaucheec21bd2016-03-20 06:15:43 -07003832 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003833 cricket::SendDataResult result;
3834 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3835 EXPECT_EQ(params.ssrc,
3836 media_channel1_->last_sent_data_params().ssrc);
3837 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3838}
3839
deadbeefbad5dad2017-01-17 18:32:35 -08003840#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3841
3842// Verifies some DCHECKs are in place.
3843// Uses VoiceChannel, but any BaseChannel subclass would work.
3844class BaseChannelDeathTest : public testing::Test {
3845 public:
3846 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003847 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3848 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3849 // RTCP mux not required, SRTP required.
deadbeefbad5dad2017-01-17 18:32:35 -08003850 voice_channel_(
3851 rtc::Thread::Current(),
3852 rtc::Thread::Current(),
3853 rtc::Thread::Current(),
3854 &fake_media_engine_,
3855 new cricket::FakeVoiceMediaChannel(nullptr,
3856 cricket::AudioOptions()),
3857 cricket::CN_AUDIO,
3858 false,
deadbeeff5346592017-01-24 21:51:21 -08003859 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003860
3861 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003862 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003863 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3864 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003865 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003866};
3867
deadbeeff5346592017-01-24 21:51:21 -08003868TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
3869 ASSERT_TRUE(voice_channel_.Init_w(
3870 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3871 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3872 cricket::FakeDtlsTransport new_rtcp_transport(
3873 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3874 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003875}
3876
deadbeeff5346592017-01-24 21:51:21 -08003877TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
3878 ASSERT_TRUE(voice_channel_.Init_w(
3879 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3880 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3881 cricket::FakeDtlsTransport new_rtp_transport(
3882 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3883 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003884}
3885
deadbeeff5346592017-01-24 21:51:21 -08003886TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
3887 ASSERT_TRUE(voice_channel_.Init_w(
3888 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3889 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
deadbeefbad5dad2017-01-17 18:32:35 -08003890 // Activate RTCP muxing, simulating offer/answer negotiation.
3891 cricket::AudioContentDescription content;
3892 content.set_rtcp_mux(true);
3893 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3894 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003895 cricket::FakeDtlsTransport new_rtp_transport(
3896 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3897 cricket::FakeDtlsTransport new_rtcp_transport(
3898 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003899 // After muxing is enabled, no RTCP transport should be passed in here.
3900 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003901 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3902 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003903}
3904
3905// This test will probably go away if/when we move the transport name out of
3906// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003907TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
3908 ASSERT_TRUE(voice_channel_.Init_w(
3909 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3910 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3911 cricket::FakeDtlsTransport new_rtp_transport(
3912 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3913 cricket::FakeDtlsTransport new_rtcp_transport(
3914 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003915 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003916 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3917 "");
3918}
3919
3920// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003921// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003922TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
3923 ASSERT_TRUE(voice_channel_.Init_w(
3924 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3925 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3926 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003927 voice_channel_.SetTransports(
3928 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3929 static_cast<rtc::PacketTransportInternal*>(
3930 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003931 "");
3932}
3933
deadbeef5bd5ca32017-02-10 11:31:50 -08003934// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003935// DtlsTransportInternal.
3936TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
3937 ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3938 &fake_rtcp_dtls_transport_));
3939 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3940 &fake_rtp_dtls_transport_),
3941 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003942}
3943
3944#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3945
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003946// TODO(pthatcher): TestSetReceiver?