blob: ae34a12de4bd4f8a3b02fff0103d58645331053b [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);
zhihuange683c682017-08-31 16:00:07 -0700584 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 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
zhihuange683c682017-08-31 16:00:07 -0700899 EXPECT_TRUE(channel1_->srtp_active());
900 EXPECT_TRUE(channel2_->srtp_active());
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() {
eladalon05b07bb2017-08-24 07:40:16 -07001208 static constexpr uint16_t kLocalNetId = 1;
1209 static constexpr uint16_t kRemoteNetId = 2;
1210 static constexpr int kLastPacketId = 100;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001211
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
eladalon05b07bb2017-08-24 07:40:16 -07001230 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001231 // The transport channel becomes connected.
1232 rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
1233 rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
deadbeeff5346592017-01-24 21:51:21 -08001234 auto candidate_pair = cricket::FakeCandidatePair::Create(
1235 local_address, kLocalNetId, remote_address, kRemoteNetId);
1236 fake_rtp_dtls_transport1_->ice_transport()
1237 ->SignalSelectedCandidatePairChanged(
1238 fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
1239 kLastPacketId, true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001240 });
1241 WaitForThreads();
1242 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001243 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001244 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001245 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001247 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001248 constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
1249 EXPECT_EQ(kTransportOverheadPerPacket,
1250 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001251 }
1252
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253 // Test setting up a call.
1254 void TestCallSetup() {
1255 CreateChannels(0, 0);
zhihuange683c682017-08-31 16:00:07 -07001256 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001258 if (verify_playout_) {
1259 EXPECT_TRUE(media_channel1_->playout());
1260 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261 EXPECT_FALSE(media_channel1_->sending());
1262 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001263 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001264 EXPECT_TRUE(media_channel1_->sending());
1265 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001266 if (verify_playout_) {
1267 EXPECT_TRUE(media_channel2_->playout());
1268 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001269 EXPECT_TRUE(media_channel2_->sending());
1270 EXPECT_EQ(1U, media_channel2_->codecs().size());
1271 }
1272
1273 // Test that we don't crash if packets are sent during call teardown
1274 // when RTCP mux is enabled. This is a regression test against a specific
1275 // race condition that would only occur when a RTCP packet was sent during
1276 // teardown of a channel on which RTCP mux was enabled.
1277 void TestCallTeardownRtcpMux() {
1278 class LastWordMediaChannel : public T::MediaChannel {
1279 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001280 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001281 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001282 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1283 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1285 }
1286 };
1287 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
deadbeefac22f702017-01-12 21:59:29 -08001288 RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 EXPECT_TRUE(SendInitiate());
1290 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001291 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 }
1293
1294 // Send voice RTP data to the other side and ensure it gets there.
1295 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001296 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001297 EXPECT_TRUE(SendInitiate());
1298 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001299 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1300 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001301 SendRtp1();
1302 SendRtp2();
1303 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 EXPECT_TRUE(CheckRtp1());
1305 EXPECT_TRUE(CheckRtp2());
1306 EXPECT_TRUE(CheckNoRtp1());
1307 EXPECT_TRUE(CheckNoRtp2());
1308 }
1309
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001310 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001311 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001312 EXPECT_TRUE(SendInitiate());
1313 EXPECT_TRUE(SendAccept());
1314 SendRtp1();
1315 SendRtp2();
1316 SendRtcp1();
1317 SendRtcp2();
1318 // Do not wait, destroy channels.
1319 channel1_.reset(nullptr);
1320 channel2_.reset(nullptr);
1321 }
1322
deadbeefac22f702017-01-12 21:59:29 -08001323 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001325 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(SendInitiate());
1327 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001328 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1329 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001330 SendRtcp1();
1331 SendRtcp2();
1332 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001333 EXPECT_TRUE(CheckRtcp1());
1334 EXPECT_TRUE(CheckRtcp2());
1335 EXPECT_TRUE(CheckNoRtcp1());
1336 EXPECT_TRUE(CheckNoRtcp2());
1337 }
1338
1339 // Check that RTCP is transmitted if only the initiator supports mux.
1340 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001341 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342 EXPECT_TRUE(SendInitiate());
1343 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001344 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1345 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 SendRtcp1();
1347 SendRtcp2();
1348 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349 EXPECT_TRUE(CheckRtcp1());
1350 EXPECT_TRUE(CheckRtcp2());
1351 EXPECT_TRUE(CheckNoRtcp1());
1352 EXPECT_TRUE(CheckNoRtcp2());
1353 }
1354
1355 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1356 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001357 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001359 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1360 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1361 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001362 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001363 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1364 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001365 SendRtp1();
1366 SendRtp2();
1367 SendRtcp1();
1368 SendRtcp2();
1369 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 EXPECT_TRUE(CheckRtp1());
1371 EXPECT_TRUE(CheckRtp2());
1372 EXPECT_TRUE(CheckNoRtp1());
1373 EXPECT_TRUE(CheckNoRtp2());
1374 EXPECT_TRUE(CheckRtcp1());
1375 EXPECT_TRUE(CheckRtcp2());
1376 EXPECT_TRUE(CheckNoRtcp1());
1377 EXPECT_TRUE(CheckNoRtcp2());
1378 }
1379
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001380 // Check that RTP and RTCP are transmitted ok when both sides
1381 // support mux and one the offerer requires mux.
1382 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001383 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001384 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001385 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1386 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001387 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001388 SendRtp1();
1389 SendRtp2();
1390 SendRtcp1();
1391 SendRtcp2();
1392 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001393 EXPECT_TRUE(CheckRtp1());
1394 EXPECT_TRUE(CheckRtp2());
1395 EXPECT_TRUE(CheckNoRtp1());
1396 EXPECT_TRUE(CheckNoRtp2());
1397 EXPECT_TRUE(CheckRtcp1());
1398 EXPECT_TRUE(CheckRtcp2());
1399 EXPECT_TRUE(CheckNoRtcp1());
1400 EXPECT_TRUE(CheckNoRtcp2());
1401 }
1402
1403 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001404 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001405 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001406 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001407 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001408 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1409 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1410 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001411 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001412 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1413 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001414 SendRtp1();
1415 SendRtp2();
1416 SendRtcp1();
1417 SendRtcp2();
1418 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001419 EXPECT_TRUE(CheckRtp1());
1420 EXPECT_TRUE(CheckRtp2());
1421 EXPECT_TRUE(CheckNoRtp1());
1422 EXPECT_TRUE(CheckNoRtp2());
1423 EXPECT_TRUE(CheckRtcp1());
1424 EXPECT_TRUE(CheckRtcp2());
1425 EXPECT_TRUE(CheckNoRtcp1());
1426 EXPECT_TRUE(CheckNoRtcp2());
1427 }
1428
1429 // Check that RTP and RTCP are transmitted ok when both sides
1430 // require mux.
1431 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001432 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001433 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001434 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1435 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001436 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001437 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 SendRtp1();
1439 SendRtp2();
1440 SendRtcp1();
1441 SendRtcp2();
1442 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001443 EXPECT_TRUE(CheckRtp1());
1444 EXPECT_TRUE(CheckRtp2());
1445 EXPECT_TRUE(CheckNoRtp1());
1446 EXPECT_TRUE(CheckNoRtp2());
1447 EXPECT_TRUE(CheckRtcp1());
1448 EXPECT_TRUE(CheckRtcp2());
1449 EXPECT_TRUE(CheckNoRtcp1());
1450 EXPECT_TRUE(CheckNoRtcp2());
1451 }
1452
1453 // Check that SendAccept fails if the answerer doesn't support mux
1454 // and the offerer requires it.
1455 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001456 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001457 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001458 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1459 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001460 EXPECT_FALSE(SendAccept());
1461 }
1462
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463 // Check that RTCP data sent by the initiator before the accept is not muxed.
1464 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001465 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001467 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1468 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469
1470 // RTCP can be sent before the call is accepted, if the transport is ready.
1471 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001472 SendRtcp1();
1473 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001474 EXPECT_TRUE(CheckNoRtp2());
1475 EXPECT_TRUE(CheckRtcp2());
1476
1477 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001478 SendRtcp2();
1479 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480 EXPECT_TRUE(CheckNoRtp1());
1481 EXPECT_TRUE(CheckRtcp1());
1482
1483 // Complete call setup and ensure everything is still OK.
1484 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001485 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001486 SendRtcp1();
1487 SendRtcp2();
1488 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001489 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490 EXPECT_TRUE(CheckRtcp1());
1491 }
1492
1493
1494 // Check that RTCP data is not muxed until both sides have enabled muxing,
1495 // but that we properly demux before we get the accept message, since there
1496 // is a race between RTP data and the jingle accept.
1497 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001498 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001500 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1501 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502
1503 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1504 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001505 SendRtcp1();
1506 WaitForThreads();
1507 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508
1509 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001510 SendRtcp2();
1511 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512 EXPECT_TRUE(CheckNoRtp1());
1513 EXPECT_TRUE(CheckRtcp1());
1514
1515 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001516 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001518 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1519 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001520 SendRtcp1();
1521 SendRtcp2();
1522 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 EXPECT_TRUE(CheckRtcp1());
1525 }
1526
1527 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001528 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001530 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1531 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532
deadbeefac22f702017-01-12 21:59:29 -08001533 int flags1 = SECURE | flags1_in;
1534 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535 bool dtls1 = !!(flags1_in & DTLS);
1536 bool dtls2 = !!(flags2_in & DTLS);
1537 CreateChannels(flags1, flags2);
zhihuange683c682017-08-31 16:00:07 -07001538 EXPECT_FALSE(channel1_->srtp_active());
1539 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001541 WaitForThreads();
1542 EXPECT_TRUE(channel1_->writable());
1543 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001545 EXPECT_TRUE(channel1_->srtp_active());
1546 EXPECT_TRUE(channel2_->srtp_active());
1547 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1548 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001549 SendRtp1();
1550 SendRtp2();
1551 SendRtcp1();
1552 SendRtcp2();
1553 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_TRUE(CheckRtp1());
1555 EXPECT_TRUE(CheckRtp2());
1556 EXPECT_TRUE(CheckNoRtp1());
1557 EXPECT_TRUE(CheckNoRtp2());
1558 EXPECT_TRUE(CheckRtcp1());
1559 EXPECT_TRUE(CheckRtcp2());
1560 EXPECT_TRUE(CheckNoRtcp1());
1561 EXPECT_TRUE(CheckNoRtcp2());
1562 }
1563
1564 // Test that we properly handling SRTP negotiating down to RTP.
1565 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001566 CreateChannels(SECURE, 0);
zhihuange683c682017-08-31 16:00:07 -07001567 EXPECT_FALSE(channel1_->srtp_active());
1568 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 EXPECT_TRUE(SendInitiate());
1570 EXPECT_TRUE(SendAccept());
zhihuange683c682017-08-31 16:00:07 -07001571 EXPECT_FALSE(channel1_->srtp_active());
1572 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001573 SendRtp1();
1574 SendRtp2();
1575 SendRtcp1();
1576 SendRtcp2();
1577 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 EXPECT_TRUE(CheckRtp1());
1579 EXPECT_TRUE(CheckRtp2());
1580 EXPECT_TRUE(CheckNoRtp1());
1581 EXPECT_TRUE(CheckNoRtp2());
1582 EXPECT_TRUE(CheckRtcp1());
1583 EXPECT_TRUE(CheckRtcp2());
1584 EXPECT_TRUE(CheckNoRtcp1());
1585 EXPECT_TRUE(CheckNoRtcp2());
1586 }
1587
1588 // Test that we can send and receive early media when a provisional answer is
1589 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1590 void SendEarlyMediaUsingRtcpMuxSrtp() {
1591 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1592
deadbeefac22f702017-01-12 21:59:29 -08001593 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1594 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595 EXPECT_TRUE(SendOffer());
1596 EXPECT_TRUE(SendProvisionalAnswer());
zhihuange683c682017-08-31 16:00:07 -07001597 EXPECT_TRUE(channel1_->srtp_active());
1598 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001599 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1600 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001601 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1602 SendCustomRtcp1(kSsrc1);
1603 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1604 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1607
1608 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001609 SendCustomRtcp2(kSsrc2);
1610 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1611 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1614
1615 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001616 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1617 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001619 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1620 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1621 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1622 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
zhihuange683c682017-08-31 16:00:07 -07001623 EXPECT_TRUE(channel1_->srtp_active());
1624 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625 SendCustomRtcp1(kSsrc1);
1626 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1627 SendCustomRtcp2(kSsrc2);
1628 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1629 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1634 }
1635
1636 // Test that we properly send RTP without SRTP from a thread.
1637 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001638 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 EXPECT_TRUE(SendInitiate());
1640 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1642 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1643 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1644 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1645 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1646 send_rtcp1.thread(),
1647 send_rtcp2.thread()};
1648 WaitForThreads(involved_threads);
1649 EXPECT_TRUE(CheckRtp1());
1650 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 EXPECT_TRUE(CheckNoRtp1());
1652 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653 EXPECT_TRUE(CheckRtcp1());
1654 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 EXPECT_TRUE(CheckNoRtcp1());
1656 EXPECT_TRUE(CheckNoRtcp2());
1657 }
1658
1659 // Test that we properly send SRTP with RTCP from a thread.
1660 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001661 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 EXPECT_TRUE(SendInitiate());
1663 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001664 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1665 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1666 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1667 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1668 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1669 send_rtcp1.thread(),
1670 send_rtcp2.thread()};
1671 WaitForThreads(involved_threads);
1672 EXPECT_TRUE(CheckRtp1());
1673 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 EXPECT_TRUE(CheckNoRtp1());
1675 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001676 EXPECT_TRUE(CheckRtcp1());
1677 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 EXPECT_TRUE(CheckNoRtcp1());
1679 EXPECT_TRUE(CheckNoRtcp2());
1680 }
1681
1682 // Test that the mediachannel retains its sending state after the transport
1683 // becomes non-writable.
1684 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001685 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 EXPECT_TRUE(SendInitiate());
1687 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001688 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1689 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690 SendRtp1();
1691 SendRtp2();
1692 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 EXPECT_TRUE(CheckRtp1());
1694 EXPECT_TRUE(CheckRtp2());
1695 EXPECT_TRUE(CheckNoRtp1());
1696 EXPECT_TRUE(CheckNoRtp2());
1697
wu@webrtc.org97077a32013-10-25 21:18:33 +00001698 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001699 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1700 fake_rtp_dtls_transport1_->SetWritable(false);
1701 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702 SendRtp1();
1703 SendRtp2();
1704 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 EXPECT_TRUE(CheckRtp1());
1706 EXPECT_TRUE(CheckNoRtp2());
1707
1708 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001709 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1710 fake_rtp_dtls_transport1_->SetWritable(true);
1711 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713 SendRtp1();
1714 SendRtp2();
1715 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 EXPECT_TRUE(CheckRtp1());
1717 EXPECT_TRUE(CheckRtp2());
1718 EXPECT_TRUE(CheckNoRtp1());
1719 EXPECT_TRUE(CheckNoRtp2());
1720
1721 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001722 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1723 bool asymmetric = true;
1724 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1725 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_TRUE(media_channel1_->sending());
1727
wu@webrtc.org97077a32013-10-25 21:18:33 +00001728 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001729 SendRtp1();
1730 SendRtp2();
1731 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 EXPECT_TRUE(CheckRtp1());
1733 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001734 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735
1736 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001737 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001738 bool asymmetric = true;
1739 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1740 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001741 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743 SendRtp1();
1744 SendRtp2();
1745 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 EXPECT_TRUE(CheckRtp1());
1747 EXPECT_TRUE(CheckRtp2());
1748 EXPECT_TRUE(CheckNoRtp1());
1749 EXPECT_TRUE(CheckNoRtp2());
1750 }
1751
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001752 void SendBundleToBundle(
1753 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1754 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001756 // Only pl_type1 was added to the bundle filter for both |channel1_|
1757 // and |channel2_|.
1758 int pl_type1 = pl_types[0];
1759 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001760 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001761 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001762 if (rtcp_mux) {
1763 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001764 }
1765 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001767 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1768 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001770 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1771 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001772 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1773 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1774 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1775 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001776
1777 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1779 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1780 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001781 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001782 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1783 EXPECT_TRUE(CheckNoRtp1());
1784 EXPECT_TRUE(CheckNoRtp2());
1785
1786 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1788 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1789 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001790 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001791 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1792
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001793 SendCustomRtcp1(kSsrc1);
1794 SendCustomRtcp2(kSsrc2);
1795 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1797 EXPECT_TRUE(CheckNoRtcp1());
1798 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1799 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001801 SendCustomRtcp1(kSsrc2);
1802 SendCustomRtcp2(kSsrc1);
1803 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001804 // Bundle filter shouldn't filter out any RTCP.
1805 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1806 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 }
1808
deadbeefc6b6e092016-12-01 12:49:20 -08001809 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 CreateChannels(0, 0);
1812 EXPECT_TRUE(SendInitiate());
1813 EXPECT_TRUE(SendAccept());
1814 channel1_->StartMediaMonitor(100);
1815 channel2_->StartMediaMonitor(100);
1816 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001817 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1818 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 channel1_->StopMediaMonitor();
1820 channel2_->StopMediaMonitor();
1821 // Ensure a restart of a stopped monitor works.
1822 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001823 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 channel1_->StopMediaMonitor();
1825 // Ensure stopping a stopped monitor is OK.
1826 channel1_->StopMediaMonitor();
1827 }
1828
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 void TestSetContentFailure() {
1830 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831
Peter Thatchera6d24442015-07-09 21:26:36 -07001832 auto sdesc = cricket::SessionDescription();
1833 sdesc.AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
1834 new cricket::AudioContentDescription());
1835 sdesc.AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
1836 new cricket::VideoContentDescription());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837
Peter Thatchera6d24442015-07-09 21:26:36 -07001838 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839 media_channel1_->set_fail_set_recv_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001840 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1841 &sdesc, cricket::CA_OFFER, &err));
1842 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1843 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001846 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1847 &sdesc, cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001849 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1850 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 }
1852
1853 void TestSendTwoOffers() {
1854 CreateChannels(0, 0);
1855
Peter Thatchera6d24442015-07-09 21:26:36 -07001856 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001857 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001858 CreateSessionDescriptionWithStream(1));
1859 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1860 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1862
kwiberg31022942016-03-11 14:18:21 -08001863 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001864 CreateSessionDescriptionWithStream(2));
1865 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1866 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1868 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1869 }
1870
1871 void TestReceiveTwoOffers() {
1872 CreateChannels(0, 0);
1873
Peter Thatchera6d24442015-07-09 21:26:36 -07001874 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001875 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001876 CreateSessionDescriptionWithStream(1));
1877 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1878 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1880
kwiberg31022942016-03-11 14:18:21 -08001881 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001882 CreateSessionDescriptionWithStream(2));
1883 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1884 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1886 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1887 }
1888
1889 void TestSendPrAnswer() {
1890 CreateChannels(0, 0);
1891
Peter Thatchera6d24442015-07-09 21:26:36 -07001892 std::string err;
1893 // Receive offer
kwiberg31022942016-03-11 14:18:21 -08001894 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001895 CreateSessionDescriptionWithStream(1));
1896 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1897 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1899
Peter Thatchera6d24442015-07-09 21:26:36 -07001900 // Send PR answer
kwiberg31022942016-03-11 14:18:21 -08001901 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001902 CreateSessionDescriptionWithStream(2));
1903 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1904 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1906 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1907
Peter Thatchera6d24442015-07-09 21:26:36 -07001908 // Send answer
kwiberg31022942016-03-11 14:18:21 -08001909 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001910 CreateSessionDescriptionWithStream(3));
1911 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1912 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1914 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1915 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1916 }
1917
1918 void TestReceivePrAnswer() {
1919 CreateChannels(0, 0);
1920
Peter Thatchera6d24442015-07-09 21:26:36 -07001921 std::string err;
1922 // Send offer
kwiberg31022942016-03-11 14:18:21 -08001923 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001924 CreateSessionDescriptionWithStream(1));
1925 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1926 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1928
Peter Thatchera6d24442015-07-09 21:26:36 -07001929 // Receive PR answer
kwiberg31022942016-03-11 14:18:21 -08001930 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001931 CreateSessionDescriptionWithStream(2));
1932 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1933 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1935 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1936
Peter Thatchera6d24442015-07-09 21:26:36 -07001937 // Receive answer
kwiberg31022942016-03-11 14:18:21 -08001938 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001939 CreateSessionDescriptionWithStream(3));
1940 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1941 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1943 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1944 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1945 }
1946
1947 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001948 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 EXPECT_TRUE(SendInitiate());
1950 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001951 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1952 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953
1954 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 // The sending message is only posted. channel2_ should be empty.
1957 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1959 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960
1961 // When channel1_ is deleted, the RTCP packet should be sent out to
1962 // channel2_.
1963 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001964 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 EXPECT_TRUE(CheckRtcp2());
1966 }
1967
zstein56162b92017-04-24 16:54:35 -07001968 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001969 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971
zstein56162b92017-04-24 16:54:35 -07001972 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 EXPECT_TRUE(media_channel1_->ready_to_send());
1975
zstein56162b92017-04-24 16:54:35 -07001976 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001977 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979 }
1980
zstein56162b92017-04-24 16:54:35 -07001981 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001982 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001983 typename T::Content content;
1984 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001985 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001987 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001988 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001989 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001990 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1991 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992 EXPECT_FALSE(media_channel1_->ready_to_send());
1993 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1994 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001995 network_thread_->Invoke<void>(RTC_FROM_HERE,
1996 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001997 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001999
zstein56162b92017-04-24 16:54:35 -07002000 // TODO(zstein): Find a way to test this without making
2001 // OnTransportReadyToSend public.
2002 network_thread_->Invoke<void>(
2003 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002004 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002005 EXPECT_FALSE(media_channel1_->ready_to_send());
2006 }
2007
skvladdc1c62c2016-03-16 19:07:43 -07002008 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
2009 typename T::Content content;
2010 CreateContent(0, kPcmuCodec, kH264Codec, &content);
2011 content.set_bandwidth(remote_limit);
2012 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
2013 }
2014
deadbeefe702b302017-02-04 12:09:01 -08002015 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07002016 webrtc::RtpParameters parameters;
2017 webrtc::RtpEncodingParameters encoding;
2018 encoding.max_bitrate_bps = limit;
2019 parameters.encodings.push_back(encoding);
2020 return parameters;
2021 }
2022
2023 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08002024 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07002025 EXPECT_EQ(1UL, parameters.encodings.size());
2026 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
2027 }
2028
2029 void DefaultMaxBitrateIsUnlimited() {
2030 CreateChannels(0, 0);
2031 EXPECT_TRUE(
2032 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2033 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08002034 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2035 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002036 }
2037
2038 void CanChangeMaxBitrate() {
2039 CreateChannels(0, 0);
2040 EXPECT_TRUE(
2041 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2042
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07002043 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08002044 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
2045 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2046 rtc::Optional<int>(1000));
2047 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2048 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07002049 EXPECT_EQ(-1, media_channel1_->max_bps());
2050
deadbeefe702b302017-02-04 12:09:01 -08002051 EXPECT_TRUE(channel1_->SetRtpSendParameters(
2052 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
2053 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2054 rtc::Optional<int>());
2055 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2056 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002057 EXPECT_EQ(-1, media_channel1_->max_bps());
2058 }
2059
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002060 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002061 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2062 static void ProcessThreadQueue(rtc::Thread* thread) {
2063 RTC_DCHECK(thread->IsCurrent());
2064 while (!thread->empty()) {
2065 thread->ProcessMessages(0);
2066 }
2067 }
2068 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2069 // |threads| and current thread post packets to network thread.
2070 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002071 thread->Invoke<void>(RTC_FROM_HERE,
2072 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073 }
2074 ProcessThreadQueue(rtc::Thread::Current());
2075 // Network thread move them around and post back to worker = current thread.
2076 if (!network_thread_->IsCurrent()) {
2077 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002078 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002079 }
2080 // Worker thread = current Thread process received messages.
2081 ProcessThreadQueue(rtc::Thread::Current());
2082 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002083 // TODO(pbos): Remove playout from all media channels and let renderers mute
2084 // themselves.
2085 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002086 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2087 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002088 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2089 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2090 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2091 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2092 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2093 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2094 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2095 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002096 cricket::FakeMediaEngine media_engine_;
2097 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002098 typename T::MediaChannel* media_channel1_ = nullptr;
2099 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002100 std::unique_ptr<typename T::Channel> channel1_;
2101 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 typename T::Content local_media_content1_;
2103 typename T::Content local_media_content2_;
2104 typename T::Content remote_media_content1_;
2105 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002107 rtc::Buffer rtp_packet_;
2108 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002109 int media_info_callbacks1_ = 0;
2110 int media_info_callbacks2_ = 0;
2111 int rtcp_mux_activated_callbacks1_ = 0;
2112 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002113 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114};
2115
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116template<>
2117void ChannelTest<VoiceTraits>::CreateContent(
2118 int flags,
2119 const cricket::AudioCodec& audio_codec,
2120 const cricket::VideoCodec& video_codec,
2121 cricket::AudioContentDescription* audio) {
2122 audio->AddCodec(audio_codec);
2123 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2124 if (flags & SECURE) {
2125 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002126 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2127 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128 }
2129}
2130
2131template<>
2132void ChannelTest<VoiceTraits>::CopyContent(
2133 const cricket::AudioContentDescription& source,
2134 cricket::AudioContentDescription* audio) {
2135 *audio = source;
2136}
2137
2138template<>
2139bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2140 const cricket::AudioCodec& c2) {
2141 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2142 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2143}
2144
Peter Boström0c4e06b2015-10-07 12:23:21 +02002145template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002147 uint32_t ssrc,
2148 int flags,
2149 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 audio->AddLegacyStream(ssrc);
2151}
2152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002153class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002154 public:
solenberg1dd98f32015-09-10 01:57:14 -07002155 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002156 VoiceChannelSingleThreadTest()
2157 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2158};
2159
2160class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2161 public:
2162 typedef ChannelTest<VoiceTraits> Base;
2163 VoiceChannelDoubleThreadTest()
2164 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165};
2166
jbauch5869f502017-06-29 12:31:36 -07002167class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2168 : public ChannelTest<VoiceTraits> {
2169 public:
2170 typedef ChannelTest<VoiceTraits> Base;
2171 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2172 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2173 NetworkIsWorker::Yes) {}
2174};
2175
2176class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2177 : public ChannelTest<VoiceTraits> {
2178 public:
2179 typedef ChannelTest<VoiceTraits> Base;
2180 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2181 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2182 NetworkIsWorker::No) {}
2183};
2184
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002186template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002188 rtc::Thread* worker_thread,
2189 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002190 cricket::MediaEngineInterface* engine,
2191 cricket::FakeVideoMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08002192 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2193 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002194 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2195 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002196 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002197 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -08002198 cricket::VideoChannel* channel = new cricket::VideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08002199 worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
deadbeefac22f702017-01-12 21:59:29 -08002200 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002201 if (!channel->NeedsRtcpTransport()) {
2202 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002203 }
deadbeeff5346592017-01-24 21:51:21 -08002204 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2205 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206 delete channel;
2207 channel = NULL;
2208 }
2209 return channel;
2210}
2211
2212// override to add 0 parameter
2213template<>
2214bool ChannelTest<VideoTraits>::AddStream1(int id) {
2215 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2216}
2217
2218template<>
2219void ChannelTest<VideoTraits>::CreateContent(
2220 int flags,
2221 const cricket::AudioCodec& audio_codec,
2222 const cricket::VideoCodec& video_codec,
2223 cricket::VideoContentDescription* video) {
2224 video->AddCodec(video_codec);
2225 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2226 if (flags & SECURE) {
2227 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002228 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2229 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 }
2231}
2232
2233template<>
2234void ChannelTest<VideoTraits>::CopyContent(
2235 const cricket::VideoContentDescription& source,
2236 cricket::VideoContentDescription* video) {
2237 *video = source;
2238}
2239
2240template<>
2241bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2242 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002243 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244}
2245
Peter Boström0c4e06b2015-10-07 12:23:21 +02002246template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002248 uint32_t ssrc,
2249 int flags,
2250 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251 video->AddLegacyStream(ssrc);
2252}
2253
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255 public:
solenberg1dd98f32015-09-10 01:57:14 -07002256 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002257 VideoChannelSingleThreadTest()
2258 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259};
2260
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2262 public:
2263 typedef ChannelTest<VideoTraits> Base;
2264 VideoChannelDoubleThreadTest()
2265 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2266};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268// VoiceChannelSingleThreadTest
kjellander7c856582017-02-26 19:53:40 -08002269// Flaky on iOS Simualtor: bugs.webrtc.org/7247
2270#if defined(WEBRTC_IOS)
2271#define MAYBE_TestInit DISABLED_TestInit
2272#else
2273#define MAYBE_TestInit TestInit
2274#endif
2275TEST_F(VoiceChannelSingleThreadTest, MAYBE_TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002276 Base::TestInit();
2277 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2278 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2279}
2280
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002281TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2282 Base::TestDeinit();
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286 Base::TestSetContents();
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290 Base::TestSetContentsNullOffer();
2291}
2292
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002293TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294 Base::TestSetContentsRtcpMux();
2295}
2296
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 Base::TestSetContentsRtcpMux();
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::TestSetRemoteContentUpdate();
2303}
2304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::TestStreams();
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 Base::TestUpdateStreamsInLocalContent();
2311}
2312
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002313TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 Base::TestUpdateStreamsInRemoteContent();
2315}
2316
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002317TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 Base::TestChangeStreamParamsInContent();
2319}
2320
jbauch5869f502017-06-29 12:31:36 -07002321TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2322 TestChangeEncryptedHeaderExtensionsDtls) {
2323 int flags = DTLS;
2324 Base::TestChangeEncryptedHeaderExtensions(flags);
2325}
2326
2327TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2328 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2329 int flags = DTLS;
2330 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2331}
2332
2333TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2334 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2335 int flags = DTLS;
2336 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2337}
2338
2339TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2340 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2341 int flags = DTLS | GCM_CIPHER;
2342 Base::TestChangeEncryptedHeaderExtensions(flags);
2343}
2344
2345TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2346 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2347 int flags = DTLS | GCM_CIPHER;
2348 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2349}
2350
2351TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2352 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2353 int flags = DTLS | GCM_CIPHER;
2354 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2355}
2356
2357TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2358 TestChangeEncryptedHeaderExtensionsSDES) {
2359 int flags = 0;
2360 Base::TestChangeEncryptedHeaderExtensions(flags);
2361}
2362
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002363TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364 Base::TestPlayoutAndSendingStates();
2365}
2366
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002367TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002368 CreateChannels(0, 0);
2369 // Test that we can Mute the default channel even though the sending SSRC
2370 // is unknown.
2371 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002372 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002373 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2374 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002375 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2376
2377 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002378 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002379
2380 SendInitiate();
2381 // After the local session description has been set, we can mute a stream
2382 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002383 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002384 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2385 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002386 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002389TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 Base::TestMediaContentDirection();
2391}
2392
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002393TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002394 Base::TestNetworkRouteChanges();
2395}
2396
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002397TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398 Base::TestCallSetup();
2399}
2400
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002401TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402 Base::TestCallTeardownRtcpMux();
2403}
2404
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002405TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 Base::SendRtpToRtp();
2407}
2408
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002409TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 Base::SendRtcpToRtcp();
2411}
2412
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 Base::SendRtcpMuxToRtcp();
2415}
2416
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002417TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 Base::SendRtcpMuxToRtcpMux();
2419}
2420
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002421TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002422 Base::SendRequireRtcpMuxToRtcpMux();
2423}
2424
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002426 Base::SendRtcpMuxToRequireRtcpMux();
2427}
2428
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002430 Base::SendRequireRtcpMuxToRequireRtcpMux();
2431}
2432
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002434 Base::SendRequireRtcpMuxToNoRtcpMux();
2435}
2436
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 Base::SendEarlyRtcpMuxToRtcp();
2439}
2440
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 Base::SendEarlyRtcpMuxToRtcpMux();
2443}
2444
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2447}
2448
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450 Base::SendSrtpToSrtp();
2451}
2452
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002454 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2455}
2456
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 Base::SendSrtpToSrtp(DTLS, 0);
2459}
2460
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 Base::SendSrtpToSrtp(DTLS, DTLS);
2463}
2464
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2467}
2468
deadbeeff5346592017-01-24 21:51:21 -08002469// Test using the channel with a raw packet interface, as opposed to a DTLS
2470// transport interface.
2471TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2472 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2473}
2474
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002475TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002476 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2477}
2478
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002479TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 Base::SendRtpToRtpOnThread();
2481}
2482
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002483TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 Base::SendSrtpToSrtpOnThread();
2485}
2486
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002487TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 Base::SendWithWritabilityLoss();
2489}
2490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002491TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::TestMediaMonitor();
2493}
2494
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002496TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 CreateChannels(0, 0);
2498 EXPECT_TRUE(SendInitiate());
2499 EXPECT_TRUE(SendAccept());
2500 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2501
solenberg1d63dd02015-12-02 12:35:09 -08002502 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2503 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2504 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002506 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002508 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002509 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002510 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002511 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002512 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513}
2514
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002515TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 Base::TestSetContentFailure();
2517}
2518
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002519TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 Base::TestSendTwoOffers();
2521}
2522
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002523TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 Base::TestReceiveTwoOffers();
2525}
2526
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002527TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 Base::TestSendPrAnswer();
2529}
2530
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002531TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 Base::TestReceivePrAnswer();
2533}
2534
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002535TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 Base::TestFlushRtcp();
2537}
2538
zstein56162b92017-04-24 16:54:35 -07002539TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2540 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541}
2542
zstein56162b92017-04-24 16:54:35 -07002543TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2544 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545}
2546
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002548TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002549 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 EXPECT_TRUE(SendInitiate());
2551 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002552 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553
solenberg4bac9c52015-10-09 02:32:53 -07002554 // Default is (1.0).
2555 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2556 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002558 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559
solenberg4bac9c52015-10-09 02:32:53 -07002560 // Set scale to (1.5).
2561 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2562 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2563 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564
solenberg4bac9c52015-10-09 02:32:53 -07002565 // Set scale to (0).
2566 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2567 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2568 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569}
2570
2571// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002572TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002573 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574 EXPECT_TRUE(SendInitiate());
2575 EXPECT_TRUE(SendAccept());
2576 EXPECT_TRUE(AddStream1(1));
2577 EXPECT_TRUE(AddStream1(2));
2578
solenberg4bac9c52015-10-09 02:32:53 -07002579 double volume;
2580 // Default is (1.0).
2581 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2582 EXPECT_DOUBLE_EQ(1.0, volume);
2583 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2584 EXPECT_DOUBLE_EQ(1.0, volume);
2585 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2586 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002588 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589
solenberg4bac9c52015-10-09 02:32:53 -07002590 // Set scale to (1.5) for ssrc = 1.
2591 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2592 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2593 EXPECT_DOUBLE_EQ(1.5, volume);
2594 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2595 EXPECT_DOUBLE_EQ(1.0, volume);
2596 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2597 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598
solenberg4bac9c52015-10-09 02:32:53 -07002599 // Set scale to (0) for all ssrcs.
2600 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2601 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2602 EXPECT_DOUBLE_EQ(0.0, volume);
2603 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2604 EXPECT_DOUBLE_EQ(0.0, volume);
2605 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2606 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002607}
2608
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002609TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002610 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611}
2612
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002613TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002614 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002615}
2616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002617TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002618 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002619}
2620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002621TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002622 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623}
2624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002625TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002626 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002627}
2628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002629TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002630 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002631}
2632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002633// VoiceChannelDoubleThreadTest
2634TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002636 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2637 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002638}
2639
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002640TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2641 Base::TestDeinit();
2642}
2643
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002644TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 Base::TestSetContents();
2646}
2647
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002648TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 Base::TestSetContentsNullOffer();
2650}
2651
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002652TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002653 Base::TestSetContentsRtcpMux();
2654}
2655
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002656TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 Base::TestSetContentsRtcpMux();
2658}
2659
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002660TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 Base::TestSetRemoteContentUpdate();
2662}
2663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002664TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 Base::TestStreams();
2666}
2667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002668TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 Base::TestUpdateStreamsInLocalContent();
2670}
2671
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002672TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 Base::TestUpdateStreamsInRemoteContent();
2674}
2675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002676TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 Base::TestChangeStreamParamsInContent();
2678}
2679
jbauch5869f502017-06-29 12:31:36 -07002680TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2681 TestChangeEncryptedHeaderExtensionsDtls) {
2682 int flags = DTLS;
2683 Base::TestChangeEncryptedHeaderExtensions(flags);
2684}
2685
2686TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2687 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2688 int flags = DTLS;
2689 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2690}
2691
2692TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2693 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2694 int flags = DTLS;
2695 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2696}
2697
2698TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2699 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2700 int flags = DTLS | GCM_CIPHER;
2701 Base::TestChangeEncryptedHeaderExtensions(flags);
2702}
2703
2704TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2705 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2706 int flags = DTLS | GCM_CIPHER;
2707 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2708}
2709
2710TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2711 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2712 int flags = DTLS | GCM_CIPHER;
2713 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2714}
2715
2716TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2717 TestChangeEncryptedHeaderExtensionsSDES) {
2718 int flags = 0;
2719 Base::TestChangeEncryptedHeaderExtensions(flags);
2720}
2721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002722TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 Base::TestPlayoutAndSendingStates();
2724}
2725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002726TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2727 CreateChannels(0, 0);
2728 // Test that we can Mute the default channel even though the sending SSRC
2729 // is unknown.
2730 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2731 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2732 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2733 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2734 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2735
2736 // Test that we can not mute an unknown SSRC.
2737 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2738
2739 SendInitiate();
2740 // After the local session description has been set, we can mute a stream
2741 // with its SSRC.
2742 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2743 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2744 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2745 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2746}
2747
2748TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2749 Base::TestMediaContentDirection();
2750}
2751
2752TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2753 Base::TestNetworkRouteChanges();
2754}
2755
2756TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2757 Base::TestCallSetup();
2758}
2759
2760TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2761 Base::TestCallTeardownRtcpMux();
2762}
2763
2764TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2765 Base::SendRtpToRtp();
2766}
2767
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002768TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2769 Base::SendRtcpToRtcp();
2770}
2771
2772TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2773 Base::SendRtcpMuxToRtcp();
2774}
2775
2776TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2777 Base::SendRtcpMuxToRtcpMux();
2778}
2779
2780TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2781 Base::SendRequireRtcpMuxToRtcpMux();
2782}
2783
2784TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2785 Base::SendRtcpMuxToRequireRtcpMux();
2786}
2787
2788TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2789 Base::SendRequireRtcpMuxToRequireRtcpMux();
2790}
2791
2792TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2793 Base::SendRequireRtcpMuxToNoRtcpMux();
2794}
2795
2796TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2797 Base::SendEarlyRtcpMuxToRtcp();
2798}
2799
2800TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2801 Base::SendEarlyRtcpMuxToRtcpMux();
2802}
2803
2804TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2805 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2806}
2807
2808TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2809 Base::SendSrtpToSrtp();
2810}
2811
2812TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2813 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2814}
2815
2816TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002817 Base::SendSrtpToSrtp(DTLS, 0);
2818}
2819
2820TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002821 Base::SendSrtpToSrtp(DTLS, DTLS);
2822}
2823
2824TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002825 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2826}
2827
deadbeeff5346592017-01-24 21:51:21 -08002828// Test using the channel with a raw packet interface, as opposed to a DTLS
2829// transport interface.
2830TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2831 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2832}
2833
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002834TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2835 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2836}
2837
2838TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2839 Base::SendRtpToRtpOnThread();
2840}
2841
2842TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2843 Base::SendSrtpToSrtpOnThread();
2844}
2845
2846TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2847 Base::SendWithWritabilityLoss();
2848}
2849
2850TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2851 Base::TestMediaMonitor();
2852}
2853
2854// Test that InsertDtmf properly forwards to the media channel.
2855TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2856 CreateChannels(0, 0);
2857 EXPECT_TRUE(SendInitiate());
2858 EXPECT_TRUE(SendAccept());
2859 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2860
2861 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2862 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2863 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2864
2865 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2866 EXPECT_TRUE(
2867 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2868 EXPECT_TRUE(
2869 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2870 EXPECT_TRUE(
2871 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2872}
2873
2874TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2875 Base::TestSetContentFailure();
2876}
2877
2878TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2879 Base::TestSendTwoOffers();
2880}
2881
2882TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2883 Base::TestReceiveTwoOffers();
2884}
2885
2886TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2887 Base::TestSendPrAnswer();
2888}
2889
2890TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2891 Base::TestReceivePrAnswer();
2892}
2893
2894TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2895 Base::TestFlushRtcp();
2896}
2897
zstein56162b92017-04-24 16:54:35 -07002898TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2899 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002900}
2901
zstein56162b92017-04-24 16:54:35 -07002902TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2903 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002904}
2905
2906// Test that we can scale the output volume properly for 1:1 calls.
2907TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002908 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002909 EXPECT_TRUE(SendInitiate());
2910 EXPECT_TRUE(SendAccept());
2911 double volume;
2912
2913 // Default is (1.0).
2914 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2915 EXPECT_DOUBLE_EQ(1.0, volume);
2916 // invalid ssrc.
2917 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2918
2919 // Set scale to (1.5).
2920 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2921 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2922 EXPECT_DOUBLE_EQ(1.5, volume);
2923
2924 // Set scale to (0).
2925 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2926 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2927 EXPECT_DOUBLE_EQ(0.0, volume);
2928}
2929
2930// Test that we can scale the output volume properly for multiway calls.
2931TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002932 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002933 EXPECT_TRUE(SendInitiate());
2934 EXPECT_TRUE(SendAccept());
2935 EXPECT_TRUE(AddStream1(1));
2936 EXPECT_TRUE(AddStream1(2));
2937
2938 double volume;
2939 // Default is (1.0).
2940 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2941 EXPECT_DOUBLE_EQ(1.0, volume);
2942 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2943 EXPECT_DOUBLE_EQ(1.0, volume);
2944 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2945 EXPECT_DOUBLE_EQ(1.0, volume);
2946 // invalid ssrc.
2947 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2948
2949 // Set scale to (1.5) for ssrc = 1.
2950 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2951 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2952 EXPECT_DOUBLE_EQ(1.5, volume);
2953 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2954 EXPECT_DOUBLE_EQ(1.0, volume);
2955 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2956 EXPECT_DOUBLE_EQ(1.0, volume);
2957
2958 // Set scale to (0) for all ssrcs.
2959 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2960 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2961 EXPECT_DOUBLE_EQ(0.0, volume);
2962 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2963 EXPECT_DOUBLE_EQ(0.0, volume);
2964 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2965 EXPECT_DOUBLE_EQ(0.0, volume);
2966}
2967
2968TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2969 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2970}
2971
2972TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2973 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2974}
2975
2976TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2977 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2978}
2979
2980TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2981 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2982}
2983
2984TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2985 Base::DefaultMaxBitrateIsUnlimited();
2986}
2987
2988TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2989 Base::CanChangeMaxBitrate();
2990}
2991
2992// VideoChannelSingleThreadTest
2993TEST_F(VideoChannelSingleThreadTest, TestInit) {
2994 Base::TestInit();
2995}
2996
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002997TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2998 Base::TestDeinit();
2999}
3000
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003001TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
3002 Base::TestSetContents();
3003}
3004
3005TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3006 Base::TestSetContentsNullOffer();
3007}
3008
3009TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3010 Base::TestSetContentsRtcpMux();
3011}
3012
3013TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3014 Base::TestSetContentsRtcpMux();
3015}
3016
3017TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3018 Base::TestSetRemoteContentUpdate();
3019}
3020
3021TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3022 Base::TestStreams();
3023}
3024
3025TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3026 Base::TestUpdateStreamsInLocalContent();
3027}
3028
3029TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3030 Base::TestUpdateStreamsInRemoteContent();
3031}
3032
3033TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3034 Base::TestChangeStreamParamsInContent();
3035}
3036
3037TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3038 Base::TestPlayoutAndSendingStates();
3039}
3040
3041TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003042 CreateChannels(0, 0);
3043 // Test that we can Mute the default channel even though the sending SSRC
3044 // is unknown.
3045 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003046 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003047 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003048 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003049 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3050 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003051 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003052 SendInitiate();
3053 // After the local session description has been set, we can mute a stream
3054 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003055 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003056 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003057 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003058 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003059}
3060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003061TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003062 Base::TestMediaContentDirection();
3063}
3064
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003065TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003066 Base::TestNetworkRouteChanges();
3067}
3068
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003069TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070 Base::TestCallSetup();
3071}
3072
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003073TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003074 Base::TestCallTeardownRtcpMux();
3075}
3076
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003077TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078 Base::SendRtpToRtp();
3079}
3080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003081TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003082 Base::SendRtcpToRtcp();
3083}
3084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003085TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086 Base::SendRtcpMuxToRtcp();
3087}
3088
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003089TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003090 Base::SendRtcpMuxToRtcpMux();
3091}
3092
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003093TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003094 Base::SendRequireRtcpMuxToRtcpMux();
3095}
3096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003097TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003098 Base::SendRtcpMuxToRequireRtcpMux();
3099}
3100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003101TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003102 Base::SendRequireRtcpMuxToRequireRtcpMux();
3103}
3104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003105TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003106 Base::SendRequireRtcpMuxToNoRtcpMux();
3107}
3108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003109TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110 Base::SendEarlyRtcpMuxToRtcp();
3111}
3112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003113TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114 Base::SendEarlyRtcpMuxToRtcpMux();
3115}
3116
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003117TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003118 Base::SendSrtpToSrtp();
3119}
3120
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003121TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003122 Base::SendSrtpToSrtp();
3123}
3124
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003125TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126 Base::SendSrtpToSrtp(DTLS, 0);
3127}
3128
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003129TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003130 Base::SendSrtpToSrtp(DTLS, DTLS);
3131}
3132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003133TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003134 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3135}
3136
deadbeeff5346592017-01-24 21:51:21 -08003137// Test using the channel with a raw packet interface, as opposed to a DTLS
3138// transport interface.
3139TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3140 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3141}
3142
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003143TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003144 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3145}
3146
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003147TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003148 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3149}
3150
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003151TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003152 Base::SendRtpToRtpOnThread();
3153}
3154
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003155TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003156 Base::SendSrtpToSrtpOnThread();
3157}
3158
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003159TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003160 Base::SendWithWritabilityLoss();
3161}
3162
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003163TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003164 Base::TestMediaMonitor();
3165}
3166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003167TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003168 Base::TestSetContentFailure();
3169}
3170
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003171TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003172 Base::TestSendTwoOffers();
3173}
3174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003175TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003176 Base::TestReceiveTwoOffers();
3177}
3178
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003179TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003180 Base::TestSendPrAnswer();
3181}
3182
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003183TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 Base::TestReceivePrAnswer();
3185}
3186
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003187TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003188 Base::TestFlushRtcp();
3189}
3190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003191TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003192 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003193}
3194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003195TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003196 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003197}
3198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003199TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003200 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003201}
3202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003203TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003204 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003205}
3206
zstein56162b92017-04-24 16:54:35 -07003207TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3208 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003209}
3210
zstein56162b92017-04-24 16:54:35 -07003211TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3212 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003213}
3214
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003215TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003216 Base::DefaultMaxBitrateIsUnlimited();
3217}
3218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003219TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003220 Base::CanChangeMaxBitrate();
3221}
3222
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003223// VideoChannelDoubleThreadTest
3224TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3225 Base::TestInit();
3226}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003227
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003228TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3229 Base::TestDeinit();
3230}
3231
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003232TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3233 Base::TestSetContents();
3234}
3235
3236TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3237 Base::TestSetContentsNullOffer();
3238}
3239
3240TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3241 Base::TestSetContentsRtcpMux();
3242}
3243
3244TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3245 Base::TestSetContentsRtcpMux();
3246}
3247
3248TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3249 Base::TestSetRemoteContentUpdate();
3250}
3251
3252TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3253 Base::TestStreams();
3254}
3255
3256TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3257 Base::TestUpdateStreamsInLocalContent();
3258}
3259
3260TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3261 Base::TestUpdateStreamsInRemoteContent();
3262}
3263
3264TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3265 Base::TestChangeStreamParamsInContent();
3266}
3267
3268TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3269 Base::TestPlayoutAndSendingStates();
3270}
3271
3272TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3273 CreateChannels(0, 0);
3274 // Test that we can Mute the default channel even though the sending SSRC
3275 // is unknown.
3276 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003277 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003278 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003279 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003280 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3281 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003282 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003283 SendInitiate();
3284 // After the local session description has been set, we can mute a stream
3285 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003286 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003287 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003288 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003289 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3290}
3291
3292TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3293 Base::TestMediaContentDirection();
3294}
3295
3296TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3297 Base::TestNetworkRouteChanges();
3298}
3299
3300TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3301 Base::TestCallSetup();
3302}
3303
3304TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3305 Base::TestCallTeardownRtcpMux();
3306}
3307
3308TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3309 Base::SendRtpToRtp();
3310}
3311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003312TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3313 Base::SendRtcpToRtcp();
3314}
3315
3316TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3317 Base::SendRtcpMuxToRtcp();
3318}
3319
3320TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3321 Base::SendRtcpMuxToRtcpMux();
3322}
3323
3324TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3325 Base::SendRequireRtcpMuxToRtcpMux();
3326}
3327
3328TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3329 Base::SendRtcpMuxToRequireRtcpMux();
3330}
3331
3332TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3333 Base::SendRequireRtcpMuxToRequireRtcpMux();
3334}
3335
3336TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3337 Base::SendRequireRtcpMuxToNoRtcpMux();
3338}
3339
3340TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3341 Base::SendEarlyRtcpMuxToRtcp();
3342}
3343
3344TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3345 Base::SendEarlyRtcpMuxToRtcpMux();
3346}
3347
3348TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3349 Base::SendSrtpToSrtp();
3350}
3351
3352TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3353 Base::SendSrtpToSrtp();
3354}
3355
3356TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003357 Base::SendSrtpToSrtp(DTLS, 0);
3358}
3359
3360TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003361 Base::SendSrtpToSrtp(DTLS, DTLS);
3362}
3363
3364TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003365 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3366}
3367
deadbeeff5346592017-01-24 21:51:21 -08003368// Test using the channel with a raw packet interface, as opposed to a DTLS
3369// transport interface.
3370TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3371 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3372}
3373
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003374TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3375 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3376}
3377
3378TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3379 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3380}
3381
3382TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3383 Base::SendRtpToRtpOnThread();
3384}
3385
3386TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3387 Base::SendSrtpToSrtpOnThread();
3388}
3389
3390TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3391 Base::SendWithWritabilityLoss();
3392}
3393
3394TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3395 Base::TestMediaMonitor();
3396}
3397
3398TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3399 Base::TestSetContentFailure();
3400}
3401
3402TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3403 Base::TestSendTwoOffers();
3404}
3405
3406TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3407 Base::TestReceiveTwoOffers();
3408}
3409
3410TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3411 Base::TestSendPrAnswer();
3412}
3413
3414TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3415 Base::TestReceivePrAnswer();
3416}
3417
3418TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3419 Base::TestFlushRtcp();
3420}
3421
3422TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3423 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3424}
3425
3426TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3427 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3428}
3429
3430TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3431 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3432}
3433
3434TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3435 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3436}
3437
zstein56162b92017-04-24 16:54:35 -07003438TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3439 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003440}
3441
zstein56162b92017-04-24 16:54:35 -07003442TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3443 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003444}
3445
3446TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3447 Base::DefaultMaxBitrateIsUnlimited();
3448}
3449
3450TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3451 Base::CanChangeMaxBitrate();
3452}
3453
deadbeef953c2ce2017-01-09 14:53:41 -08003454// RtpDataChannelSingleThreadTest
3455class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003456 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003457 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003458 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003459 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3460};
3461
deadbeef953c2ce2017-01-09 14:53:41 -08003462// RtpDataChannelDoubleThreadTest
3463class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003464 public:
3465 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003466 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003467 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003468};
3469
3470// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003471template <>
deadbeef953c2ce2017-01-09 14:53:41 -08003472cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003473 rtc::Thread* worker_thread,
3474 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003475 cricket::MediaEngineInterface* engine,
3476 cricket::FakeDataMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08003477 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3478 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003479 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3480 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003481 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003482 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef953c2ce2017-01-09 14:53:41 -08003483 cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08003484 worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
deadbeefac22f702017-01-12 21:59:29 -08003485 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003486 if (!channel->NeedsRtcpTransport()) {
3487 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003488 }
deadbeeff5346592017-01-24 21:51:21 -08003489 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3490 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003491 delete channel;
3492 channel = NULL;
3493 }
3494 return channel;
3495}
3496
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003497template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003498void ChannelTest<DataTraits>::CreateContent(
3499 int flags,
3500 const cricket::AudioCodec& audio_codec,
3501 const cricket::VideoCodec& video_codec,
3502 cricket::DataContentDescription* data) {
3503 data->AddCodec(kGoogleDataCodec);
3504 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3505 if (flags & SECURE) {
3506 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003507 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3508 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003509 }
3510}
3511
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003512template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003513void ChannelTest<DataTraits>::CopyContent(
3514 const cricket::DataContentDescription& source,
3515 cricket::DataContentDescription* data) {
3516 *data = source;
3517}
3518
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003519template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003520bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3521 const cricket::DataCodec& c2) {
3522 return c1.name == c2.name;
3523}
3524
Peter Boström0c4e06b2015-10-07 12:23:21 +02003525template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003526void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003527 uint32_t ssrc,
3528 int flags,
3529 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003530 data->AddLegacyStream(ssrc);
3531}
3532
deadbeef953c2ce2017-01-09 14:53:41 -08003533TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003534 Base::TestInit();
3535 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3536}
3537
deadbeef953c2ce2017-01-09 14:53:41 -08003538TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003539 Base::TestDeinit();
3540}
3541
deadbeef953c2ce2017-01-09 14:53:41 -08003542TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003543 Base::TestSetContents();
3544}
3545
deadbeef953c2ce2017-01-09 14:53:41 -08003546TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003547 Base::TestSetContentsNullOffer();
3548}
3549
deadbeef953c2ce2017-01-09 14:53:41 -08003550TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003551 Base::TestSetContentsRtcpMux();
3552}
3553
deadbeef953c2ce2017-01-09 14:53:41 -08003554TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003555 Base::TestSetRemoteContentUpdate();
3556}
3557
deadbeef953c2ce2017-01-09 14:53:41 -08003558TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003559 Base::TestStreams();
3560}
3561
deadbeef953c2ce2017-01-09 14:53:41 -08003562TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003563 Base::TestUpdateStreamsInLocalContent();
3564}
3565
deadbeef953c2ce2017-01-09 14:53:41 -08003566TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003567 Base::TestUpdateStreamsInRemoteContent();
3568}
3569
deadbeef953c2ce2017-01-09 14:53:41 -08003570TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003571 Base::TestChangeStreamParamsInContent();
3572}
3573
deadbeef953c2ce2017-01-09 14:53:41 -08003574TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003575 Base::TestPlayoutAndSendingStates();
3576}
3577
deadbeef953c2ce2017-01-09 14:53:41 -08003578TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003579 Base::TestMediaContentDirection();
3580}
3581
deadbeef953c2ce2017-01-09 14:53:41 -08003582TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003583 Base::TestCallSetup();
3584}
3585
deadbeef953c2ce2017-01-09 14:53:41 -08003586TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003587 Base::TestCallTeardownRtcpMux();
3588}
3589
zstein56162b92017-04-24 16:54:35 -07003590TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3591 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003592}
3593
zstein56162b92017-04-24 16:54:35 -07003594TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3595 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003596}
3597
deadbeef953c2ce2017-01-09 14:53:41 -08003598TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003599 Base::SendRtpToRtp();
3600}
3601
deadbeef953c2ce2017-01-09 14:53:41 -08003602TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003603 Base::SendRtcpToRtcp();
3604}
3605
deadbeef953c2ce2017-01-09 14:53:41 -08003606TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003607 Base::SendRtcpMuxToRtcp();
3608}
3609
deadbeef953c2ce2017-01-09 14:53:41 -08003610TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003611 Base::SendRtcpMuxToRtcpMux();
3612}
3613
deadbeef953c2ce2017-01-09 14:53:41 -08003614TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003615 Base::SendEarlyRtcpMuxToRtcp();
3616}
3617
deadbeef953c2ce2017-01-09 14:53:41 -08003618TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003619 Base::SendEarlyRtcpMuxToRtcpMux();
3620}
3621
deadbeef953c2ce2017-01-09 14:53:41 -08003622TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003623 Base::SendSrtpToSrtp();
3624}
3625
deadbeef953c2ce2017-01-09 14:53:41 -08003626TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003627 Base::SendSrtpToSrtp();
3628}
3629
deadbeef953c2ce2017-01-09 14:53:41 -08003630TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003631 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3632}
3633
deadbeef953c2ce2017-01-09 14:53:41 -08003634TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003635 Base::SendRtpToRtpOnThread();
3636}
3637
deadbeef953c2ce2017-01-09 14:53:41 -08003638TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003639 Base::SendSrtpToSrtpOnThread();
3640}
3641
deadbeef953c2ce2017-01-09 14:53:41 -08003642TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003643 Base::SendWithWritabilityLoss();
3644}
3645
deadbeef953c2ce2017-01-09 14:53:41 -08003646TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003647 Base::TestMediaMonitor();
3648}
3649
deadbeef953c2ce2017-01-09 14:53:41 -08003650TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003651 CreateChannels(0, 0);
3652 EXPECT_TRUE(SendInitiate());
3653 EXPECT_TRUE(SendAccept());
3654
3655 cricket::SendDataParams params;
3656 params.ssrc = 42;
3657 unsigned char data[] = {'f', 'o', 'o'};
3658 rtc::CopyOnWriteBuffer payload(data, 3);
3659 cricket::SendDataResult result;
3660 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3661 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3662 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3663}
3664
deadbeef953c2ce2017-01-09 14:53:41 -08003665TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003666 Base::TestInit();
3667 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3668}
3669
deadbeef953c2ce2017-01-09 14:53:41 -08003670TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003671 Base::TestDeinit();
3672}
3673
deadbeef953c2ce2017-01-09 14:53:41 -08003674TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003675 Base::TestSetContents();
3676}
3677
deadbeef953c2ce2017-01-09 14:53:41 -08003678TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003679 Base::TestSetContentsNullOffer();
3680}
3681
deadbeef953c2ce2017-01-09 14:53:41 -08003682TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003683 Base::TestSetContentsRtcpMux();
3684}
3685
deadbeef953c2ce2017-01-09 14:53:41 -08003686TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003687 Base::TestSetRemoteContentUpdate();
3688}
3689
deadbeef953c2ce2017-01-09 14:53:41 -08003690TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003691 Base::TestStreams();
3692}
3693
deadbeef953c2ce2017-01-09 14:53:41 -08003694TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003695 Base::TestUpdateStreamsInLocalContent();
3696}
3697
deadbeef953c2ce2017-01-09 14:53:41 -08003698TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003699 Base::TestUpdateStreamsInRemoteContent();
3700}
3701
deadbeef953c2ce2017-01-09 14:53:41 -08003702TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003703 Base::TestChangeStreamParamsInContent();
3704}
3705
deadbeef953c2ce2017-01-09 14:53:41 -08003706TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003707 Base::TestPlayoutAndSendingStates();
3708}
3709
deadbeef953c2ce2017-01-09 14:53:41 -08003710TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003711 Base::TestMediaContentDirection();
3712}
3713
deadbeef953c2ce2017-01-09 14:53:41 -08003714TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003715 Base::TestCallSetup();
3716}
3717
deadbeef953c2ce2017-01-09 14:53:41 -08003718TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003719 Base::TestCallTeardownRtcpMux();
3720}
3721
zstein56162b92017-04-24 16:54:35 -07003722TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3723 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003724}
3725
zstein56162b92017-04-24 16:54:35 -07003726TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3727 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003728}
3729
deadbeef953c2ce2017-01-09 14:53:41 -08003730TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003731 Base::SendRtpToRtp();
3732}
3733
deadbeef953c2ce2017-01-09 14:53:41 -08003734TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003735 Base::SendRtcpToRtcp();
3736}
3737
deadbeef953c2ce2017-01-09 14:53:41 -08003738TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003739 Base::SendRtcpMuxToRtcp();
3740}
3741
deadbeef953c2ce2017-01-09 14:53:41 -08003742TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003743 Base::SendRtcpMuxToRtcpMux();
3744}
3745
deadbeef953c2ce2017-01-09 14:53:41 -08003746TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003747 Base::SendEarlyRtcpMuxToRtcp();
3748}
3749
deadbeef953c2ce2017-01-09 14:53:41 -08003750TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003751 Base::SendEarlyRtcpMuxToRtcpMux();
3752}
3753
deadbeef953c2ce2017-01-09 14:53:41 -08003754TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003755 Base::SendSrtpToSrtp();
3756}
3757
deadbeef953c2ce2017-01-09 14:53:41 -08003758TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003759 Base::SendSrtpToSrtp();
3760}
3761
deadbeef953c2ce2017-01-09 14:53:41 -08003762TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003763 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3764}
3765
deadbeef953c2ce2017-01-09 14:53:41 -08003766TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003767 Base::SendRtpToRtpOnThread();
3768}
3769
deadbeef953c2ce2017-01-09 14:53:41 -08003770TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003771 Base::SendSrtpToSrtpOnThread();
3772}
3773
deadbeef953c2ce2017-01-09 14:53:41 -08003774TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003775 Base::SendWithWritabilityLoss();
3776}
3777
deadbeef953c2ce2017-01-09 14:53:41 -08003778TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003779 Base::TestMediaMonitor();
3780}
3781
deadbeef953c2ce2017-01-09 14:53:41 -08003782TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003783 CreateChannels(0, 0);
3784 EXPECT_TRUE(SendInitiate());
3785 EXPECT_TRUE(SendAccept());
3786
3787 cricket::SendDataParams params;
3788 params.ssrc = 42;
3789 unsigned char data[] = {
3790 'f', 'o', 'o'
3791 };
jbaucheec21bd2016-03-20 06:15:43 -07003792 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003793 cricket::SendDataResult result;
3794 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3795 EXPECT_EQ(params.ssrc,
3796 media_channel1_->last_sent_data_params().ssrc);
3797 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3798}
3799
deadbeefbad5dad2017-01-17 18:32:35 -08003800#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3801
3802// Verifies some DCHECKs are in place.
3803// Uses VoiceChannel, but any BaseChannel subclass would work.
3804class BaseChannelDeathTest : public testing::Test {
3805 public:
3806 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003807 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3808 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3809 // RTCP mux not required, SRTP required.
deadbeefbad5dad2017-01-17 18:32:35 -08003810 voice_channel_(
3811 rtc::Thread::Current(),
3812 rtc::Thread::Current(),
3813 rtc::Thread::Current(),
3814 &fake_media_engine_,
3815 new cricket::FakeVoiceMediaChannel(nullptr,
3816 cricket::AudioOptions()),
3817 cricket::CN_AUDIO,
3818 false,
deadbeeff5346592017-01-24 21:51:21 -08003819 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003820
3821 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003822 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003823 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3824 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003825 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003826};
3827
deadbeeff5346592017-01-24 21:51:21 -08003828TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
3829 ASSERT_TRUE(voice_channel_.Init_w(
3830 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3831 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3832 cricket::FakeDtlsTransport new_rtcp_transport(
3833 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3834 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003835}
3836
deadbeeff5346592017-01-24 21:51:21 -08003837TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
3838 ASSERT_TRUE(voice_channel_.Init_w(
3839 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3840 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3841 cricket::FakeDtlsTransport new_rtp_transport(
3842 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3843 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003844}
3845
deadbeeff5346592017-01-24 21:51:21 -08003846TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
3847 ASSERT_TRUE(voice_channel_.Init_w(
3848 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3849 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
deadbeefbad5dad2017-01-17 18:32:35 -08003850 // Activate RTCP muxing, simulating offer/answer negotiation.
3851 cricket::AudioContentDescription content;
3852 content.set_rtcp_mux(true);
3853 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3854 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003855 cricket::FakeDtlsTransport new_rtp_transport(
3856 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3857 cricket::FakeDtlsTransport new_rtcp_transport(
3858 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003859 // After muxing is enabled, no RTCP transport should be passed in here.
3860 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003861 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3862 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003863}
3864
3865// This test will probably go away if/when we move the transport name out of
3866// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003867TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
3868 ASSERT_TRUE(voice_channel_.Init_w(
3869 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3870 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3871 cricket::FakeDtlsTransport new_rtp_transport(
3872 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3873 cricket::FakeDtlsTransport new_rtcp_transport(
3874 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003875 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003876 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3877 "");
3878}
3879
3880// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003881// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003882TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
3883 ASSERT_TRUE(voice_channel_.Init_w(
3884 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3885 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3886 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003887 voice_channel_.SetTransports(
3888 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3889 static_cast<rtc::PacketTransportInternal*>(
3890 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003891 "");
3892}
3893
deadbeef5bd5ca32017-02-10 11:31:50 -08003894// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003895// DtlsTransportInternal.
3896TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
3897 ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3898 &fake_rtcp_dtls_transport_));
3899 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3900 &fake_rtp_dtls_transport_),
3901 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003902}
3903
3904#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3905
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003906// TODO(pthatcher): TestSetReceiver?