blob: fa9d3da52005d3f3dfc1448e2faf4681806e1ec6 [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
kjellandera96e2d72016-02-04 23:52:28 -080013#include "webrtc/media/base/fakemediaengine.h"
14#include "webrtc/media/base/fakertp.h"
kjellandera96e2d72016-02-04 23:52:28 -080015#include "webrtc/media/base/mediachannel.h"
kjellandera96e2d72016-02-04 23:52:28 -080016#include "webrtc/media/base/testutils.h"
deadbeeff5346592017-01-24 21:51:21 -080017#include "webrtc/p2p/base/fakecandidatepair.h"
18#include "webrtc/p2p/base/fakedtlstransport.h"
19#include "webrtc/p2p/base/fakepackettransport.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010020#include "webrtc/pc/channel.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020021#include "webrtc/rtc_base/array_view.h"
22#include "webrtc/rtc_base/buffer.h"
23#include "webrtc/rtc_base/checks.h"
24#include "webrtc/rtc_base/fakeclock.h"
25#include "webrtc/rtc_base/gunit.h"
26#include "webrtc/rtc_base/logging.h"
27#include "webrtc/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
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 // Creates a cricket::SessionDescription with one MediaContent and one stream.
515 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200516 cricket::SessionDescription* CreateSessionDescriptionWithStream(
517 uint32_t ssrc) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 typename T::Content content;
519 cricket::SessionDescription* sdesc = new cricket::SessionDescription();
520 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content);
521 AddLegacyStreamInContent(ssrc, 0, &content);
522 sdesc->AddContent("DUMMY_CONTENT_NAME",
523 cricket::NS_JINGLE_RTP, content.Copy());
524 return sdesc;
525 }
526
ossu292d6582016-03-17 02:31:13 -0700527 // Will manage the lifetime of a CallThread, making sure it's
528 // destroyed before this object goes out of scope.
529 class ScopedCallThread {
530 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 template <class FunctorT>
532 ScopedCallThread(const FunctorT& functor)
533 : thread_(rtc::Thread::Create()),
534 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700535 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700536 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700537 }
538
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200539 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700540
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200541 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700542
543 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200544 std::unique_ptr<rtc::Thread> thread_;
545 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700546 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
549 return false; // overridden in specialized classes
550 }
551
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200552 void OnMediaMonitor1(typename T::Channel* channel,
553 const typename T::MediaInfo& info) {
554 RTC_DCHECK_EQ(channel, channel1_.get());
555 media_info_callbacks1_++;
556 }
557 void OnMediaMonitor2(typename T::Channel* channel,
558 const typename T::MediaInfo& info) {
559 RTC_DCHECK_EQ(channel, channel2_.get());
560 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 }
deadbeeff5346592017-01-24 21:51:21 -0800562 void OnRtcpMuxFullyActive1(const std::string&) {
563 rtcp_mux_activated_callbacks1_++;
564 }
565 void OnRtcpMuxFullyActive2(const std::string&) {
566 rtcp_mux_activated_callbacks2_++;
567 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568
Honghai Zhangcc411c02016-03-29 17:27:21 -0700569 cricket::CandidatePairInterface* last_selected_candidate_pair() {
570 return last_selected_candidate_pair_;
571 }
572
Peter Boström0c4e06b2015-10-07 12:23:21 +0200573 void AddLegacyStreamInContent(uint32_t ssrc,
574 int flags,
575 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 // Base implementation.
577 }
578
579 // Tests that can be used by derived classes.
580
581 // Basic sanity check.
582 void TestInit() {
583 CreateChannels(0, 0);
584 EXPECT_FALSE(channel1_->secure());
585 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200586 if (verify_playout_) {
587 EXPECT_FALSE(media_channel1_->playout());
588 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 EXPECT_TRUE(media_channel1_->codecs().empty());
590 EXPECT_TRUE(media_channel1_->recv_streams().empty());
591 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
592 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
593 }
594
595 // Test that SetLocalContent and SetRemoteContent properly configure
596 // the codecs.
597 void TestSetContents() {
598 CreateChannels(0, 0);
599 typename T::Content content;
600 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000601 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000603 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 ASSERT_EQ(1U, media_channel1_->codecs().size());
605 EXPECT_TRUE(CodecMatches(content.codecs()[0],
606 media_channel1_->codecs()[0]));
607 }
608
609 // Test that SetLocalContent and SetRemoteContent properly deals
610 // with an empty offer.
611 void TestSetContentsNullOffer() {
612 CreateChannels(0, 0);
613 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000614 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 CreateContent(0, kPcmuCodec, kH264Codec, &content);
616 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000617 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 ASSERT_EQ(1U, media_channel1_->codecs().size());
619 EXPECT_TRUE(CodecMatches(content.codecs()[0],
620 media_channel1_->codecs()[0]));
621 }
622
623 // Test that SetLocalContent and SetRemoteContent properly set RTCP
624 // mux.
625 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800626 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 typename T::Content content;
628 CreateContent(0, kPcmuCodec, kH264Codec, &content);
629 // Both sides agree on mux. Should no longer be a separate RTCP channel.
630 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000631 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
632 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000634 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000636 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 }
638
639 // Test that SetLocalContent and SetRemoteContent properly set RTCP
640 // mux when a provisional answer is received.
641 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800642 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 typename T::Content content;
644 CreateContent(0, kPcmuCodec, kH264Codec, &content);
645 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000646 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
647 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800648 // Both sides agree on mux. Should signal RTCP mux as fully activated.
649 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000650 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000653 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000655 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
656 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800657 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 }
659
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 // Test that SetRemoteContent properly deals with a content update.
661 void TestSetRemoteContentUpdate() {
662 CreateChannels(0, 0);
663 typename T::Content content;
deadbeefac22f702017-01-12 21:59:29 -0800664 CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000666 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
667 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 ASSERT_EQ(1U, media_channel1_->codecs().size());
669 EXPECT_TRUE(CodecMatches(content.codecs()[0],
670 media_channel1_->codecs()[0]));
671 // Now update with other codecs.
672 typename T::Content update_content;
673 update_content.set_partial(true);
674 CreateContent(0, kIsacCodec, kH264SvcCodec,
675 &update_content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000676 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 ASSERT_EQ(1U, media_channel1_->codecs().size());
678 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
679 media_channel1_->codecs()[0]));
680 // Now update without any codecs. This is ignored.
681 typename T::Content empty_content;
682 empty_content.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000683 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 ASSERT_EQ(1U, media_channel1_->codecs().size());
685 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
686 media_channel1_->codecs()[0]));
687 }
688
689 // Test that Add/RemoveStream properly forward to the media channel.
690 void TestStreams() {
691 CreateChannels(0, 0);
692 EXPECT_TRUE(AddStream1(1));
693 EXPECT_TRUE(AddStream1(2));
694 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
695 EXPECT_TRUE(RemoveStream1(2));
696 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
697 EXPECT_TRUE(RemoveStream1(1));
698 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
699 }
700
701 // Test that SetLocalContent properly handles adding and removing StreamParams
702 // to the local content description.
703 // This test uses the CA_UPDATE action that don't require a full
704 // MediaContentDescription to do an update.
705 void TestUpdateStreamsInLocalContent() {
706 cricket::StreamParams stream1;
707 stream1.groupid = "group1";
708 stream1.id = "stream1";
709 stream1.ssrcs.push_back(kSsrc1);
710 stream1.cname = "stream1_cname";
711
712 cricket::StreamParams stream2;
713 stream2.groupid = "group2";
714 stream2.id = "stream2";
715 stream2.ssrcs.push_back(kSsrc2);
716 stream2.cname = "stream2_cname";
717
718 cricket::StreamParams stream3;
719 stream3.groupid = "group3";
720 stream3.id = "stream3";
721 stream3.ssrcs.push_back(kSsrc3);
722 stream3.cname = "stream3_cname";
723
724 CreateChannels(0, 0);
725 typename T::Content content1;
726 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
727 content1.AddStream(stream1);
728 EXPECT_EQ(0u, media_channel1_->send_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000729 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730
731 ASSERT_EQ(1u, media_channel1_->send_streams().size());
732 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
733
734 // Update the local streams by adding another sending stream.
735 // Use a partial updated session description.
736 typename T::Content content2;
737 content2.AddStream(stream2);
738 content2.AddStream(stream3);
739 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741 ASSERT_EQ(3u, media_channel1_->send_streams().size());
742 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
743 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
744 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
745
746 // Update the local streams by removing the first sending stream.
747 // This is done by removing all SSRCS for this particular stream.
748 typename T::Content content3;
749 stream1.ssrcs.clear();
750 content3.AddStream(stream1);
751 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000752 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 ASSERT_EQ(2u, media_channel1_->send_streams().size());
754 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
755 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
756
757 // Update the local streams with a stream that does not change.
758 // THe update is ignored.
759 typename T::Content content4;
760 content4.AddStream(stream2);
761 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 ASSERT_EQ(2u, media_channel1_->send_streams().size());
764 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
765 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
766 }
767
768 // Test that SetRemoteContent properly handles adding and removing
769 // StreamParams to the remote content description.
770 // This test uses the CA_UPDATE action that don't require a full
771 // MediaContentDescription to do an update.
772 void TestUpdateStreamsInRemoteContent() {
773 cricket::StreamParams stream1;
774 stream1.id = "Stream1";
775 stream1.groupid = "1";
776 stream1.ssrcs.push_back(kSsrc1);
777 stream1.cname = "stream1_cname";
778
779 cricket::StreamParams stream2;
780 stream2.id = "Stream2";
781 stream2.groupid = "2";
782 stream2.ssrcs.push_back(kSsrc2);
783 stream2.cname = "stream2_cname";
784
785 cricket::StreamParams stream3;
786 stream3.id = "Stream3";
787 stream3.groupid = "3";
788 stream3.ssrcs.push_back(kSsrc3);
789 stream3.cname = "stream3_cname";
790
791 CreateChannels(0, 0);
792 typename T::Content content1;
793 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
794 content1.AddStream(stream1);
795 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000796 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
798 ASSERT_EQ(1u, media_channel1_->codecs().size());
799 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
800 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
801
802 // Update the remote streams by adding another sending stream.
803 // Use a partial updated session description.
804 typename T::Content content2;
805 content2.AddStream(stream2);
806 content2.AddStream(stream3);
807 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000808 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 ASSERT_EQ(3u, media_channel1_->recv_streams().size());
810 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
811 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
812 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
813
814 // Update the remote streams by removing the first stream.
815 // This is done by removing all SSRCS for this particular stream.
816 typename T::Content content3;
817 stream1.ssrcs.clear();
818 content3.AddStream(stream1);
819 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000820 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
822 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
823 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
824
825 // Update the remote streams with a stream that does not change.
826 // The update is ignored.
827 typename T::Content content4;
828 content4.AddStream(stream2);
829 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000830 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
832 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
833 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
834 }
835
836 // Test that SetLocalContent and SetRemoteContent properly
837 // handles adding and removing StreamParams when the action is a full
838 // CA_OFFER / CA_ANSWER.
839 void TestChangeStreamParamsInContent() {
840 cricket::StreamParams stream1;
841 stream1.groupid = "group1";
842 stream1.id = "stream1";
843 stream1.ssrcs.push_back(kSsrc1);
844 stream1.cname = "stream1_cname";
845
846 cricket::StreamParams stream2;
847 stream2.groupid = "group1";
848 stream2.id = "stream2";
849 stream2.ssrcs.push_back(kSsrc2);
850 stream2.cname = "stream2_cname";
851
852 // Setup a call where channel 1 send |stream1| to channel 2.
853 CreateChannels(0, 0);
854 typename T::Content content1;
855 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
856 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000857 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858 EXPECT_TRUE(channel1_->Enable(true));
859 EXPECT_EQ(1u, media_channel1_->send_streams().size());
860
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000861 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800863 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864
865 // Channel 2 do not send anything.
866 typename T::Content content2;
867 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000868 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000870 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871 EXPECT_TRUE(channel2_->Enable(true));
872 EXPECT_EQ(0u, media_channel2_->send_streams().size());
873
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200874 SendCustomRtp1(kSsrc1, 0);
875 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
877
878 // Let channel 2 update the content by sending |stream2| and enable SRTP.
879 typename T::Content content3;
880 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
881 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000882 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883 ASSERT_EQ(1u, media_channel2_->send_streams().size());
884 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
885
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000886 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
888 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
889
890 // Channel 1 replies but stop sending stream1.
891 typename T::Content content4;
892 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000893 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000894 EXPECT_EQ(0u, media_channel1_->send_streams().size());
895
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000896 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
898
899 EXPECT_TRUE(channel1_->secure());
900 EXPECT_TRUE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 SendCustomRtp2(kSsrc2, 0);
902 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000903 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
904 }
905
jbauch5869f502017-06-29 12:31:36 -0700906 enum EncryptedHeaderTestScenario {
907 // Offer/Answer are processed before DTLS completes.
908 DEFAULT,
909 // DTLS completes before any Offer/Answer have been sent.
910 DTLS_BEFORE_OFFER_ANSWER,
911 // DTLS completes after channel 2 has processed (remote) Offer and (local)
912 // Answer.
913 DTLS_AFTER_CHANNEL2_READY,
914 };
915
916 // Test that encrypted header extensions are working and can be changed when
917 // sending a new OFFER/ANSWER.
918 void TestChangeEncryptedHeaderExtensions(int flags,
919 EncryptedHeaderTestScenario scenario = DEFAULT) {
920 RTC_CHECK(scenario == 0 || (flags & DTLS));
921 struct PacketListener : public sigslot::has_slots<> {
922 PacketListener() {}
923 void OnReadPacket(rtc::PacketTransportInternal* transport,
924 const char* data, size_t size, const rtc::PacketTime& time,
925 int flags) {
926 CompareHeaderExtensions(
927 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
928 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
929 false);
930 }
931 std::vector<int> encrypted_headers;
932 } packet_listener1, packet_listener2;
933
934 cricket::StreamParams stream1;
935 stream1.groupid = "group1";
936 stream1.id = "stream1";
937 stream1.ssrcs.push_back(kSsrc1);
938 stream1.cname = "stream1_cname";
939
940 cricket::StreamParams stream2;
941 stream2.groupid = "group1";
942 stream2.id = "stream2";
943 stream2.ssrcs.push_back(kSsrc2);
944 stream2.cname = "stream2_cname";
945
946 // Use SRTP when testing encrypted extensions.
947 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
948 // Enable SDES if channel is not using DTLS.
949 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
950
951 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
952 // Make sure to use URIs that are supported for encryption.
953 cricket::RtpHeaderExtensions extensions1;
954 extensions1.push_back(
955 RtpExtension(RtpExtension::kAudioLevelUri, 10));
956 extensions1.push_back(
957 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
958
959 cricket::RtpHeaderExtensions extensions2;
960 extensions2.push_back(
961 RtpExtension(RtpExtension::kAudioLevelUri, 10));
962 extensions2.push_back(
963 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
964 extensions2.push_back(
965 RtpExtension(RtpExtension::kVideoRotationUri, 3));
966 extensions2.push_back(
967 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
968
969 // Setup a call where channel 1 send |stream1| to channel 2.
970 CreateChannels(channel_flags, channel_flags);
971 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
972 &packet_listener1, &PacketListener::OnReadPacket);
973 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
974 &packet_listener2, &PacketListener::OnReadPacket);
975
976 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
977 ConnectFakeTransports();
978 WaitForThreads();
979 }
980
981 typename T::Content content1;
982 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
983 content1.AddStream(stream1);
984 content1.set_rtp_header_extensions(extensions1);
985 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
986 EXPECT_TRUE(channel1_->Enable(true));
987 EXPECT_EQ(1u, media_channel1_->send_streams().size());
988 packet_listener1.encrypted_headers.push_back(1);
989
990 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
991 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
992
993 // Channel 2 sends back |stream2|.
994 typename T::Content content2;
995 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
996 content2.AddStream(stream2);
997 content2.set_rtp_header_extensions(extensions1);
998 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
999 EXPECT_TRUE(channel2_->Enable(true));
1000 EXPECT_EQ(1u, media_channel2_->send_streams().size());
1001 packet_listener2.encrypted_headers.push_back(1);
1002
1003 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
1004 ConnectFakeTransports();
1005 WaitForThreads();
1006 }
1007
1008 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
1009 scenario == DTLS_AFTER_CHANNEL2_READY) {
1010 // In both scenarios with partially completed Offer/Answer, sending
1011 // packets from Channel 2 to Channel 1 should work.
1012 SendCustomRtp2(kSsrc2, 0);
1013 WaitForThreads();
1014 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1015 }
1016
1017 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
1018 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
1019
1020 if (scenario == DEFAULT) {
1021 ConnectFakeTransports();
1022 WaitForThreads();
1023 }
1024
1025 SendCustomRtp1(kSsrc1, 0);
1026 SendCustomRtp2(kSsrc2, 0);
1027 WaitForThreads();
1028 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1029 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1030
1031 // Let channel 2 update the encrypted header extensions.
1032 typename T::Content content3;
1033 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
1034 content3.AddStream(stream2);
1035 content3.set_rtp_header_extensions(extensions2);
1036 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
1037 ASSERT_EQ(1u, media_channel2_->send_streams().size());
1038 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
1039 packet_listener2.encrypted_headers.clear();
1040 packet_listener2.encrypted_headers.push_back(2);
1041 packet_listener2.encrypted_headers.push_back(4);
1042
1043 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
1044 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
1045 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
1046
1047 // Channel 1 is already sending the new encrypted extensions. These
1048 // can be decrypted by channel 2. Channel 2 is still sending the old
1049 // encrypted extensions (which can be decrypted by channel 1).
1050
1051 if (flags & DTLS) {
1052 // DTLS supports updating the encrypted extensions with only the OFFER
1053 // being processed. For SDES both the OFFER and ANSWER must have been
1054 // processed to update encrypted extensions, so we can't check this case.
1055 SendCustomRtp1(kSsrc1, 0);
1056 SendCustomRtp2(kSsrc2, 0);
1057 WaitForThreads();
1058 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1059 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1060 }
1061
1062 // Channel 1 replies with the same extensions.
1063 typename T::Content content4;
1064 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
1065 content4.AddStream(stream1);
1066 content4.set_rtp_header_extensions(extensions2);
1067 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
1068 EXPECT_EQ(1u, media_channel1_->send_streams().size());
1069 packet_listener1.encrypted_headers.clear();
1070 packet_listener1.encrypted_headers.push_back(2);
1071 packet_listener1.encrypted_headers.push_back(4);
1072
1073 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
1074 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
1075
1076 SendCustomRtp1(kSsrc1, 0);
1077 SendCustomRtp2(kSsrc2, 0);
1078 WaitForThreads();
1079 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1080 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1081 }
1082
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 // Test that we only start playout and sending at the right times.
1084 void TestPlayoutAndSendingStates() {
1085 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +02001086 if (verify_playout_) {
1087 EXPECT_FALSE(media_channel1_->playout());
1088 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001090 if (verify_playout_) {
1091 EXPECT_FALSE(media_channel2_->playout());
1092 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 EXPECT_FALSE(media_channel2_->sending());
1094 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001095 if (verify_playout_) {
1096 EXPECT_FALSE(media_channel1_->playout());
1097 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001099 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1100 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001101 if (verify_playout_) {
1102 EXPECT_TRUE(media_channel1_->playout());
1103 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001105 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
1106 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001107 if (verify_playout_) {
1108 EXPECT_FALSE(media_channel2_->playout());
1109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001111 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
1112 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001113 if (verify_playout_) {
1114 EXPECT_FALSE(media_channel2_->playout());
1115 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -08001117 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +02001118 if (verify_playout_) {
1119 EXPECT_TRUE(media_channel1_->playout());
1120 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001122 if (verify_playout_) {
1123 EXPECT_FALSE(media_channel2_->playout());
1124 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_FALSE(media_channel2_->sending());
1126 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001127 if (verify_playout_) {
1128 EXPECT_TRUE(media_channel2_->playout());
1129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001131 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
1132 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001133 if (verify_playout_) {
1134 EXPECT_TRUE(media_channel1_->playout());
1135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_TRUE(media_channel1_->sending());
1137 }
1138
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 // Test that changing the MediaContentDirection in the local and remote
1140 // session description start playout and sending at the right time.
1141 void TestMediaContentDirection() {
1142 CreateChannels(0, 0);
1143 typename T::Content content1;
1144 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
1145 typename T::Content content2;
1146 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
1147 // Set |content2| to be InActive.
1148 content2.set_direction(cricket::MD_INACTIVE);
1149
1150 EXPECT_TRUE(channel1_->Enable(true));
1151 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001152 if (verify_playout_) {
1153 EXPECT_FALSE(media_channel1_->playout());
1154 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001156 if (verify_playout_) {
1157 EXPECT_FALSE(media_channel2_->playout());
1158 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 EXPECT_FALSE(media_channel2_->sending());
1160
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001161 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
1162 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
1163 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1164 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001165 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166
Peter Boström34fbfff2015-09-24 19:20:30 +02001167 if (verify_playout_) {
1168 EXPECT_TRUE(media_channel1_->playout());
1169 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001171 if (verify_playout_) {
1172 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1173 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1175
1176 // Update |content2| to be RecvOnly.
1177 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001178 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1179 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180
Peter Boström34fbfff2015-09-24 19:20:30 +02001181 if (verify_playout_) {
1182 EXPECT_TRUE(media_channel1_->playout());
1183 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001185 if (verify_playout_) {
1186 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1187 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1189
1190 // Update |content2| to be SendRecv.
1191 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001192 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1193 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194
Peter Boström34fbfff2015-09-24 19:20:30 +02001195 if (verify_playout_) {
1196 EXPECT_TRUE(media_channel1_->playout());
1197 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001199 if (verify_playout_) {
1200 EXPECT_TRUE(media_channel2_->playout());
1201 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001202 EXPECT_TRUE(media_channel2_->sending());
1203 }
1204
Honghai Zhangcc411c02016-03-29 17:27:21 -07001205 // Tests that when the transport channel signals a candidate pair change
1206 // event, the media channel will receive a call on the network route change.
1207 void TestNetworkRouteChanges() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001208 constexpr uint16_t kLocalNetId = 1;
1209 constexpr uint16_t kRemoteNetId = 2;
1210 constexpr int kLastPacketId = 100;
1211
Honghai Zhangcc411c02016-03-29 17:27:21 -07001212 CreateChannels(0, 0);
1213
Honghai Zhangcc411c02016-03-29 17:27:21 -07001214 typename T::MediaChannel* media_channel1 =
1215 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001216 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001218 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001219 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001220 // The transport channel becomes disconnected.
deadbeeff5346592017-01-24 21:51:21 -08001221 fake_rtp_dtls_transport1_->ice_transport()
1222 ->SignalSelectedCandidatePairChanged(
1223 fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001224 });
1225 WaitForThreads();
1226 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001227 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001228 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001229
deadbeeff5346592017-01-24 21:51:21 -08001230 network_thread_->Invoke<void>(RTC_FROM_HERE, [this, media_channel1,
1231 kLocalNetId, kRemoteNetId,
1232 kLastPacketId] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001233 // The transport channel becomes connected.
1234 rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
1235 rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
deadbeeff5346592017-01-24 21:51:21 -08001236 auto candidate_pair = cricket::FakeCandidatePair::Create(
1237 local_address, kLocalNetId, remote_address, kRemoteNetId);
1238 fake_rtp_dtls_transport1_->ice_transport()
1239 ->SignalSelectedCandidatePairChanged(
1240 fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
1241 kLastPacketId, true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001242 });
1243 WaitForThreads();
1244 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001245 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001247 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001248 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001249 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001250 constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
1251 EXPECT_EQ(kTransportOverheadPerPacket,
1252 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001253 }
1254
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001255 // Test setting up a call.
1256 void TestCallSetup() {
1257 CreateChannels(0, 0);
1258 EXPECT_FALSE(channel1_->secure());
1259 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001260 if (verify_playout_) {
1261 EXPECT_TRUE(media_channel1_->playout());
1262 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263 EXPECT_FALSE(media_channel1_->sending());
1264 EXPECT_TRUE(SendAccept());
1265 EXPECT_FALSE(channel1_->secure());
1266 EXPECT_TRUE(media_channel1_->sending());
1267 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001268 if (verify_playout_) {
1269 EXPECT_TRUE(media_channel2_->playout());
1270 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_TRUE(media_channel2_->sending());
1272 EXPECT_EQ(1U, media_channel2_->codecs().size());
1273 }
1274
1275 // Test that we don't crash if packets are sent during call teardown
1276 // when RTCP mux is enabled. This is a regression test against a specific
1277 // race condition that would only occur when a RTCP packet was sent during
1278 // teardown of a channel on which RTCP mux was enabled.
1279 void TestCallTeardownRtcpMux() {
1280 class LastWordMediaChannel : public T::MediaChannel {
1281 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001284 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1285 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1287 }
1288 };
1289 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
deadbeefac22f702017-01-12 21:59:29 -08001290 RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(SendInitiate());
1292 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001293 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294 }
1295
1296 // Send voice RTP data to the other side and ensure it gets there.
1297 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001298 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001299 EXPECT_TRUE(SendInitiate());
1300 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001301 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1302 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001303 SendRtp1();
1304 SendRtp2();
1305 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306 EXPECT_TRUE(CheckRtp1());
1307 EXPECT_TRUE(CheckRtp2());
1308 EXPECT_TRUE(CheckNoRtp1());
1309 EXPECT_TRUE(CheckNoRtp2());
1310 }
1311
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001312 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001313 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001314 EXPECT_TRUE(SendInitiate());
1315 EXPECT_TRUE(SendAccept());
1316 SendRtp1();
1317 SendRtp2();
1318 SendRtcp1();
1319 SendRtcp2();
1320 // Do not wait, destroy channels.
1321 channel1_.reset(nullptr);
1322 channel2_.reset(nullptr);
1323 }
1324
deadbeefac22f702017-01-12 21:59:29 -08001325 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001327 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001328 EXPECT_TRUE(SendInitiate());
1329 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001330 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1331 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001332 SendRtcp1();
1333 SendRtcp2();
1334 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(CheckRtcp1());
1336 EXPECT_TRUE(CheckRtcp2());
1337 EXPECT_TRUE(CheckNoRtcp1());
1338 EXPECT_TRUE(CheckNoRtcp2());
1339 }
1340
1341 // Check that RTCP is transmitted if only the initiator supports mux.
1342 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001343 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344 EXPECT_TRUE(SendInitiate());
1345 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001346 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1347 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001348 SendRtcp1();
1349 SendRtcp2();
1350 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 EXPECT_TRUE(CheckRtcp1());
1352 EXPECT_TRUE(CheckRtcp2());
1353 EXPECT_TRUE(CheckNoRtcp1());
1354 EXPECT_TRUE(CheckNoRtcp2());
1355 }
1356
1357 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1358 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001359 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001361 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1362 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1363 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001365 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1366 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001367 SendRtp1();
1368 SendRtp2();
1369 SendRtcp1();
1370 SendRtcp2();
1371 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 EXPECT_TRUE(CheckRtp1());
1373 EXPECT_TRUE(CheckRtp2());
1374 EXPECT_TRUE(CheckNoRtp1());
1375 EXPECT_TRUE(CheckNoRtp2());
1376 EXPECT_TRUE(CheckRtcp1());
1377 EXPECT_TRUE(CheckRtcp2());
1378 EXPECT_TRUE(CheckNoRtcp1());
1379 EXPECT_TRUE(CheckNoRtcp2());
1380 }
1381
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001382 // Check that RTP and RTCP are transmitted ok when both sides
1383 // support mux and one the offerer requires mux.
1384 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001385 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001386 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001387 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1388 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001389 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 SendRtp1();
1391 SendRtp2();
1392 SendRtcp1();
1393 SendRtcp2();
1394 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001395 EXPECT_TRUE(CheckRtp1());
1396 EXPECT_TRUE(CheckRtp2());
1397 EXPECT_TRUE(CheckNoRtp1());
1398 EXPECT_TRUE(CheckNoRtp2());
1399 EXPECT_TRUE(CheckRtcp1());
1400 EXPECT_TRUE(CheckRtcp2());
1401 EXPECT_TRUE(CheckNoRtcp1());
1402 EXPECT_TRUE(CheckNoRtcp2());
1403 }
1404
1405 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001406 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001407 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001408 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001409 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001410 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1411 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1412 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001413 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001414 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1415 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001416 SendRtp1();
1417 SendRtp2();
1418 SendRtcp1();
1419 SendRtcp2();
1420 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001421 EXPECT_TRUE(CheckRtp1());
1422 EXPECT_TRUE(CheckRtp2());
1423 EXPECT_TRUE(CheckNoRtp1());
1424 EXPECT_TRUE(CheckNoRtp2());
1425 EXPECT_TRUE(CheckRtcp1());
1426 EXPECT_TRUE(CheckRtcp2());
1427 EXPECT_TRUE(CheckNoRtcp1());
1428 EXPECT_TRUE(CheckNoRtcp2());
1429 }
1430
1431 // Check that RTP and RTCP are transmitted ok when both sides
1432 // require mux.
1433 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001434 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001435 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001436 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1437 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001438 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001439 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001440 SendRtp1();
1441 SendRtp2();
1442 SendRtcp1();
1443 SendRtcp2();
1444 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001445 EXPECT_TRUE(CheckRtp1());
1446 EXPECT_TRUE(CheckRtp2());
1447 EXPECT_TRUE(CheckNoRtp1());
1448 EXPECT_TRUE(CheckNoRtp2());
1449 EXPECT_TRUE(CheckRtcp1());
1450 EXPECT_TRUE(CheckRtcp2());
1451 EXPECT_TRUE(CheckNoRtcp1());
1452 EXPECT_TRUE(CheckNoRtcp2());
1453 }
1454
1455 // Check that SendAccept fails if the answerer doesn't support mux
1456 // and the offerer requires it.
1457 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001458 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001459 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001460 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1461 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001462 EXPECT_FALSE(SendAccept());
1463 }
1464
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 // Check that RTCP data sent by the initiator before the accept is not muxed.
1466 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001467 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001469 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1470 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471
1472 // RTCP can be sent before the call is accepted, if the transport is ready.
1473 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001474 SendRtcp1();
1475 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476 EXPECT_TRUE(CheckNoRtp2());
1477 EXPECT_TRUE(CheckRtcp2());
1478
1479 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001480 SendRtcp2();
1481 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 EXPECT_TRUE(CheckNoRtp1());
1483 EXPECT_TRUE(CheckRtcp1());
1484
1485 // Complete call setup and ensure everything is still OK.
1486 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001487 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001488 SendRtcp1();
1489 SendRtcp2();
1490 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 EXPECT_TRUE(CheckRtcp1());
1493 }
1494
1495
1496 // Check that RTCP data is not muxed until both sides have enabled muxing,
1497 // but that we properly demux before we get the accept message, since there
1498 // is a race between RTP data and the jingle accept.
1499 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001500 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001502 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1503 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504
1505 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1506 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001507 SendRtcp1();
1508 WaitForThreads();
1509 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001510
1511 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001512 SendRtcp2();
1513 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_TRUE(CheckNoRtp1());
1515 EXPECT_TRUE(CheckRtcp1());
1516
1517 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001518 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001520 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1521 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001522 SendRtcp1();
1523 SendRtcp2();
1524 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 EXPECT_TRUE(CheckRtcp1());
1527 }
1528
1529 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001530 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001532 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1533 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534
deadbeefac22f702017-01-12 21:59:29 -08001535 int flags1 = SECURE | flags1_in;
1536 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 bool dtls1 = !!(flags1_in & DTLS);
1538 bool dtls2 = !!(flags2_in & DTLS);
1539 CreateChannels(flags1, flags2);
1540 EXPECT_FALSE(channel1_->secure());
1541 EXPECT_FALSE(channel2_->secure());
1542 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001543 WaitForThreads();
1544 EXPECT_TRUE(channel1_->writable());
1545 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546 EXPECT_TRUE(SendAccept());
1547 EXPECT_TRUE(channel1_->secure());
1548 EXPECT_TRUE(channel2_->secure());
1549 EXPECT_EQ(dtls1 && dtls2, channel1_->secure_dtls());
1550 EXPECT_EQ(dtls1 && dtls2, channel2_->secure_dtls());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001551 SendRtp1();
1552 SendRtp2();
1553 SendRtcp1();
1554 SendRtcp2();
1555 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 EXPECT_TRUE(CheckRtp1());
1557 EXPECT_TRUE(CheckRtp2());
1558 EXPECT_TRUE(CheckNoRtp1());
1559 EXPECT_TRUE(CheckNoRtp2());
1560 EXPECT_TRUE(CheckRtcp1());
1561 EXPECT_TRUE(CheckRtcp2());
1562 EXPECT_TRUE(CheckNoRtcp1());
1563 EXPECT_TRUE(CheckNoRtcp2());
1564 }
1565
1566 // Test that we properly handling SRTP negotiating down to RTP.
1567 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001568 CreateChannels(SECURE, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 EXPECT_FALSE(channel1_->secure());
1570 EXPECT_FALSE(channel2_->secure());
1571 EXPECT_TRUE(SendInitiate());
1572 EXPECT_TRUE(SendAccept());
1573 EXPECT_FALSE(channel1_->secure());
1574 EXPECT_FALSE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001575 SendRtp1();
1576 SendRtp2();
1577 SendRtcp1();
1578 SendRtcp2();
1579 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 EXPECT_TRUE(CheckRtp1());
1581 EXPECT_TRUE(CheckRtp2());
1582 EXPECT_TRUE(CheckNoRtp1());
1583 EXPECT_TRUE(CheckNoRtp2());
1584 EXPECT_TRUE(CheckRtcp1());
1585 EXPECT_TRUE(CheckRtcp2());
1586 EXPECT_TRUE(CheckNoRtcp1());
1587 EXPECT_TRUE(CheckNoRtcp2());
1588 }
1589
1590 // Test that we can send and receive early media when a provisional answer is
1591 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1592 void SendEarlyMediaUsingRtcpMuxSrtp() {
1593 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1594
deadbeefac22f702017-01-12 21:59:29 -08001595 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1596 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597 EXPECT_TRUE(SendOffer());
1598 EXPECT_TRUE(SendProvisionalAnswer());
1599 EXPECT_TRUE(channel1_->secure());
1600 EXPECT_TRUE(channel2_->secure());
deadbeeff5346592017-01-24 21:51:21 -08001601 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1602 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001603 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1604 SendCustomRtcp1(kSsrc1);
1605 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1606 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1609
1610 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611 SendCustomRtcp2(kSsrc2);
1612 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1613 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1616
1617 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001618 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1619 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001621 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1622 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1623 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1624 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625 EXPECT_TRUE(channel1_->secure());
1626 EXPECT_TRUE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627 SendCustomRtcp1(kSsrc1);
1628 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1629 SendCustomRtcp2(kSsrc2);
1630 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1631 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1636 }
1637
1638 // Test that we properly send RTP without SRTP from a thread.
1639 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001640 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641 EXPECT_TRUE(SendInitiate());
1642 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1644 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1645 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1646 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1647 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1648 send_rtcp1.thread(),
1649 send_rtcp2.thread()};
1650 WaitForThreads(involved_threads);
1651 EXPECT_TRUE(CheckRtp1());
1652 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653 EXPECT_TRUE(CheckNoRtp1());
1654 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655 EXPECT_TRUE(CheckRtcp1());
1656 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 EXPECT_TRUE(CheckNoRtcp1());
1658 EXPECT_TRUE(CheckNoRtcp2());
1659 }
1660
1661 // Test that we properly send SRTP with RTCP from a thread.
1662 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001663 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 EXPECT_TRUE(SendInitiate());
1665 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1667 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1668 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1669 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1670 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1671 send_rtcp1.thread(),
1672 send_rtcp2.thread()};
1673 WaitForThreads(involved_threads);
1674 EXPECT_TRUE(CheckRtp1());
1675 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 EXPECT_TRUE(CheckNoRtp1());
1677 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678 EXPECT_TRUE(CheckRtcp1());
1679 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 EXPECT_TRUE(CheckNoRtcp1());
1681 EXPECT_TRUE(CheckNoRtcp2());
1682 }
1683
1684 // Test that the mediachannel retains its sending state after the transport
1685 // becomes non-writable.
1686 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001687 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 EXPECT_TRUE(SendInitiate());
1689 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001690 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1691 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001692 SendRtp1();
1693 SendRtp2();
1694 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 EXPECT_TRUE(CheckRtp1());
1696 EXPECT_TRUE(CheckRtp2());
1697 EXPECT_TRUE(CheckNoRtp1());
1698 EXPECT_TRUE(CheckNoRtp2());
1699
wu@webrtc.org97077a32013-10-25 21:18:33 +00001700 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001701 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1702 fake_rtp_dtls_transport1_->SetWritable(false);
1703 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001704 SendRtp1();
1705 SendRtp2();
1706 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 EXPECT_TRUE(CheckRtp1());
1708 EXPECT_TRUE(CheckNoRtp2());
1709
1710 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001711 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1712 fake_rtp_dtls_transport1_->SetWritable(true);
1713 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001715 SendRtp1();
1716 SendRtp2();
1717 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 EXPECT_TRUE(CheckRtp1());
1719 EXPECT_TRUE(CheckRtp2());
1720 EXPECT_TRUE(CheckNoRtp1());
1721 EXPECT_TRUE(CheckNoRtp2());
1722
1723 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001724 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1725 bool asymmetric = true;
1726 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1727 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 EXPECT_TRUE(media_channel1_->sending());
1729
wu@webrtc.org97077a32013-10-25 21:18:33 +00001730 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001731 SendRtp1();
1732 SendRtp2();
1733 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_TRUE(CheckRtp1());
1735 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001736 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737
1738 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001739 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001740 bool asymmetric = true;
1741 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1742 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001743 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745 SendRtp1();
1746 SendRtp2();
1747 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 EXPECT_TRUE(CheckRtp1());
1749 EXPECT_TRUE(CheckRtp2());
1750 EXPECT_TRUE(CheckNoRtp1());
1751 EXPECT_TRUE(CheckNoRtp2());
1752 }
1753
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001754 void SendBundleToBundle(
1755 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1756 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001758 // Only pl_type1 was added to the bundle filter for both |channel1_|
1759 // and |channel2_|.
1760 int pl_type1 = pl_types[0];
1761 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001762 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001763 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001764 if (rtcp_mux) {
1765 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001766 }
1767 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001769 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1770 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001772 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1773 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001774 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1775 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1776 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1777 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001778
1779 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1781 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1782 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001783 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001784 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1785 EXPECT_TRUE(CheckNoRtp1());
1786 EXPECT_TRUE(CheckNoRtp2());
1787
1788 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1790 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1791 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001792 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001793 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001795 SendCustomRtcp1(kSsrc1);
1796 SendCustomRtcp2(kSsrc2);
1797 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1799 EXPECT_TRUE(CheckNoRtcp1());
1800 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1801 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001803 SendCustomRtcp1(kSsrc2);
1804 SendCustomRtcp2(kSsrc1);
1805 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001806 // Bundle filter shouldn't filter out any RTCP.
1807 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1808 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809 }
1810
deadbeefc6b6e092016-12-01 12:49:20 -08001811 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 CreateChannels(0, 0);
1814 EXPECT_TRUE(SendInitiate());
1815 EXPECT_TRUE(SendAccept());
1816 channel1_->StartMediaMonitor(100);
1817 channel2_->StartMediaMonitor(100);
1818 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001819 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1820 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 channel1_->StopMediaMonitor();
1822 channel2_->StopMediaMonitor();
1823 // Ensure a restart of a stopped monitor works.
1824 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001825 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826 channel1_->StopMediaMonitor();
1827 // Ensure stopping a stopped monitor is OK.
1828 channel1_->StopMediaMonitor();
1829 }
1830
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831 void TestSetContentFailure() {
1832 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833
Peter Thatchera6d24442015-07-09 21:26:36 -07001834 auto sdesc = cricket::SessionDescription();
1835 sdesc.AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
1836 new cricket::AudioContentDescription());
1837 sdesc.AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
1838 new cricket::VideoContentDescription());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839
Peter Thatchera6d24442015-07-09 21:26:36 -07001840 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841 media_channel1_->set_fail_set_recv_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001842 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1843 &sdesc, cricket::CA_OFFER, &err));
1844 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1845 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001848 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1849 &sdesc, cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001851 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1852 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 }
1854
1855 void TestSendTwoOffers() {
1856 CreateChannels(0, 0);
1857
Peter Thatchera6d24442015-07-09 21:26:36 -07001858 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001859 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001860 CreateSessionDescriptionWithStream(1));
1861 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1862 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1864
kwiberg31022942016-03-11 14:18:21 -08001865 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001866 CreateSessionDescriptionWithStream(2));
1867 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1868 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001869 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1870 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1871 }
1872
1873 void TestReceiveTwoOffers() {
1874 CreateChannels(0, 0);
1875
Peter Thatchera6d24442015-07-09 21:26:36 -07001876 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001877 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001878 CreateSessionDescriptionWithStream(1));
1879 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1880 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1882
kwiberg31022942016-03-11 14:18:21 -08001883 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001884 CreateSessionDescriptionWithStream(2));
1885 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1886 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001887 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1888 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1889 }
1890
1891 void TestSendPrAnswer() {
1892 CreateChannels(0, 0);
1893
Peter Thatchera6d24442015-07-09 21:26:36 -07001894 std::string err;
1895 // Receive offer
kwiberg31022942016-03-11 14:18:21 -08001896 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001897 CreateSessionDescriptionWithStream(1));
1898 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1899 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1901
Peter Thatchera6d24442015-07-09 21:26:36 -07001902 // Send PR answer
kwiberg31022942016-03-11 14:18:21 -08001903 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001904 CreateSessionDescriptionWithStream(2));
1905 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1906 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1908 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1909
Peter Thatchera6d24442015-07-09 21:26:36 -07001910 // Send answer
kwiberg31022942016-03-11 14:18:21 -08001911 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001912 CreateSessionDescriptionWithStream(3));
1913 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1914 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1916 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1917 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1918 }
1919
1920 void TestReceivePrAnswer() {
1921 CreateChannels(0, 0);
1922
Peter Thatchera6d24442015-07-09 21:26:36 -07001923 std::string err;
1924 // Send offer
kwiberg31022942016-03-11 14:18:21 -08001925 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001926 CreateSessionDescriptionWithStream(1));
1927 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1928 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1930
Peter Thatchera6d24442015-07-09 21:26:36 -07001931 // Receive PR answer
kwiberg31022942016-03-11 14:18:21 -08001932 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001933 CreateSessionDescriptionWithStream(2));
1934 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1935 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1937 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1938
Peter Thatchera6d24442015-07-09 21:26:36 -07001939 // Receive answer
kwiberg31022942016-03-11 14:18:21 -08001940 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001941 CreateSessionDescriptionWithStream(3));
1942 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1943 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1945 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1946 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1947 }
1948
1949 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001950 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 EXPECT_TRUE(SendInitiate());
1952 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001953 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1954 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955
1956 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 // The sending message is only posted. channel2_ should be empty.
1959 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001960 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1961 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962
1963 // When channel1_ is deleted, the RTCP packet should be sent out to
1964 // channel2_.
1965 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001966 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 EXPECT_TRUE(CheckRtcp2());
1968 }
1969
zstein56162b92017-04-24 16:54:35 -07001970 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001971 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973
zstein56162b92017-04-24 16:54:35 -07001974 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 EXPECT_TRUE(media_channel1_->ready_to_send());
1977
zstein56162b92017-04-24 16:54:35 -07001978 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001981 }
1982
zstein56162b92017-04-24 16:54:35 -07001983 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001984 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 typename T::Content content;
1986 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001987 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001989 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001990 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001991 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001992 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1993 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001994 EXPECT_FALSE(media_channel1_->ready_to_send());
1995 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1996 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001997 network_thread_->Invoke<void>(RTC_FROM_HERE,
1998 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001999 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002000 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002001
zstein56162b92017-04-24 16:54:35 -07002002 // TODO(zstein): Find a way to test this without making
2003 // OnTransportReadyToSend public.
2004 network_thread_->Invoke<void>(
2005 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002006 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 EXPECT_FALSE(media_channel1_->ready_to_send());
2008 }
2009
skvladdc1c62c2016-03-16 19:07:43 -07002010 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
2011 typename T::Content content;
2012 CreateContent(0, kPcmuCodec, kH264Codec, &content);
2013 content.set_bandwidth(remote_limit);
2014 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
2015 }
2016
deadbeefe702b302017-02-04 12:09:01 -08002017 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07002018 webrtc::RtpParameters parameters;
2019 webrtc::RtpEncodingParameters encoding;
2020 encoding.max_bitrate_bps = limit;
2021 parameters.encodings.push_back(encoding);
2022 return parameters;
2023 }
2024
2025 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08002026 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07002027 EXPECT_EQ(1UL, parameters.encodings.size());
2028 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
2029 }
2030
2031 void DefaultMaxBitrateIsUnlimited() {
2032 CreateChannels(0, 0);
2033 EXPECT_TRUE(
2034 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2035 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08002036 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2037 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002038 }
2039
2040 void CanChangeMaxBitrate() {
2041 CreateChannels(0, 0);
2042 EXPECT_TRUE(
2043 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2044
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07002045 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08002046 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
2047 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2048 rtc::Optional<int>(1000));
2049 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2050 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07002051 EXPECT_EQ(-1, media_channel1_->max_bps());
2052
deadbeefe702b302017-02-04 12:09:01 -08002053 EXPECT_TRUE(channel1_->SetRtpSendParameters(
2054 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
2055 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2056 rtc::Optional<int>());
2057 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2058 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002059 EXPECT_EQ(-1, media_channel1_->max_bps());
2060 }
2061
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002063 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2064 static void ProcessThreadQueue(rtc::Thread* thread) {
2065 RTC_DCHECK(thread->IsCurrent());
2066 while (!thread->empty()) {
2067 thread->ProcessMessages(0);
2068 }
2069 }
2070 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2071 // |threads| and current thread post packets to network thread.
2072 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002073 thread->Invoke<void>(RTC_FROM_HERE,
2074 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002075 }
2076 ProcessThreadQueue(rtc::Thread::Current());
2077 // Network thread move them around and post back to worker = current thread.
2078 if (!network_thread_->IsCurrent()) {
2079 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002080 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002081 }
2082 // Worker thread = current Thread process received messages.
2083 ProcessThreadQueue(rtc::Thread::Current());
2084 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002085 // TODO(pbos): Remove playout from all media channels and let renderers mute
2086 // themselves.
2087 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002088 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2089 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002090 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2091 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2092 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2093 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2094 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2095 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2096 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2097 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002098 cricket::FakeMediaEngine media_engine_;
2099 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002100 typename T::MediaChannel* media_channel1_ = nullptr;
2101 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002102 std::unique_ptr<typename T::Channel> channel1_;
2103 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 typename T::Content local_media_content1_;
2105 typename T::Content local_media_content2_;
2106 typename T::Content remote_media_content1_;
2107 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109 rtc::Buffer rtp_packet_;
2110 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002111 int media_info_callbacks1_ = 0;
2112 int media_info_callbacks2_ = 0;
2113 int rtcp_mux_activated_callbacks1_ = 0;
2114 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002115 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116};
2117
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118template<>
2119void ChannelTest<VoiceTraits>::CreateContent(
2120 int flags,
2121 const cricket::AudioCodec& audio_codec,
2122 const cricket::VideoCodec& video_codec,
2123 cricket::AudioContentDescription* audio) {
2124 audio->AddCodec(audio_codec);
2125 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2126 if (flags & SECURE) {
2127 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002128 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2129 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 }
2131}
2132
2133template<>
2134void ChannelTest<VoiceTraits>::CopyContent(
2135 const cricket::AudioContentDescription& source,
2136 cricket::AudioContentDescription* audio) {
2137 *audio = source;
2138}
2139
2140template<>
2141bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2142 const cricket::AudioCodec& c2) {
2143 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2144 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2145}
2146
Peter Boström0c4e06b2015-10-07 12:23:21 +02002147template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002149 uint32_t ssrc,
2150 int flags,
2151 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 audio->AddLegacyStream(ssrc);
2153}
2154
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002155class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 public:
solenberg1dd98f32015-09-10 01:57:14 -07002157 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002158 VoiceChannelSingleThreadTest()
2159 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2160};
2161
2162class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2163 public:
2164 typedef ChannelTest<VoiceTraits> Base;
2165 VoiceChannelDoubleThreadTest()
2166 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167};
2168
jbauch5869f502017-06-29 12:31:36 -07002169class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2170 : public ChannelTest<VoiceTraits> {
2171 public:
2172 typedef ChannelTest<VoiceTraits> Base;
2173 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2174 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2175 NetworkIsWorker::Yes) {}
2176};
2177
2178class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2179 : public ChannelTest<VoiceTraits> {
2180 public:
2181 typedef ChannelTest<VoiceTraits> Base;
2182 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2183 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2184 NetworkIsWorker::No) {}
2185};
2186
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002188template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002190 rtc::Thread* worker_thread,
2191 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002192 cricket::MediaEngineInterface* engine,
2193 cricket::FakeVideoMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08002194 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2195 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002196 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2197 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002198 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002199 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -08002200 cricket::VideoChannel* channel = new cricket::VideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08002201 worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
deadbeefac22f702017-01-12 21:59:29 -08002202 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002203 if (!channel->NeedsRtcpTransport()) {
2204 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002205 }
deadbeeff5346592017-01-24 21:51:21 -08002206 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2207 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208 delete channel;
2209 channel = NULL;
2210 }
2211 return channel;
2212}
2213
2214// override to add 0 parameter
2215template<>
2216bool ChannelTest<VideoTraits>::AddStream1(int id) {
2217 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2218}
2219
2220template<>
2221void ChannelTest<VideoTraits>::CreateContent(
2222 int flags,
2223 const cricket::AudioCodec& audio_codec,
2224 const cricket::VideoCodec& video_codec,
2225 cricket::VideoContentDescription* video) {
2226 video->AddCodec(video_codec);
2227 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2228 if (flags & SECURE) {
2229 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002230 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2231 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232 }
2233}
2234
2235template<>
2236void ChannelTest<VideoTraits>::CopyContent(
2237 const cricket::VideoContentDescription& source,
2238 cricket::VideoContentDescription* video) {
2239 *video = source;
2240}
2241
2242template<>
2243bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2244 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002245 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246}
2247
Peter Boström0c4e06b2015-10-07 12:23:21 +02002248template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002250 uint32_t ssrc,
2251 int flags,
2252 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 video->AddLegacyStream(ssrc);
2254}
2255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 public:
solenberg1dd98f32015-09-10 01:57:14 -07002258 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002259 VideoChannelSingleThreadTest()
2260 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261};
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2264 public:
2265 typedef ChannelTest<VideoTraits> Base;
2266 VideoChannelDoubleThreadTest()
2267 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2268};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002270// VoiceChannelSingleThreadTest
kjellander7c856582017-02-26 19:53:40 -08002271// Flaky on iOS Simualtor: bugs.webrtc.org/7247
2272#if defined(WEBRTC_IOS)
2273#define MAYBE_TestInit DISABLED_TestInit
2274#else
2275#define MAYBE_TestInit TestInit
2276#endif
2277TEST_F(VoiceChannelSingleThreadTest, MAYBE_TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 Base::TestInit();
2279 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2280 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2281}
2282
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002283TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2284 Base::TestDeinit();
2285}
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 Base::TestSetContents();
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292 Base::TestSetContentsNullOffer();
2293}
2294
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296 Base::TestSetContentsRtcpMux();
2297}
2298
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002299TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300 Base::TestSetContentsRtcpMux();
2301}
2302
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002303TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304 Base::TestSetRemoteContentUpdate();
2305}
2306
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002307TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308 Base::TestStreams();
2309}
2310
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002311TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312 Base::TestUpdateStreamsInLocalContent();
2313}
2314
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002315TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 Base::TestUpdateStreamsInRemoteContent();
2317}
2318
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002319TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320 Base::TestChangeStreamParamsInContent();
2321}
2322
jbauch5869f502017-06-29 12:31:36 -07002323TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2324 TestChangeEncryptedHeaderExtensionsDtls) {
2325 int flags = DTLS;
2326 Base::TestChangeEncryptedHeaderExtensions(flags);
2327}
2328
2329TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2330 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2331 int flags = DTLS;
2332 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2333}
2334
2335TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2336 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2337 int flags = DTLS;
2338 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2339}
2340
2341TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2342 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2343 int flags = DTLS | GCM_CIPHER;
2344 Base::TestChangeEncryptedHeaderExtensions(flags);
2345}
2346
2347TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2348 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2349 int flags = DTLS | GCM_CIPHER;
2350 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2351}
2352
2353TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2354 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2355 int flags = DTLS | GCM_CIPHER;
2356 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2357}
2358
2359TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2360 TestChangeEncryptedHeaderExtensionsSDES) {
2361 int flags = 0;
2362 Base::TestChangeEncryptedHeaderExtensions(flags);
2363}
2364
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002365TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 Base::TestPlayoutAndSendingStates();
2367}
2368
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002369TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002370 CreateChannels(0, 0);
2371 // Test that we can Mute the default channel even though the sending SSRC
2372 // is unknown.
2373 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002374 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002375 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2376 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002377 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2378
2379 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002380 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002381
2382 SendInitiate();
2383 // After the local session description has been set, we can mute a stream
2384 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002385 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002386 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2387 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002388 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389}
2390
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002391TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 Base::TestMediaContentDirection();
2393}
2394
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002395TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002396 Base::TestNetworkRouteChanges();
2397}
2398
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002399TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400 Base::TestCallSetup();
2401}
2402
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 Base::TestCallTeardownRtcpMux();
2405}
2406
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002407TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 Base::SendRtpToRtp();
2409}
2410
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002411TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 Base::SendRtcpToRtcp();
2413}
2414
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002415TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 Base::SendRtcpMuxToRtcp();
2417}
2418
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002419TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 Base::SendRtcpMuxToRtcpMux();
2421}
2422
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002423TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002424 Base::SendRequireRtcpMuxToRtcpMux();
2425}
2426
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002428 Base::SendRtcpMuxToRequireRtcpMux();
2429}
2430
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002432 Base::SendRequireRtcpMuxToRequireRtcpMux();
2433}
2434
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002435TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002436 Base::SendRequireRtcpMuxToNoRtcpMux();
2437}
2438
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002439TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440 Base::SendEarlyRtcpMuxToRtcp();
2441}
2442
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002443TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 Base::SendEarlyRtcpMuxToRtcpMux();
2445}
2446
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2449}
2450
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452 Base::SendSrtpToSrtp();
2453}
2454
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002455TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2457}
2458
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460 Base::SendSrtpToSrtp(DTLS, 0);
2461}
2462
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002463TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464 Base::SendSrtpToSrtp(DTLS, DTLS);
2465}
2466
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002467TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2469}
2470
deadbeeff5346592017-01-24 21:51:21 -08002471// Test using the channel with a raw packet interface, as opposed to a DTLS
2472// transport interface.
2473TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2474 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2475}
2476
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002477TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2479}
2480
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002481TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482 Base::SendRtpToRtpOnThread();
2483}
2484
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002485TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486 Base::SendSrtpToSrtpOnThread();
2487}
2488
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002489TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002490 Base::SendWithWritabilityLoss();
2491}
2492
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002493TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 Base::TestMediaMonitor();
2495}
2496
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002498TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 CreateChannels(0, 0);
2500 EXPECT_TRUE(SendInitiate());
2501 EXPECT_TRUE(SendAccept());
2502 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2503
solenberg1d63dd02015-12-02 12:35:09 -08002504 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2505 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2506 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002508 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002510 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002511 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002512 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002513 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002514 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002517TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518 Base::TestSetContentFailure();
2519}
2520
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002521TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522 Base::TestSendTwoOffers();
2523}
2524
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002525TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 Base::TestReceiveTwoOffers();
2527}
2528
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002529TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 Base::TestSendPrAnswer();
2531}
2532
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002533TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534 Base::TestReceivePrAnswer();
2535}
2536
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002537TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002538 Base::TestFlushRtcp();
2539}
2540
zstein56162b92017-04-24 16:54:35 -07002541TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2542 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543}
2544
zstein56162b92017-04-24 16:54:35 -07002545TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2546 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547}
2548
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002550TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002551 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 EXPECT_TRUE(SendInitiate());
2553 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002554 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555
solenberg4bac9c52015-10-09 02:32:53 -07002556 // Default is (1.0).
2557 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2558 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002560 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561
solenberg4bac9c52015-10-09 02:32:53 -07002562 // Set scale to (1.5).
2563 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2564 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2565 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566
solenberg4bac9c52015-10-09 02:32:53 -07002567 // Set scale to (0).
2568 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2569 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2570 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571}
2572
2573// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002574TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002575 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576 EXPECT_TRUE(SendInitiate());
2577 EXPECT_TRUE(SendAccept());
2578 EXPECT_TRUE(AddStream1(1));
2579 EXPECT_TRUE(AddStream1(2));
2580
solenberg4bac9c52015-10-09 02:32:53 -07002581 double volume;
2582 // Default is (1.0).
2583 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2584 EXPECT_DOUBLE_EQ(1.0, volume);
2585 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2586 EXPECT_DOUBLE_EQ(1.0, volume);
2587 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2588 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002590 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591
solenberg4bac9c52015-10-09 02:32:53 -07002592 // Set scale to (1.5) for ssrc = 1.
2593 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2594 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2595 EXPECT_DOUBLE_EQ(1.5, volume);
2596 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2597 EXPECT_DOUBLE_EQ(1.0, volume);
2598 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2599 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600
solenberg4bac9c52015-10-09 02:32:53 -07002601 // Set scale to (0) for all ssrcs.
2602 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2603 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2604 EXPECT_DOUBLE_EQ(0.0, volume);
2605 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2606 EXPECT_DOUBLE_EQ(0.0, volume);
2607 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2608 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002609}
2610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002611TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002612 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002613}
2614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002615TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002616 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002617}
2618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002619TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002620 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002621}
2622
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002623TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002624 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625}
2626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002627TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002628 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002629}
2630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002631TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002632 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002633}
2634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002635// VoiceChannelDoubleThreadTest
2636TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002638 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2639 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640}
2641
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002642TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2643 Base::TestDeinit();
2644}
2645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002646TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 Base::TestSetContents();
2648}
2649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002650TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 Base::TestSetContentsNullOffer();
2652}
2653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002654TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 Base::TestSetContentsRtcpMux();
2656}
2657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002658TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 Base::TestSetContentsRtcpMux();
2660}
2661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002662TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 Base::TestSetRemoteContentUpdate();
2664}
2665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002666TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 Base::TestStreams();
2668}
2669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002670TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 Base::TestUpdateStreamsInLocalContent();
2672}
2673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002674TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002675 Base::TestUpdateStreamsInRemoteContent();
2676}
2677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002678TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 Base::TestChangeStreamParamsInContent();
2680}
2681
jbauch5869f502017-06-29 12:31:36 -07002682TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2683 TestChangeEncryptedHeaderExtensionsDtls) {
2684 int flags = DTLS;
2685 Base::TestChangeEncryptedHeaderExtensions(flags);
2686}
2687
2688TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2689 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2690 int flags = DTLS;
2691 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2692}
2693
2694TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2695 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2696 int flags = DTLS;
2697 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2698}
2699
2700TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2701 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2702 int flags = DTLS | GCM_CIPHER;
2703 Base::TestChangeEncryptedHeaderExtensions(flags);
2704}
2705
2706TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2707 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2708 int flags = DTLS | GCM_CIPHER;
2709 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2710}
2711
2712TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2713 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2714 int flags = DTLS | GCM_CIPHER;
2715 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2716}
2717
2718TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2719 TestChangeEncryptedHeaderExtensionsSDES) {
2720 int flags = 0;
2721 Base::TestChangeEncryptedHeaderExtensions(flags);
2722}
2723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002724TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 Base::TestPlayoutAndSendingStates();
2726}
2727
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002728TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2729 CreateChannels(0, 0);
2730 // Test that we can Mute the default channel even though the sending SSRC
2731 // is unknown.
2732 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2733 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2734 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2735 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2736 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2737
2738 // Test that we can not mute an unknown SSRC.
2739 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2740
2741 SendInitiate();
2742 // After the local session description has been set, we can mute a stream
2743 // with its SSRC.
2744 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2745 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2746 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2747 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2748}
2749
2750TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2751 Base::TestMediaContentDirection();
2752}
2753
2754TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2755 Base::TestNetworkRouteChanges();
2756}
2757
2758TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2759 Base::TestCallSetup();
2760}
2761
2762TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2763 Base::TestCallTeardownRtcpMux();
2764}
2765
2766TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2767 Base::SendRtpToRtp();
2768}
2769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002770TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2771 Base::SendRtcpToRtcp();
2772}
2773
2774TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2775 Base::SendRtcpMuxToRtcp();
2776}
2777
2778TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2779 Base::SendRtcpMuxToRtcpMux();
2780}
2781
2782TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2783 Base::SendRequireRtcpMuxToRtcpMux();
2784}
2785
2786TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2787 Base::SendRtcpMuxToRequireRtcpMux();
2788}
2789
2790TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2791 Base::SendRequireRtcpMuxToRequireRtcpMux();
2792}
2793
2794TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2795 Base::SendRequireRtcpMuxToNoRtcpMux();
2796}
2797
2798TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2799 Base::SendEarlyRtcpMuxToRtcp();
2800}
2801
2802TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2803 Base::SendEarlyRtcpMuxToRtcpMux();
2804}
2805
2806TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2807 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2808}
2809
2810TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2811 Base::SendSrtpToSrtp();
2812}
2813
2814TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2815 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2816}
2817
2818TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002819 Base::SendSrtpToSrtp(DTLS, 0);
2820}
2821
2822TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002823 Base::SendSrtpToSrtp(DTLS, DTLS);
2824}
2825
2826TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002827 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2828}
2829
deadbeeff5346592017-01-24 21:51:21 -08002830// Test using the channel with a raw packet interface, as opposed to a DTLS
2831// transport interface.
2832TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2833 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2834}
2835
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002836TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2837 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2838}
2839
2840TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2841 Base::SendRtpToRtpOnThread();
2842}
2843
2844TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2845 Base::SendSrtpToSrtpOnThread();
2846}
2847
2848TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2849 Base::SendWithWritabilityLoss();
2850}
2851
2852TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2853 Base::TestMediaMonitor();
2854}
2855
2856// Test that InsertDtmf properly forwards to the media channel.
2857TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2858 CreateChannels(0, 0);
2859 EXPECT_TRUE(SendInitiate());
2860 EXPECT_TRUE(SendAccept());
2861 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2862
2863 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2864 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2865 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2866
2867 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2868 EXPECT_TRUE(
2869 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2870 EXPECT_TRUE(
2871 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2872 EXPECT_TRUE(
2873 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2874}
2875
2876TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2877 Base::TestSetContentFailure();
2878}
2879
2880TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2881 Base::TestSendTwoOffers();
2882}
2883
2884TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2885 Base::TestReceiveTwoOffers();
2886}
2887
2888TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2889 Base::TestSendPrAnswer();
2890}
2891
2892TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2893 Base::TestReceivePrAnswer();
2894}
2895
2896TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2897 Base::TestFlushRtcp();
2898}
2899
zstein56162b92017-04-24 16:54:35 -07002900TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2901 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002902}
2903
zstein56162b92017-04-24 16:54:35 -07002904TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2905 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002906}
2907
2908// Test that we can scale the output volume properly for 1:1 calls.
2909TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002910 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002911 EXPECT_TRUE(SendInitiate());
2912 EXPECT_TRUE(SendAccept());
2913 double volume;
2914
2915 // Default is (1.0).
2916 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2917 EXPECT_DOUBLE_EQ(1.0, volume);
2918 // invalid ssrc.
2919 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2920
2921 // Set scale to (1.5).
2922 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2923 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2924 EXPECT_DOUBLE_EQ(1.5, volume);
2925
2926 // Set scale to (0).
2927 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2928 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2929 EXPECT_DOUBLE_EQ(0.0, volume);
2930}
2931
2932// Test that we can scale the output volume properly for multiway calls.
2933TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002934 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002935 EXPECT_TRUE(SendInitiate());
2936 EXPECT_TRUE(SendAccept());
2937 EXPECT_TRUE(AddStream1(1));
2938 EXPECT_TRUE(AddStream1(2));
2939
2940 double volume;
2941 // Default is (1.0).
2942 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2943 EXPECT_DOUBLE_EQ(1.0, volume);
2944 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2945 EXPECT_DOUBLE_EQ(1.0, volume);
2946 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2947 EXPECT_DOUBLE_EQ(1.0, volume);
2948 // invalid ssrc.
2949 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2950
2951 // Set scale to (1.5) for ssrc = 1.
2952 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2953 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2954 EXPECT_DOUBLE_EQ(1.5, volume);
2955 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2956 EXPECT_DOUBLE_EQ(1.0, volume);
2957 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2958 EXPECT_DOUBLE_EQ(1.0, volume);
2959
2960 // Set scale to (0) for all ssrcs.
2961 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2962 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2963 EXPECT_DOUBLE_EQ(0.0, volume);
2964 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2965 EXPECT_DOUBLE_EQ(0.0, volume);
2966 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2967 EXPECT_DOUBLE_EQ(0.0, volume);
2968}
2969
2970TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2971 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2972}
2973
2974TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2975 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2976}
2977
2978TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2979 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2980}
2981
2982TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2983 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2984}
2985
2986TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2987 Base::DefaultMaxBitrateIsUnlimited();
2988}
2989
2990TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2991 Base::CanChangeMaxBitrate();
2992}
2993
2994// VideoChannelSingleThreadTest
2995TEST_F(VideoChannelSingleThreadTest, TestInit) {
2996 Base::TestInit();
2997}
2998
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002999TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
3000 Base::TestDeinit();
3001}
3002
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003003TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
3004 Base::TestSetContents();
3005}
3006
3007TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3008 Base::TestSetContentsNullOffer();
3009}
3010
3011TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3012 Base::TestSetContentsRtcpMux();
3013}
3014
3015TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3016 Base::TestSetContentsRtcpMux();
3017}
3018
3019TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3020 Base::TestSetRemoteContentUpdate();
3021}
3022
3023TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3024 Base::TestStreams();
3025}
3026
3027TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3028 Base::TestUpdateStreamsInLocalContent();
3029}
3030
3031TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3032 Base::TestUpdateStreamsInRemoteContent();
3033}
3034
3035TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3036 Base::TestChangeStreamParamsInContent();
3037}
3038
3039TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3040 Base::TestPlayoutAndSendingStates();
3041}
3042
3043TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003044 CreateChannels(0, 0);
3045 // Test that we can Mute the default channel even though the sending SSRC
3046 // is unknown.
3047 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003048 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003049 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003050 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003051 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3052 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003053 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003054 SendInitiate();
3055 // After the local session description has been set, we can mute a stream
3056 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003057 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003058 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003059 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003060 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003061}
3062
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003063TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003064 Base::TestMediaContentDirection();
3065}
3066
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003067TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003068 Base::TestNetworkRouteChanges();
3069}
3070
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003071TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072 Base::TestCallSetup();
3073}
3074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003075TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076 Base::TestCallTeardownRtcpMux();
3077}
3078
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003079TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003080 Base::SendRtpToRtp();
3081}
3082
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003083TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003084 Base::SendRtcpToRtcp();
3085}
3086
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003087TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003088 Base::SendRtcpMuxToRtcp();
3089}
3090
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003091TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003092 Base::SendRtcpMuxToRtcpMux();
3093}
3094
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003095TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003096 Base::SendRequireRtcpMuxToRtcpMux();
3097}
3098
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003099TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003100 Base::SendRtcpMuxToRequireRtcpMux();
3101}
3102
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003103TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003104 Base::SendRequireRtcpMuxToRequireRtcpMux();
3105}
3106
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003107TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003108 Base::SendRequireRtcpMuxToNoRtcpMux();
3109}
3110
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003111TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112 Base::SendEarlyRtcpMuxToRtcp();
3113}
3114
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003115TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003116 Base::SendEarlyRtcpMuxToRtcpMux();
3117}
3118
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003119TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 Base::SendSrtpToSrtp();
3121}
3122
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003123TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124 Base::SendSrtpToSrtp();
3125}
3126
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003127TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128 Base::SendSrtpToSrtp(DTLS, 0);
3129}
3130
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003131TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132 Base::SendSrtpToSrtp(DTLS, DTLS);
3133}
3134
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003135TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003136 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3137}
3138
deadbeeff5346592017-01-24 21:51:21 -08003139// Test using the channel with a raw packet interface, as opposed to a DTLS
3140// transport interface.
3141TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3142 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3143}
3144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003145TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003146 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3147}
3148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003149TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003150 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3151}
3152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003153TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003154 Base::SendRtpToRtpOnThread();
3155}
3156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003157TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003158 Base::SendSrtpToSrtpOnThread();
3159}
3160
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003161TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003162 Base::SendWithWritabilityLoss();
3163}
3164
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003165TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003166 Base::TestMediaMonitor();
3167}
3168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003169TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003170 Base::TestSetContentFailure();
3171}
3172
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003173TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174 Base::TestSendTwoOffers();
3175}
3176
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003177TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178 Base::TestReceiveTwoOffers();
3179}
3180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003181TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003182 Base::TestSendPrAnswer();
3183}
3184
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003185TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003186 Base::TestReceivePrAnswer();
3187}
3188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003189TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003190 Base::TestFlushRtcp();
3191}
3192
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003193TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003194 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003195}
3196
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003197TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003198 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003199}
3200
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003201TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003202 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003203}
3204
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003205TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003206 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003207}
3208
zstein56162b92017-04-24 16:54:35 -07003209TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3210 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003211}
3212
zstein56162b92017-04-24 16:54:35 -07003213TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3214 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003215}
3216
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003217TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003218 Base::DefaultMaxBitrateIsUnlimited();
3219}
3220
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003221TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003222 Base::CanChangeMaxBitrate();
3223}
3224
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003225// VideoChannelDoubleThreadTest
3226TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3227 Base::TestInit();
3228}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003229
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003230TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3231 Base::TestDeinit();
3232}
3233
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003234TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3235 Base::TestSetContents();
3236}
3237
3238TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3239 Base::TestSetContentsNullOffer();
3240}
3241
3242TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3243 Base::TestSetContentsRtcpMux();
3244}
3245
3246TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3247 Base::TestSetContentsRtcpMux();
3248}
3249
3250TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3251 Base::TestSetRemoteContentUpdate();
3252}
3253
3254TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3255 Base::TestStreams();
3256}
3257
3258TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3259 Base::TestUpdateStreamsInLocalContent();
3260}
3261
3262TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3263 Base::TestUpdateStreamsInRemoteContent();
3264}
3265
3266TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3267 Base::TestChangeStreamParamsInContent();
3268}
3269
3270TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3271 Base::TestPlayoutAndSendingStates();
3272}
3273
3274TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3275 CreateChannels(0, 0);
3276 // Test that we can Mute the default channel even though the sending SSRC
3277 // is unknown.
3278 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003279 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003280 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003281 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003282 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3283 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003284 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003285 SendInitiate();
3286 // After the local session description has been set, we can mute a stream
3287 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003288 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003289 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003290 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003291 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3292}
3293
3294TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3295 Base::TestMediaContentDirection();
3296}
3297
3298TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3299 Base::TestNetworkRouteChanges();
3300}
3301
3302TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3303 Base::TestCallSetup();
3304}
3305
3306TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3307 Base::TestCallTeardownRtcpMux();
3308}
3309
3310TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3311 Base::SendRtpToRtp();
3312}
3313
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003314TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3315 Base::SendRtcpToRtcp();
3316}
3317
3318TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3319 Base::SendRtcpMuxToRtcp();
3320}
3321
3322TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3323 Base::SendRtcpMuxToRtcpMux();
3324}
3325
3326TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3327 Base::SendRequireRtcpMuxToRtcpMux();
3328}
3329
3330TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3331 Base::SendRtcpMuxToRequireRtcpMux();
3332}
3333
3334TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3335 Base::SendRequireRtcpMuxToRequireRtcpMux();
3336}
3337
3338TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3339 Base::SendRequireRtcpMuxToNoRtcpMux();
3340}
3341
3342TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3343 Base::SendEarlyRtcpMuxToRtcp();
3344}
3345
3346TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3347 Base::SendEarlyRtcpMuxToRtcpMux();
3348}
3349
3350TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3351 Base::SendSrtpToSrtp();
3352}
3353
3354TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3355 Base::SendSrtpToSrtp();
3356}
3357
3358TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003359 Base::SendSrtpToSrtp(DTLS, 0);
3360}
3361
3362TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003363 Base::SendSrtpToSrtp(DTLS, DTLS);
3364}
3365
3366TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003367 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3368}
3369
deadbeeff5346592017-01-24 21:51:21 -08003370// Test using the channel with a raw packet interface, as opposed to a DTLS
3371// transport interface.
3372TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3373 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3374}
3375
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003376TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3377 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3378}
3379
3380TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3381 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3382}
3383
3384TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3385 Base::SendRtpToRtpOnThread();
3386}
3387
3388TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3389 Base::SendSrtpToSrtpOnThread();
3390}
3391
3392TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3393 Base::SendWithWritabilityLoss();
3394}
3395
3396TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3397 Base::TestMediaMonitor();
3398}
3399
3400TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3401 Base::TestSetContentFailure();
3402}
3403
3404TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3405 Base::TestSendTwoOffers();
3406}
3407
3408TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3409 Base::TestReceiveTwoOffers();
3410}
3411
3412TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3413 Base::TestSendPrAnswer();
3414}
3415
3416TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3417 Base::TestReceivePrAnswer();
3418}
3419
3420TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3421 Base::TestFlushRtcp();
3422}
3423
3424TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3425 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3426}
3427
3428TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3429 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3430}
3431
3432TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3433 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3434}
3435
3436TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3437 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3438}
3439
zstein56162b92017-04-24 16:54:35 -07003440TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3441 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003442}
3443
zstein56162b92017-04-24 16:54:35 -07003444TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3445 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003446}
3447
3448TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3449 Base::DefaultMaxBitrateIsUnlimited();
3450}
3451
3452TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3453 Base::CanChangeMaxBitrate();
3454}
3455
deadbeef953c2ce2017-01-09 14:53:41 -08003456// RtpDataChannelSingleThreadTest
3457class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003458 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003459 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003460 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003461 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3462};
3463
deadbeef953c2ce2017-01-09 14:53:41 -08003464// RtpDataChannelDoubleThreadTest
3465class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003466 public:
3467 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003468 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003469 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003470};
3471
3472// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003473template <>
deadbeef953c2ce2017-01-09 14:53:41 -08003474cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003475 rtc::Thread* worker_thread,
3476 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003477 cricket::MediaEngineInterface* engine,
3478 cricket::FakeDataMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08003479 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3480 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003481 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3482 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003483 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003484 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef953c2ce2017-01-09 14:53:41 -08003485 cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08003486 worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
deadbeefac22f702017-01-12 21:59:29 -08003487 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003488 if (!channel->NeedsRtcpTransport()) {
3489 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003490 }
deadbeeff5346592017-01-24 21:51:21 -08003491 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3492 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003493 delete channel;
3494 channel = NULL;
3495 }
3496 return channel;
3497}
3498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003499template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003500void ChannelTest<DataTraits>::CreateContent(
3501 int flags,
3502 const cricket::AudioCodec& audio_codec,
3503 const cricket::VideoCodec& video_codec,
3504 cricket::DataContentDescription* data) {
3505 data->AddCodec(kGoogleDataCodec);
3506 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3507 if (flags & SECURE) {
3508 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003509 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3510 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003511 }
3512}
3513
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003514template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003515void ChannelTest<DataTraits>::CopyContent(
3516 const cricket::DataContentDescription& source,
3517 cricket::DataContentDescription* data) {
3518 *data = source;
3519}
3520
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003521template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003522bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3523 const cricket::DataCodec& c2) {
3524 return c1.name == c2.name;
3525}
3526
Peter Boström0c4e06b2015-10-07 12:23:21 +02003527template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003528void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003529 uint32_t ssrc,
3530 int flags,
3531 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003532 data->AddLegacyStream(ssrc);
3533}
3534
deadbeef953c2ce2017-01-09 14:53:41 -08003535TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003536 Base::TestInit();
3537 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3538}
3539
deadbeef953c2ce2017-01-09 14:53:41 -08003540TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003541 Base::TestDeinit();
3542}
3543
deadbeef953c2ce2017-01-09 14:53:41 -08003544TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003545 Base::TestSetContents();
3546}
3547
deadbeef953c2ce2017-01-09 14:53:41 -08003548TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003549 Base::TestSetContentsNullOffer();
3550}
3551
deadbeef953c2ce2017-01-09 14:53:41 -08003552TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003553 Base::TestSetContentsRtcpMux();
3554}
3555
deadbeef953c2ce2017-01-09 14:53:41 -08003556TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003557 Base::TestSetRemoteContentUpdate();
3558}
3559
deadbeef953c2ce2017-01-09 14:53:41 -08003560TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003561 Base::TestStreams();
3562}
3563
deadbeef953c2ce2017-01-09 14:53:41 -08003564TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003565 Base::TestUpdateStreamsInLocalContent();
3566}
3567
deadbeef953c2ce2017-01-09 14:53:41 -08003568TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003569 Base::TestUpdateStreamsInRemoteContent();
3570}
3571
deadbeef953c2ce2017-01-09 14:53:41 -08003572TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003573 Base::TestChangeStreamParamsInContent();
3574}
3575
deadbeef953c2ce2017-01-09 14:53:41 -08003576TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003577 Base::TestPlayoutAndSendingStates();
3578}
3579
deadbeef953c2ce2017-01-09 14:53:41 -08003580TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003581 Base::TestMediaContentDirection();
3582}
3583
deadbeef953c2ce2017-01-09 14:53:41 -08003584TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003585 Base::TestCallSetup();
3586}
3587
deadbeef953c2ce2017-01-09 14:53:41 -08003588TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003589 Base::TestCallTeardownRtcpMux();
3590}
3591
zstein56162b92017-04-24 16:54:35 -07003592TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3593 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003594}
3595
zstein56162b92017-04-24 16:54:35 -07003596TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3597 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003598}
3599
deadbeef953c2ce2017-01-09 14:53:41 -08003600TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003601 Base::SendRtpToRtp();
3602}
3603
deadbeef953c2ce2017-01-09 14:53:41 -08003604TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003605 Base::SendRtcpToRtcp();
3606}
3607
deadbeef953c2ce2017-01-09 14:53:41 -08003608TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003609 Base::SendRtcpMuxToRtcp();
3610}
3611
deadbeef953c2ce2017-01-09 14:53:41 -08003612TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003613 Base::SendRtcpMuxToRtcpMux();
3614}
3615
deadbeef953c2ce2017-01-09 14:53:41 -08003616TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003617 Base::SendEarlyRtcpMuxToRtcp();
3618}
3619
deadbeef953c2ce2017-01-09 14:53:41 -08003620TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003621 Base::SendEarlyRtcpMuxToRtcpMux();
3622}
3623
deadbeef953c2ce2017-01-09 14:53:41 -08003624TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003625 Base::SendSrtpToSrtp();
3626}
3627
deadbeef953c2ce2017-01-09 14:53:41 -08003628TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003629 Base::SendSrtpToSrtp();
3630}
3631
deadbeef953c2ce2017-01-09 14:53:41 -08003632TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003633 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3634}
3635
deadbeef953c2ce2017-01-09 14:53:41 -08003636TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003637 Base::SendRtpToRtpOnThread();
3638}
3639
deadbeef953c2ce2017-01-09 14:53:41 -08003640TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003641 Base::SendSrtpToSrtpOnThread();
3642}
3643
deadbeef953c2ce2017-01-09 14:53:41 -08003644TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003645 Base::SendWithWritabilityLoss();
3646}
3647
deadbeef953c2ce2017-01-09 14:53:41 -08003648TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003649 Base::TestMediaMonitor();
3650}
3651
deadbeef953c2ce2017-01-09 14:53:41 -08003652TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003653 CreateChannels(0, 0);
3654 EXPECT_TRUE(SendInitiate());
3655 EXPECT_TRUE(SendAccept());
3656
3657 cricket::SendDataParams params;
3658 params.ssrc = 42;
3659 unsigned char data[] = {'f', 'o', 'o'};
3660 rtc::CopyOnWriteBuffer payload(data, 3);
3661 cricket::SendDataResult result;
3662 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3663 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3664 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3665}
3666
deadbeef953c2ce2017-01-09 14:53:41 -08003667TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003668 Base::TestInit();
3669 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3670}
3671
deadbeef953c2ce2017-01-09 14:53:41 -08003672TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003673 Base::TestDeinit();
3674}
3675
deadbeef953c2ce2017-01-09 14:53:41 -08003676TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003677 Base::TestSetContents();
3678}
3679
deadbeef953c2ce2017-01-09 14:53:41 -08003680TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003681 Base::TestSetContentsNullOffer();
3682}
3683
deadbeef953c2ce2017-01-09 14:53:41 -08003684TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003685 Base::TestSetContentsRtcpMux();
3686}
3687
deadbeef953c2ce2017-01-09 14:53:41 -08003688TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003689 Base::TestSetRemoteContentUpdate();
3690}
3691
deadbeef953c2ce2017-01-09 14:53:41 -08003692TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003693 Base::TestStreams();
3694}
3695
deadbeef953c2ce2017-01-09 14:53:41 -08003696TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003697 Base::TestUpdateStreamsInLocalContent();
3698}
3699
deadbeef953c2ce2017-01-09 14:53:41 -08003700TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003701 Base::TestUpdateStreamsInRemoteContent();
3702}
3703
deadbeef953c2ce2017-01-09 14:53:41 -08003704TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003705 Base::TestChangeStreamParamsInContent();
3706}
3707
deadbeef953c2ce2017-01-09 14:53:41 -08003708TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003709 Base::TestPlayoutAndSendingStates();
3710}
3711
deadbeef953c2ce2017-01-09 14:53:41 -08003712TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003713 Base::TestMediaContentDirection();
3714}
3715
deadbeef953c2ce2017-01-09 14:53:41 -08003716TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003717 Base::TestCallSetup();
3718}
3719
deadbeef953c2ce2017-01-09 14:53:41 -08003720TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003721 Base::TestCallTeardownRtcpMux();
3722}
3723
zstein56162b92017-04-24 16:54:35 -07003724TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3725 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003726}
3727
zstein56162b92017-04-24 16:54:35 -07003728TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3729 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003730}
3731
deadbeef953c2ce2017-01-09 14:53:41 -08003732TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003733 Base::SendRtpToRtp();
3734}
3735
deadbeef953c2ce2017-01-09 14:53:41 -08003736TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003737 Base::SendRtcpToRtcp();
3738}
3739
deadbeef953c2ce2017-01-09 14:53:41 -08003740TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003741 Base::SendRtcpMuxToRtcp();
3742}
3743
deadbeef953c2ce2017-01-09 14:53:41 -08003744TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003745 Base::SendRtcpMuxToRtcpMux();
3746}
3747
deadbeef953c2ce2017-01-09 14:53:41 -08003748TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003749 Base::SendEarlyRtcpMuxToRtcp();
3750}
3751
deadbeef953c2ce2017-01-09 14:53:41 -08003752TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003753 Base::SendEarlyRtcpMuxToRtcpMux();
3754}
3755
deadbeef953c2ce2017-01-09 14:53:41 -08003756TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003757 Base::SendSrtpToSrtp();
3758}
3759
deadbeef953c2ce2017-01-09 14:53:41 -08003760TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003761 Base::SendSrtpToSrtp();
3762}
3763
deadbeef953c2ce2017-01-09 14:53:41 -08003764TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003765 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3766}
3767
deadbeef953c2ce2017-01-09 14:53:41 -08003768TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003769 Base::SendRtpToRtpOnThread();
3770}
3771
deadbeef953c2ce2017-01-09 14:53:41 -08003772TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003773 Base::SendSrtpToSrtpOnThread();
3774}
3775
deadbeef953c2ce2017-01-09 14:53:41 -08003776TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003777 Base::SendWithWritabilityLoss();
3778}
3779
deadbeef953c2ce2017-01-09 14:53:41 -08003780TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003781 Base::TestMediaMonitor();
3782}
3783
deadbeef953c2ce2017-01-09 14:53:41 -08003784TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003785 CreateChannels(0, 0);
3786 EXPECT_TRUE(SendInitiate());
3787 EXPECT_TRUE(SendAccept());
3788
3789 cricket::SendDataParams params;
3790 params.ssrc = 42;
3791 unsigned char data[] = {
3792 'f', 'o', 'o'
3793 };
jbaucheec21bd2016-03-20 06:15:43 -07003794 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003795 cricket::SendDataResult result;
3796 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3797 EXPECT_EQ(params.ssrc,
3798 media_channel1_->last_sent_data_params().ssrc);
3799 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3800}
3801
deadbeefbad5dad2017-01-17 18:32:35 -08003802#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3803
3804// Verifies some DCHECKs are in place.
3805// Uses VoiceChannel, but any BaseChannel subclass would work.
3806class BaseChannelDeathTest : public testing::Test {
3807 public:
3808 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003809 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3810 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3811 // RTCP mux not required, SRTP required.
deadbeefbad5dad2017-01-17 18:32:35 -08003812 voice_channel_(
3813 rtc::Thread::Current(),
3814 rtc::Thread::Current(),
3815 rtc::Thread::Current(),
3816 &fake_media_engine_,
3817 new cricket::FakeVoiceMediaChannel(nullptr,
3818 cricket::AudioOptions()),
3819 cricket::CN_AUDIO,
3820 false,
deadbeeff5346592017-01-24 21:51:21 -08003821 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003822
3823 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003824 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003825 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3826 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003827 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003828};
3829
deadbeeff5346592017-01-24 21:51:21 -08003830TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
3831 ASSERT_TRUE(voice_channel_.Init_w(
3832 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3833 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3834 cricket::FakeDtlsTransport new_rtcp_transport(
3835 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3836 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003837}
3838
deadbeeff5346592017-01-24 21:51:21 -08003839TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
3840 ASSERT_TRUE(voice_channel_.Init_w(
3841 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3842 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3843 cricket::FakeDtlsTransport new_rtp_transport(
3844 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3845 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003846}
3847
deadbeeff5346592017-01-24 21:51:21 -08003848TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
3849 ASSERT_TRUE(voice_channel_.Init_w(
3850 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3851 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
deadbeefbad5dad2017-01-17 18:32:35 -08003852 // Activate RTCP muxing, simulating offer/answer negotiation.
3853 cricket::AudioContentDescription content;
3854 content.set_rtcp_mux(true);
3855 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3856 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003857 cricket::FakeDtlsTransport new_rtp_transport(
3858 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3859 cricket::FakeDtlsTransport new_rtcp_transport(
3860 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003861 // After muxing is enabled, no RTCP transport should be passed in here.
3862 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003863 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3864 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003865}
3866
3867// This test will probably go away if/when we move the transport name out of
3868// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003869TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
3870 ASSERT_TRUE(voice_channel_.Init_w(
3871 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3872 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3873 cricket::FakeDtlsTransport new_rtp_transport(
3874 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3875 cricket::FakeDtlsTransport new_rtcp_transport(
3876 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003877 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003878 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3879 "");
3880}
3881
3882// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003883// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003884TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
3885 ASSERT_TRUE(voice_channel_.Init_w(
3886 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3887 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3888 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003889 voice_channel_.SetTransports(
3890 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3891 static_cast<rtc::PacketTransportInternal*>(
3892 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003893 "");
3894}
3895
deadbeef5bd5ca32017-02-10 11:31:50 -08003896// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003897// DtlsTransportInternal.
3898TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
3899 ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3900 &fake_rtcp_dtls_transport_));
3901 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3902 &fake_rtp_dtls_transport_),
3903 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003904}
3905
3906#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3907
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003908// TODO(pthatcher): TestSetReceiver?