blob: 5736bb6afa5338d711bec856affe5ff9c6684c12 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/array_view.h"
14#include "media/base/fakemediaengine.h"
15#include "media/base/fakertp.h"
16#include "media/base/mediachannel.h"
17#include "media/base/testutils.h"
18#include "p2p/base/fakecandidatepair.h"
19#include "p2p/base/fakedtlstransport.h"
20#include "p2p/base/fakepackettransport.h"
21#include "pc/channel.h"
22#include "rtc_base/buffer.h"
23#include "rtc_base/checks.h"
24#include "rtc_base/fakeclock.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/logging.h"
27#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029using cricket::CA_OFFER;
30using cricket::CA_PRANSWER;
31using cricket::CA_ANSWER;
32using cricket::CA_UPDATE;
zhihuangb2cdd932017-01-19 16:54:25 -080033using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035using cricket::StreamParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036
Danil Chapovalov33b01f22016-05-11 19:55:27 +020037namespace {
38const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
39const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
40const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070041const cricket::VideoCodec kH264Codec(97, "H264");
42const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020043const cricket::DataCodec kGoogleDataCodec(101, "google-data");
44const uint32_t kSsrc1 = 0x1111;
45const uint32_t kSsrc2 = 0x2222;
46const uint32_t kSsrc3 = 0x3333;
47const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080050const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
deadbeefcbecd352015-09-23 11:50:27 -070053template <class ChannelT,
54 class MediaChannelT,
55 class ContentT,
56 class CodecT,
57 class MediaInfoT,
58 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059class Traits {
60 public:
61 typedef ChannelT Channel;
62 typedef MediaChannelT MediaChannel;
63 typedef ContentT Content;
64 typedef CodecT Codec;
65 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020066 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class VoiceTraits : public Traits<cricket::VoiceChannel,
70 cricket::FakeVoiceMediaChannel,
71 cricket::AudioContentDescription,
72 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070074 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class VideoTraits : public Traits<cricket::VideoChannel,
77 cricket::FakeVideoMediaChannel,
78 cricket::VideoContentDescription,
79 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070081 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
deadbeef953c2ce2017-01-09 14:53:41 -080083class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 cricket::FakeDataMediaChannel,
85 cricket::DataContentDescription,
86 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
deadbeef953c2ce2017-01-09 14:53:41 -080090// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091template<class T>
92class ChannelTest : public testing::Test, public sigslot::has_slots<> {
93 public:
deadbeefac22f702017-01-12 21:59:29 -080094 enum Flags {
95 RTCP_MUX = 0x1,
96 RTCP_MUX_REQUIRED = 0x2,
97 SECURE = 0x4,
98 SSRC_MUX = 0x8,
99 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800100 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800101 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700102 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700103 GCM_CIPHER = 0x40,
104 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800105 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106
Peter Boström34fbfff2015-09-24 19:20:30 +0200107 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 rtc::ArrayView<const uint8_t> rtp_data,
109 rtc::ArrayView<const uint8_t> rtcp_data,
110 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200111 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200112 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800113 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 if (network_is_worker == NetworkIsWorker::Yes) {
115 network_thread_ = rtc::Thread::Current();
116 } else {
117 network_thread_keeper_ = rtc::Thread::Create();
118 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 network_thread_ = network_thread_keeper_.get();
120 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800124 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
125 nullptr, typename T::Options()),
126 rtc::MakeUnique<typename T::MediaChannel>(
127 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
Steve Anton8699a322017-11-06 15:53:33 -0800130 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
131 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 int flags1,
133 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800134 // Network thread is started in CreateChannels, to allow the test to
135 // configure a fake clock before any threads are spawned and attempt to
136 // access the time.
137 if (network_thread_keeper_) {
138 network_thread_keeper_->Start();
139 }
deadbeefac22f702017-01-12 21:59:29 -0800140 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800141 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
142 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
143 // Make sure if using raw packet transports, they're used for both
144 // channels.
145 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200146 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800147 media_channel1_ = ch1.get();
148 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800149 rtc::PacketTransportInternal* rtp1 = nullptr;
150 rtc::PacketTransportInternal* rtcp1 = nullptr;
151 rtc::PacketTransportInternal* rtp2 = nullptr;
152 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800153 // Based on flags, create fake DTLS or raw packet transports.
154 if (flags1 & RAW_PACKET_TRANSPORT) {
155 fake_rtp_packet_transport1_.reset(
156 new rtc::FakePacketTransport("channel1_rtp"));
157 rtp1 = fake_rtp_packet_transport1_.get();
158 if (!(flags1 & RTCP_MUX_REQUIRED)) {
159 fake_rtcp_packet_transport1_.reset(
160 new rtc::FakePacketTransport("channel1_rtcp"));
161 rtcp1 = fake_rtcp_packet_transport1_.get();
162 }
163 } else {
164 // Confirmed to work with KT_RSA and KT_ECDSA.
165 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
166 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
167 rtp1 = fake_rtp_dtls_transport1_.get();
168 if (!(flags1 & RTCP_MUX_REQUIRED)) {
169 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
171 rtcp1 = fake_rtcp_dtls_transport1_.get();
172 }
173 if (flags1 & DTLS) {
174 auto cert1 =
175 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
176 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
177 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
178 if (fake_rtcp_dtls_transport1_) {
179 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
180 }
181 }
jbauch5869f502017-06-29 12:31:36 -0700182 if (flags1 & ENCRYPTED_HEADERS) {
183 rtc::CryptoOptions crypto_options;
184 crypto_options.enable_encrypted_rtp_header_extensions = true;
185 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
188 }
189 }
190 if (flags1 & GCM_CIPHER) {
191 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
192 rtc::SRTP_AEAD_AES_256_GCM);
193 if (fake_rtcp_dtls_transport1_) {
194 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
195 rtc::SRTP_AEAD_AES_256_GCM);
196 }
197 }
deadbeeff5346592017-01-24 21:51:21 -0800198 }
199 // Based on flags, create fake DTLS or raw packet transports.
200 if (flags2 & RAW_PACKET_TRANSPORT) {
201 fake_rtp_packet_transport2_.reset(
202 new rtc::FakePacketTransport("channel2_rtp"));
203 rtp2 = fake_rtp_packet_transport2_.get();
204 if (!(flags2 & RTCP_MUX_REQUIRED)) {
205 fake_rtcp_packet_transport2_.reset(
206 new rtc::FakePacketTransport("channel2_rtcp"));
207 rtcp2 = fake_rtcp_packet_transport2_.get();
208 }
209 } else {
210 // Confirmed to work with KT_RSA and KT_ECDSA.
211 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
212 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
213 rtp2 = fake_rtp_dtls_transport2_.get();
214 if (!(flags2 & RTCP_MUX_REQUIRED)) {
215 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
216 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
217 rtcp2 = fake_rtcp_dtls_transport2_.get();
218 }
219 if (flags2 & DTLS) {
220 auto cert2 =
221 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
222 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
223 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
224 if (fake_rtcp_dtls_transport2_) {
225 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
226 }
227 }
jbauch5869f502017-06-29 12:31:36 -0700228 if (flags2 & ENCRYPTED_HEADERS) {
229 rtc::CryptoOptions crypto_options;
230 crypto_options.enable_encrypted_rtp_header_extensions = true;
231 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 if (fake_rtcp_dtls_transport2_) {
233 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
234 }
235 }
236 if (flags2 & GCM_CIPHER) {
237 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
238 rtc::SRTP_AEAD_AES_256_GCM);
239 if (fake_rtcp_dtls_transport2_) {
240 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
241 rtc::SRTP_AEAD_AES_256_GCM);
242 }
243 }
deadbeeff5346592017-01-24 21:51:21 -0800244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 channel1_ =
246 CreateChannel(worker_thread, network_thread_, &media_engine_,
247 std::move(ch1), fake_rtp_dtls_transport1_.get(),
248 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
249 channel2_ =
250 CreateChannel(worker_thread, network_thread_, &media_engine_,
251 std::move(ch2), fake_rtp_dtls_transport2_.get(),
252 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200253 channel1_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor1);
255 channel2_->SignalMediaMonitor.connect(this,
256 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800259 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800260 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000261 if ((flags1 & DTLS) && (flags2 & DTLS)) {
262 flags1 = (flags1 & ~SECURE);
263 flags2 = (flags2 & ~SECURE);
264 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000265 CreateContent(flags1, kPcmuCodec, kH264Codec,
266 &local_media_content1_);
267 CreateContent(flags2, kPcmuCodec, kH264Codec,
268 &local_media_content2_);
269 CopyContent(local_media_content1_, &remote_media_content1_);
270 CopyContent(local_media_content2_, &remote_media_content2_);
271
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 // Add stream information (SSRC) to the local content but not to the remote
273 // content. This means that we per default know the SSRC of what we send but
274 // not what we receive.
275 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
276 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
277
278 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
279 if (flags1 & SSRC_MUX) {
280 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
281 }
282 if (flags2 & SSRC_MUX) {
283 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
284 }
285 }
Steve Anton8699a322017-11-06 15:53:33 -0800286 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200287 rtc::Thread* worker_thread,
288 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700289 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800290 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800291 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
292 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800293 rtc::PacketTransportInternal* fake_rtp_packet_transport,
294 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700295 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800296 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800297 auto channel = rtc::MakeUnique<typename T::Channel>(
298 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800299 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
300 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800301 if (!channel->NeedsRtcpTransport()) {
302 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800303 }
Steve Anton8699a322017-11-06 15:53:33 -0800304 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
305 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000306 return channel;
307 }
308
deadbeeff5346592017-01-24 21:51:21 -0800309 void ConnectFakeTransports() {
310 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
311 bool asymmetric = false;
312 // Depending on test flags, could be using DTLS or raw packet transport.
313 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
314 fake_rtp_dtls_transport1_->SetDestination(
315 fake_rtp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
318 fake_rtcp_dtls_transport1_->SetDestination(
319 fake_rtcp_dtls_transport2_.get(), asymmetric);
320 }
321 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
322 fake_rtp_packet_transport1_->SetDestination(
323 fake_rtp_packet_transport2_.get(), asymmetric);
324 }
325 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
326 fake_rtcp_packet_transport1_->SetDestination(
327 fake_rtcp_packet_transport2_.get(), asymmetric);
328 }
329 });
330 }
331
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 bool result = channel1_->SetLocalContent(&local_media_content1_,
334 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
336 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetRemoteContent(&remote_media_content1_,
338 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800340 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000341 result = channel2_->SetLocalContent(&local_media_content2_,
342 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 }
344 }
345 return result;
346 }
347
348 bool SendAccept() {
349 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000350 return channel1_->SetRemoteContent(&remote_media_content2_,
351 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352 }
353
354 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 bool result = channel1_->SetLocalContent(&local_media_content1_,
356 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 if (result) {
358 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 result = channel2_->SetRemoteContent(&remote_media_content1_,
360 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 }
362 return result;
363 }
364
365 bool SendProvisionalAnswer() {
366 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
369 channel2_->Enable(true);
370 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000371 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800372 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 }
374 return result;
375 }
376
377 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 bool result = channel2_->SetLocalContent(&local_media_content2_,
379 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 result = channel1_->SetRemoteContent(&remote_media_content2_,
382 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 return result;
384 }
385
deadbeeff5346592017-01-24 21:51:21 -0800386 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 channel1_.reset();
388 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800389 fake_rtp_dtls_transport1_.reset();
390 fake_rtcp_dtls_transport1_.reset();
391 fake_rtp_dtls_transport2_.reset();
392 fake_rtcp_dtls_transport2_.reset();
393 fake_rtp_packet_transport1_.reset();
394 fake_rtcp_packet_transport1_.reset();
395 fake_rtp_packet_transport2_.reset();
396 fake_rtcp_packet_transport2_.reset();
397 if (network_thread_keeper_) {
398 network_thread_keeper_.reset();
399 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 return true;
401 }
402
403 bool AddStream1(int id) {
404 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
405 }
406 bool RemoveStream1(int id) {
407 return channel1_->RemoveRecvStream(id);
408 }
409
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp1() {
411 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtp2() {
415 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
416 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtcp1() {
419 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendRtcp2() {
422 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
426 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
427 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtcp1(uint32_t ssrc) {
434 rtc::Buffer data = CreateRtcpData(ssrc);
435 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtcp2(uint32_t ssrc) {
438 rtc::Buffer data = CreateRtcpData(ssrc);
439 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
451 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 }
454 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200455 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
457 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
461 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtcpData(ssrc);
465 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtcpData(ssrc);
469 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
472 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::SetBE32(data.data() + 8, ssrc);
475 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
482 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 return data;
486 }
487
488 bool CheckNoRtp1() {
489 return media_channel1_->CheckNoRtp();
490 }
491 bool CheckNoRtp2() {
492 return media_channel2_->CheckNoRtp();
493 }
494 bool CheckNoRtcp1() {
495 return media_channel1_->CheckNoRtcp();
496 }
497 bool CheckNoRtcp2() {
498 return media_channel2_->CheckNoRtcp();
499 }
500
501 void CreateContent(int flags,
502 const cricket::AudioCodec& audio_codec,
503 const cricket::VideoCodec& video_codec,
504 typename T::Content* content) {
505 // overridden in specialized classes
506 }
507 void CopyContent(const typename T::Content& source,
508 typename T::Content* content) {
509 // overridden in specialized classes
510 }
511
Steve Anton18ee1d52017-09-11 11:32:35 -0700512 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
515 typename T::Content* content = new typename T::Content();
516 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
517 AddLegacyStreamInContent(ssrc, 0, content);
518 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 }
520
ossu292d6582016-03-17 02:31:13 -0700521 // Will manage the lifetime of a CallThread, making sure it's
522 // destroyed before this object goes out of scope.
523 class ScopedCallThread {
524 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700526 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 : thread_(rtc::Thread::Create()),
528 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700529 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700530 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700531 }
532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700534
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700536
537 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200538 std::unique_ptr<rtc::Thread> thread_;
539 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700540 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
543 return false; // overridden in specialized classes
544 }
545
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200546 void OnMediaMonitor1(typename T::Channel* channel,
547 const typename T::MediaInfo& info) {
548 RTC_DCHECK_EQ(channel, channel1_.get());
549 media_info_callbacks1_++;
550 }
551 void OnMediaMonitor2(typename T::Channel* channel,
552 const typename T::MediaInfo& info) {
553 RTC_DCHECK_EQ(channel, channel2_.get());
554 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 }
deadbeeff5346592017-01-24 21:51:21 -0800556 void OnRtcpMuxFullyActive1(const std::string&) {
557 rtcp_mux_activated_callbacks1_++;
558 }
559 void OnRtcpMuxFullyActive2(const std::string&) {
560 rtcp_mux_activated_callbacks2_++;
561 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562
Honghai Zhangcc411c02016-03-29 17:27:21 -0700563 cricket::CandidatePairInterface* last_selected_candidate_pair() {
564 return last_selected_candidate_pair_;
565 }
566
Peter Boström0c4e06b2015-10-07 12:23:21 +0200567 void AddLegacyStreamInContent(uint32_t ssrc,
568 int flags,
569 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 // Base implementation.
571 }
572
573 // Tests that can be used by derived classes.
574
575 // Basic sanity check.
576 void TestInit() {
577 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700578 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200580 if (verify_playout_) {
581 EXPECT_FALSE(media_channel1_->playout());
582 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_TRUE(media_channel1_->codecs().empty());
584 EXPECT_TRUE(media_channel1_->recv_streams().empty());
585 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
586 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
587 }
588
589 // Test that SetLocalContent and SetRemoteContent properly configure
590 // the codecs.
591 void TestSetContents() {
592 CreateChannels(0, 0);
593 typename T::Content content;
594 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000595 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000597 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 ASSERT_EQ(1U, media_channel1_->codecs().size());
599 EXPECT_TRUE(CodecMatches(content.codecs()[0],
600 media_channel1_->codecs()[0]));
601 }
602
603 // Test that SetLocalContent and SetRemoteContent properly deals
604 // with an empty offer.
605 void TestSetContentsNullOffer() {
606 CreateChannels(0, 0);
607 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000608 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 CreateContent(0, kPcmuCodec, kH264Codec, &content);
610 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 ASSERT_EQ(1U, media_channel1_->codecs().size());
613 EXPECT_TRUE(CodecMatches(content.codecs()[0],
614 media_channel1_->codecs()[0]));
615 }
616
617 // Test that SetLocalContent and SetRemoteContent properly set RTCP
618 // mux.
619 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800620 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 typename T::Content content;
622 CreateContent(0, kPcmuCodec, kH264Codec, &content);
623 // Both sides agree on mux. Should no longer be a separate RTCP channel.
624 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000625 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
626 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000630 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
633 // Test that SetLocalContent and SetRemoteContent properly set RTCP
634 // mux when a provisional answer is received.
635 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800636 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 typename T::Content content;
638 CreateContent(0, kPcmuCodec, kH264Codec, &content);
639 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000640 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
641 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800642 // Both sides agree on mux. Should signal RTCP mux as fully activated.
643 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000644 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800645 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000647 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 }
653
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Test that SetRemoteContent properly deals with a content update.
655 void TestSetRemoteContentUpdate() {
656 CreateChannels(0, 0);
657 typename T::Content content;
deadbeefac22f702017-01-12 21:59:29 -0800658 CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000660 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
661 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 ASSERT_EQ(1U, media_channel1_->codecs().size());
663 EXPECT_TRUE(CodecMatches(content.codecs()[0],
664 media_channel1_->codecs()[0]));
665 // Now update with other codecs.
666 typename T::Content update_content;
667 update_content.set_partial(true);
668 CreateContent(0, kIsacCodec, kH264SvcCodec,
669 &update_content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000670 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 ASSERT_EQ(1U, media_channel1_->codecs().size());
672 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
673 media_channel1_->codecs()[0]));
674 // Now update without any codecs. This is ignored.
675 typename T::Content empty_content;
676 empty_content.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 ASSERT_EQ(1U, media_channel1_->codecs().size());
679 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
680 media_channel1_->codecs()[0]));
681 }
682
683 // Test that Add/RemoveStream properly forward to the media channel.
684 void TestStreams() {
685 CreateChannels(0, 0);
686 EXPECT_TRUE(AddStream1(1));
687 EXPECT_TRUE(AddStream1(2));
688 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
689 EXPECT_TRUE(RemoveStream1(2));
690 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
691 EXPECT_TRUE(RemoveStream1(1));
692 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
693 }
694
695 // Test that SetLocalContent properly handles adding and removing StreamParams
696 // to the local content description.
697 // This test uses the CA_UPDATE action that don't require a full
698 // MediaContentDescription to do an update.
699 void TestUpdateStreamsInLocalContent() {
700 cricket::StreamParams stream1;
701 stream1.groupid = "group1";
702 stream1.id = "stream1";
703 stream1.ssrcs.push_back(kSsrc1);
704 stream1.cname = "stream1_cname";
705
706 cricket::StreamParams stream2;
707 stream2.groupid = "group2";
708 stream2.id = "stream2";
709 stream2.ssrcs.push_back(kSsrc2);
710 stream2.cname = "stream2_cname";
711
712 cricket::StreamParams stream3;
713 stream3.groupid = "group3";
714 stream3.id = "stream3";
715 stream3.ssrcs.push_back(kSsrc3);
716 stream3.cname = "stream3_cname";
717
718 CreateChannels(0, 0);
719 typename T::Content content1;
720 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
721 content1.AddStream(stream1);
722 EXPECT_EQ(0u, media_channel1_->send_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000723 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724
725 ASSERT_EQ(1u, media_channel1_->send_streams().size());
726 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
727
728 // Update the local streams by adding another sending stream.
729 // Use a partial updated session description.
730 typename T::Content content2;
731 content2.AddStream(stream2);
732 content2.AddStream(stream3);
733 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000734 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 ASSERT_EQ(3u, media_channel1_->send_streams().size());
736 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
737 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
738 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
739
740 // Update the local streams by removing the first sending stream.
741 // This is done by removing all SSRCS for this particular stream.
742 typename T::Content content3;
743 stream1.ssrcs.clear();
744 content3.AddStream(stream1);
745 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 ASSERT_EQ(2u, media_channel1_->send_streams().size());
748 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
749 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
750
751 // Update the local streams with a stream that does not change.
752 // THe update is ignored.
753 typename T::Content content4;
754 content4.AddStream(stream2);
755 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000756 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757 ASSERT_EQ(2u, media_channel1_->send_streams().size());
758 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
759 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
760 }
761
762 // Test that SetRemoteContent properly handles adding and removing
763 // StreamParams to the remote content description.
764 // This test uses the CA_UPDATE action that don't require a full
765 // MediaContentDescription to do an update.
766 void TestUpdateStreamsInRemoteContent() {
767 cricket::StreamParams stream1;
768 stream1.id = "Stream1";
769 stream1.groupid = "1";
770 stream1.ssrcs.push_back(kSsrc1);
771 stream1.cname = "stream1_cname";
772
773 cricket::StreamParams stream2;
774 stream2.id = "Stream2";
775 stream2.groupid = "2";
776 stream2.ssrcs.push_back(kSsrc2);
777 stream2.cname = "stream2_cname";
778
779 cricket::StreamParams stream3;
780 stream3.id = "Stream3";
781 stream3.groupid = "3";
782 stream3.ssrcs.push_back(kSsrc3);
783 stream3.cname = "stream3_cname";
784
785 CreateChannels(0, 0);
786 typename T::Content content1;
787 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
788 content1.AddStream(stream1);
789 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000790 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
792 ASSERT_EQ(1u, media_channel1_->codecs().size());
793 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
794 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
795
796 // Update the remote streams by adding another sending stream.
797 // Use a partial updated session description.
798 typename T::Content content2;
799 content2.AddStream(stream2);
800 content2.AddStream(stream3);
801 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000802 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803 ASSERT_EQ(3u, media_channel1_->recv_streams().size());
804 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
805 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
806 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
807
808 // Update the remote streams by removing the first stream.
809 // This is done by removing all SSRCS for this particular stream.
810 typename T::Content content3;
811 stream1.ssrcs.clear();
812 content3.AddStream(stream1);
813 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
816 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
817 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
818
819 // Update the remote streams with a stream that does not change.
820 // The update is ignored.
821 typename T::Content content4;
822 content4.AddStream(stream2);
823 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000824 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
826 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
827 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
828 }
829
830 // Test that SetLocalContent and SetRemoteContent properly
831 // handles adding and removing StreamParams when the action is a full
832 // CA_OFFER / CA_ANSWER.
833 void TestChangeStreamParamsInContent() {
834 cricket::StreamParams stream1;
835 stream1.groupid = "group1";
836 stream1.id = "stream1";
837 stream1.ssrcs.push_back(kSsrc1);
838 stream1.cname = "stream1_cname";
839
840 cricket::StreamParams stream2;
841 stream2.groupid = "group1";
842 stream2.id = "stream2";
843 stream2.ssrcs.push_back(kSsrc2);
844 stream2.cname = "stream2_cname";
845
846 // Setup a call where channel 1 send |stream1| to channel 2.
847 CreateChannels(0, 0);
848 typename T::Content content1;
849 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
850 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000851 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852 EXPECT_TRUE(channel1_->Enable(true));
853 EXPECT_EQ(1u, media_channel1_->send_streams().size());
854
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000855 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800857 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858
859 // Channel 2 do not send anything.
860 typename T::Content content2;
861 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000862 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000864 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_TRUE(channel2_->Enable(true));
866 EXPECT_EQ(0u, media_channel2_->send_streams().size());
867
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200868 SendCustomRtp1(kSsrc1, 0);
869 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
871
872 // Let channel 2 update the content by sending |stream2| and enable SRTP.
873 typename T::Content content3;
874 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
875 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000876 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 ASSERT_EQ(1u, media_channel2_->send_streams().size());
878 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
879
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000880 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
882 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
883
884 // Channel 1 replies but stop sending stream1.
885 typename T::Content content4;
886 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000887 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 EXPECT_EQ(0u, media_channel1_->send_streams().size());
889
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000890 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000891 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
892
Zhi Huangcf990f52017-09-22 12:12:30 -0700893 EXPECT_TRUE(channel1_->srtp_active());
894 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200895 SendCustomRtp2(kSsrc2, 0);
896 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
898 }
899
jbauch5869f502017-06-29 12:31:36 -0700900 enum EncryptedHeaderTestScenario {
901 // Offer/Answer are processed before DTLS completes.
902 DEFAULT,
903 // DTLS completes before any Offer/Answer have been sent.
904 DTLS_BEFORE_OFFER_ANSWER,
905 // DTLS completes after channel 2 has processed (remote) Offer and (local)
906 // Answer.
907 DTLS_AFTER_CHANNEL2_READY,
908 };
909
910 // Test that encrypted header extensions are working and can be changed when
911 // sending a new OFFER/ANSWER.
912 void TestChangeEncryptedHeaderExtensions(int flags,
913 EncryptedHeaderTestScenario scenario = DEFAULT) {
914 RTC_CHECK(scenario == 0 || (flags & DTLS));
915 struct PacketListener : public sigslot::has_slots<> {
916 PacketListener() {}
917 void OnReadPacket(rtc::PacketTransportInternal* transport,
918 const char* data, size_t size, const rtc::PacketTime& time,
919 int flags) {
920 CompareHeaderExtensions(
921 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
922 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
923 false);
924 }
925 std::vector<int> encrypted_headers;
926 } packet_listener1, packet_listener2;
927
928 cricket::StreamParams stream1;
929 stream1.groupid = "group1";
930 stream1.id = "stream1";
931 stream1.ssrcs.push_back(kSsrc1);
932 stream1.cname = "stream1_cname";
933
934 cricket::StreamParams stream2;
935 stream2.groupid = "group1";
936 stream2.id = "stream2";
937 stream2.ssrcs.push_back(kSsrc2);
938 stream2.cname = "stream2_cname";
939
940 // Use SRTP when testing encrypted extensions.
941 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
942 // Enable SDES if channel is not using DTLS.
943 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
944
945 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
946 // Make sure to use URIs that are supported for encryption.
947 cricket::RtpHeaderExtensions extensions1;
948 extensions1.push_back(
949 RtpExtension(RtpExtension::kAudioLevelUri, 10));
950 extensions1.push_back(
951 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
952
953 cricket::RtpHeaderExtensions extensions2;
954 extensions2.push_back(
955 RtpExtension(RtpExtension::kAudioLevelUri, 10));
956 extensions2.push_back(
957 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
958 extensions2.push_back(
959 RtpExtension(RtpExtension::kVideoRotationUri, 3));
960 extensions2.push_back(
961 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
962
963 // Setup a call where channel 1 send |stream1| to channel 2.
964 CreateChannels(channel_flags, channel_flags);
965 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
966 &packet_listener1, &PacketListener::OnReadPacket);
967 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
968 &packet_listener2, &PacketListener::OnReadPacket);
969
970 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
971 ConnectFakeTransports();
972 WaitForThreads();
973 }
974
975 typename T::Content content1;
976 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
977 content1.AddStream(stream1);
978 content1.set_rtp_header_extensions(extensions1);
979 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
980 EXPECT_TRUE(channel1_->Enable(true));
981 EXPECT_EQ(1u, media_channel1_->send_streams().size());
982 packet_listener1.encrypted_headers.push_back(1);
983
984 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
985 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
986
987 // Channel 2 sends back |stream2|.
988 typename T::Content content2;
989 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
990 content2.AddStream(stream2);
991 content2.set_rtp_header_extensions(extensions1);
992 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
993 EXPECT_TRUE(channel2_->Enable(true));
994 EXPECT_EQ(1u, media_channel2_->send_streams().size());
995 packet_listener2.encrypted_headers.push_back(1);
996
997 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
998 ConnectFakeTransports();
999 WaitForThreads();
1000 }
1001
1002 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
1003 scenario == DTLS_AFTER_CHANNEL2_READY) {
1004 // In both scenarios with partially completed Offer/Answer, sending
1005 // packets from Channel 2 to Channel 1 should work.
1006 SendCustomRtp2(kSsrc2, 0);
1007 WaitForThreads();
1008 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1009 }
1010
1011 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
1012 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
1013
1014 if (scenario == DEFAULT) {
1015 ConnectFakeTransports();
1016 WaitForThreads();
1017 }
1018
1019 SendCustomRtp1(kSsrc1, 0);
1020 SendCustomRtp2(kSsrc2, 0);
1021 WaitForThreads();
1022 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1023 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1024
1025 // Let channel 2 update the encrypted header extensions.
1026 typename T::Content content3;
1027 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
1028 content3.AddStream(stream2);
1029 content3.set_rtp_header_extensions(extensions2);
1030 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
1031 ASSERT_EQ(1u, media_channel2_->send_streams().size());
1032 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
1033 packet_listener2.encrypted_headers.clear();
1034 packet_listener2.encrypted_headers.push_back(2);
1035 packet_listener2.encrypted_headers.push_back(4);
1036
1037 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
1038 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
1039 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
1040
1041 // Channel 1 is already sending the new encrypted extensions. These
1042 // can be decrypted by channel 2. Channel 2 is still sending the old
1043 // encrypted extensions (which can be decrypted by channel 1).
1044
1045 if (flags & DTLS) {
1046 // DTLS supports updating the encrypted extensions with only the OFFER
1047 // being processed. For SDES both the OFFER and ANSWER must have been
1048 // processed to update encrypted extensions, so we can't check this case.
1049 SendCustomRtp1(kSsrc1, 0);
1050 SendCustomRtp2(kSsrc2, 0);
1051 WaitForThreads();
1052 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1053 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1054 }
1055
1056 // Channel 1 replies with the same extensions.
1057 typename T::Content content4;
1058 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
1059 content4.AddStream(stream1);
1060 content4.set_rtp_header_extensions(extensions2);
1061 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
1062 EXPECT_EQ(1u, media_channel1_->send_streams().size());
1063 packet_listener1.encrypted_headers.clear();
1064 packet_listener1.encrypted_headers.push_back(2);
1065 packet_listener1.encrypted_headers.push_back(4);
1066
1067 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
1068 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
1069
1070 SendCustomRtp1(kSsrc1, 0);
1071 SendCustomRtp2(kSsrc2, 0);
1072 WaitForThreads();
1073 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
1074 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
1075 }
1076
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077 // Test that we only start playout and sending at the right times.
1078 void TestPlayoutAndSendingStates() {
1079 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +02001080 if (verify_playout_) {
1081 EXPECT_FALSE(media_channel1_->playout());
1082 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001084 if (verify_playout_) {
1085 EXPECT_FALSE(media_channel2_->playout());
1086 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001087 EXPECT_FALSE(media_channel2_->sending());
1088 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001089 if (verify_playout_) {
1090 EXPECT_FALSE(media_channel1_->playout());
1091 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001093 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1094 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001095 if (verify_playout_) {
1096 EXPECT_TRUE(media_channel1_->playout());
1097 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001099 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
1100 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001101 if (verify_playout_) {
1102 EXPECT_FALSE(media_channel2_->playout());
1103 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001105 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
1106 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001107 if (verify_playout_) {
1108 EXPECT_FALSE(media_channel2_->playout());
1109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -08001111 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +02001112 if (verify_playout_) {
1113 EXPECT_TRUE(media_channel1_->playout());
1114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001116 if (verify_playout_) {
1117 EXPECT_FALSE(media_channel2_->playout());
1118 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_FALSE(media_channel2_->sending());
1120 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001121 if (verify_playout_) {
1122 EXPECT_TRUE(media_channel2_->playout());
1123 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001125 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
1126 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +02001127 if (verify_playout_) {
1128 EXPECT_TRUE(media_channel1_->playout());
1129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(media_channel1_->sending());
1131 }
1132
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 // Test that changing the MediaContentDirection in the local and remote
1134 // session description start playout and sending at the right time.
1135 void TestMediaContentDirection() {
1136 CreateChannels(0, 0);
1137 typename T::Content content1;
1138 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
1139 typename T::Content content2;
1140 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
1141 // Set |content2| to be InActive.
1142 content2.set_direction(cricket::MD_INACTIVE);
1143
1144 EXPECT_TRUE(channel1_->Enable(true));
1145 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +02001146 if (verify_playout_) {
1147 EXPECT_FALSE(media_channel1_->playout());
1148 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001150 if (verify_playout_) {
1151 EXPECT_FALSE(media_channel2_->playout());
1152 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_FALSE(media_channel2_->sending());
1154
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001155 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
1156 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
1157 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1158 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001159 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160
Peter Boström34fbfff2015-09-24 19:20:30 +02001161 if (verify_playout_) {
1162 EXPECT_TRUE(media_channel1_->playout());
1163 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001165 if (verify_playout_) {
1166 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1167 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1169
1170 // Update |content2| to be RecvOnly.
1171 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001172 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1173 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174
Peter Boström34fbfff2015-09-24 19:20:30 +02001175 if (verify_playout_) {
1176 EXPECT_TRUE(media_channel1_->playout());
1177 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001179 if (verify_playout_) {
1180 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1181 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1183
1184 // Update |content2| to be SendRecv.
1185 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001186 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1187 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188
Peter Boström34fbfff2015-09-24 19:20:30 +02001189 if (verify_playout_) {
1190 EXPECT_TRUE(media_channel1_->playout());
1191 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001193 if (verify_playout_) {
1194 EXPECT_TRUE(media_channel2_->playout());
1195 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196 EXPECT_TRUE(media_channel2_->sending());
1197 }
1198
Honghai Zhangcc411c02016-03-29 17:27:21 -07001199 // Tests that when the transport channel signals a candidate pair change
1200 // event, the media channel will receive a call on the network route change.
1201 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001202 static constexpr uint16_t kLocalNetId = 1;
1203 static constexpr uint16_t kRemoteNetId = 2;
1204 static constexpr int kLastPacketId = 100;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001205
Honghai Zhangcc411c02016-03-29 17:27:21 -07001206 CreateChannels(0, 0);
1207
Honghai Zhangcc411c02016-03-29 17:27:21 -07001208 typename T::MediaChannel* media_channel1 =
1209 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001210 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001211
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001212 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001213 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001214 // The transport channel becomes disconnected.
Zhi Huang8c316c12017-11-13 21:13:45 +00001215 fake_rtp_dtls_transport1_->ice_transport()
1216 ->SignalSelectedCandidatePairChanged(
1217 fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001218 });
1219 WaitForThreads();
1220 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001221 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001222 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001223
eladalon05b07bb2017-08-24 07:40:16 -07001224 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001225 // The transport channel becomes connected.
Zhi Huang8c316c12017-11-13 21:13:45 +00001226 rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
1227 rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
1228 auto candidate_pair = cricket::FakeCandidatePair::Create(
1229 local_address, kLocalNetId, remote_address, kRemoteNetId);
1230 fake_rtp_dtls_transport1_->ice_transport()
1231 ->SignalSelectedCandidatePairChanged(
1232 fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
1233 kLastPacketId, true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001234 });
1235 WaitForThreads();
1236 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001237 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001238 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001239 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001240 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001241 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huang8c316c12017-11-13 21:13:45 +00001242 constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
michaelt79e05882016-11-08 02:50:09 -08001243 EXPECT_EQ(kTransportOverheadPerPacket,
1244 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001245 }
1246
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 // Test setting up a call.
1248 void TestCallSetup() {
1249 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001250 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001252 if (verify_playout_) {
1253 EXPECT_TRUE(media_channel1_->playout());
1254 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001255 EXPECT_FALSE(media_channel1_->sending());
1256 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001257 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 EXPECT_TRUE(media_channel1_->sending());
1259 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001260 if (verify_playout_) {
1261 EXPECT_TRUE(media_channel2_->playout());
1262 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263 EXPECT_TRUE(media_channel2_->sending());
1264 EXPECT_EQ(1U, media_channel2_->codecs().size());
1265 }
1266
1267 // Test that we don't crash if packets are sent during call teardown
1268 // when RTCP mux is enabled. This is a regression test against a specific
1269 // race condition that would only occur when a RTCP packet was sent during
1270 // teardown of a channel on which RTCP mux was enabled.
1271 void TestCallTeardownRtcpMux() {
1272 class LastWordMediaChannel : public T::MediaChannel {
1273 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001275 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001276 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1277 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1279 }
1280 };
Steve Anton8699a322017-11-06 15:53:33 -08001281 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1282 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 EXPECT_TRUE(SendInitiate());
1284 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001285 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 }
1287
1288 // Send voice RTP data to the other side and ensure it gets there.
1289 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001290 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(SendInitiate());
1292 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001293 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1294 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001295 SendRtp1();
1296 SendRtp2();
1297 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298 EXPECT_TRUE(CheckRtp1());
1299 EXPECT_TRUE(CheckRtp2());
1300 EXPECT_TRUE(CheckNoRtp1());
1301 EXPECT_TRUE(CheckNoRtp2());
1302 }
1303
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001304 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001305 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001306 EXPECT_TRUE(SendInitiate());
1307 EXPECT_TRUE(SendAccept());
1308 SendRtp1();
1309 SendRtp2();
1310 SendRtcp1();
1311 SendRtcp2();
1312 // Do not wait, destroy channels.
1313 channel1_.reset(nullptr);
1314 channel2_.reset(nullptr);
1315 }
1316
deadbeefac22f702017-01-12 21:59:29 -08001317 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001319 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 EXPECT_TRUE(SendInitiate());
1321 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001322 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1323 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001324 SendRtcp1();
1325 SendRtcp2();
1326 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 EXPECT_TRUE(CheckRtcp1());
1328 EXPECT_TRUE(CheckRtcp2());
1329 EXPECT_TRUE(CheckNoRtcp1());
1330 EXPECT_TRUE(CheckNoRtcp2());
1331 }
1332
1333 // Check that RTCP is transmitted if only the initiator supports mux.
1334 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001335 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 EXPECT_TRUE(SendInitiate());
1337 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001338 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1339 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001340 SendRtcp1();
1341 SendRtcp2();
1342 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343 EXPECT_TRUE(CheckRtcp1());
1344 EXPECT_TRUE(CheckRtcp2());
1345 EXPECT_TRUE(CheckNoRtcp1());
1346 EXPECT_TRUE(CheckNoRtcp2());
1347 }
1348
1349 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1350 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001351 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001353 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1354 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1355 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001357 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1358 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001359 SendRtp1();
1360 SendRtp2();
1361 SendRtcp1();
1362 SendRtcp2();
1363 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 EXPECT_TRUE(CheckRtp1());
1365 EXPECT_TRUE(CheckRtp2());
1366 EXPECT_TRUE(CheckNoRtp1());
1367 EXPECT_TRUE(CheckNoRtp2());
1368 EXPECT_TRUE(CheckRtcp1());
1369 EXPECT_TRUE(CheckRtcp2());
1370 EXPECT_TRUE(CheckNoRtcp1());
1371 EXPECT_TRUE(CheckNoRtcp2());
1372 }
1373
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001374 // Check that RTP and RTCP are transmitted ok when both sides
1375 // support mux and one the offerer requires mux.
1376 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001377 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001378 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001379 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1380 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001381 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001382 SendRtp1();
1383 SendRtp2();
1384 SendRtcp1();
1385 SendRtcp2();
1386 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001387 EXPECT_TRUE(CheckRtp1());
1388 EXPECT_TRUE(CheckRtp2());
1389 EXPECT_TRUE(CheckNoRtp1());
1390 EXPECT_TRUE(CheckNoRtp2());
1391 EXPECT_TRUE(CheckRtcp1());
1392 EXPECT_TRUE(CheckRtcp2());
1393 EXPECT_TRUE(CheckNoRtcp1());
1394 EXPECT_TRUE(CheckNoRtcp2());
1395 }
1396
1397 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001398 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001399 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001400 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001401 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001402 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1403 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1404 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001405 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001406 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1407 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001408 SendRtp1();
1409 SendRtp2();
1410 SendRtcp1();
1411 SendRtcp2();
1412 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001413 EXPECT_TRUE(CheckRtp1());
1414 EXPECT_TRUE(CheckRtp2());
1415 EXPECT_TRUE(CheckNoRtp1());
1416 EXPECT_TRUE(CheckNoRtp2());
1417 EXPECT_TRUE(CheckRtcp1());
1418 EXPECT_TRUE(CheckRtcp2());
1419 EXPECT_TRUE(CheckNoRtcp1());
1420 EXPECT_TRUE(CheckNoRtcp2());
1421 }
1422
1423 // Check that RTP and RTCP are transmitted ok when both sides
1424 // require mux.
1425 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001426 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001427 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001428 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1429 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001430 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001431 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001432 SendRtp1();
1433 SendRtp2();
1434 SendRtcp1();
1435 SendRtcp2();
1436 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001437 EXPECT_TRUE(CheckRtp1());
1438 EXPECT_TRUE(CheckRtp2());
1439 EXPECT_TRUE(CheckNoRtp1());
1440 EXPECT_TRUE(CheckNoRtp2());
1441 EXPECT_TRUE(CheckRtcp1());
1442 EXPECT_TRUE(CheckRtcp2());
1443 EXPECT_TRUE(CheckNoRtcp1());
1444 EXPECT_TRUE(CheckNoRtcp2());
1445 }
1446
1447 // Check that SendAccept fails if the answerer doesn't support mux
1448 // and the offerer requires it.
1449 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001450 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001451 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001452 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1453 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001454 EXPECT_FALSE(SendAccept());
1455 }
1456
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 // Check that RTCP data sent by the initiator before the accept is not muxed.
1458 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001459 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001461 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1462 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463
1464 // RTCP can be sent before the call is accepted, if the transport is ready.
1465 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001466 SendRtcp1();
1467 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(CheckNoRtp2());
1469 EXPECT_TRUE(CheckRtcp2());
1470
1471 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001472 SendRtcp2();
1473 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001474 EXPECT_TRUE(CheckNoRtp1());
1475 EXPECT_TRUE(CheckRtcp1());
1476
1477 // Complete call setup and ensure everything is still OK.
1478 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001479 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001480 SendRtcp1();
1481 SendRtcp2();
1482 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484 EXPECT_TRUE(CheckRtcp1());
1485 }
1486
1487
1488 // Check that RTCP data is not muxed until both sides have enabled muxing,
1489 // but that we properly demux before we get the accept message, since there
1490 // is a race between RTP data and the jingle accept.
1491 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001492 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001494 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1495 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496
1497 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1498 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001499 SendRtcp1();
1500 WaitForThreads();
1501 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502
1503 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 SendRtcp2();
1505 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001506 EXPECT_TRUE(CheckNoRtp1());
1507 EXPECT_TRUE(CheckRtcp1());
1508
1509 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001510 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001512 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1513 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001514 SendRtcp1();
1515 SendRtcp2();
1516 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 EXPECT_TRUE(CheckRtcp1());
1519 }
1520
1521 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001522 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001524 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1525 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526
deadbeefac22f702017-01-12 21:59:29 -08001527 int flags1 = SECURE | flags1_in;
1528 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 bool dtls1 = !!(flags1_in & DTLS);
1530 bool dtls2 = !!(flags2_in & DTLS);
1531 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001532 EXPECT_FALSE(channel1_->srtp_active());
1533 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001535 WaitForThreads();
1536 EXPECT_TRUE(channel1_->writable());
1537 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001539 EXPECT_TRUE(channel1_->srtp_active());
1540 EXPECT_TRUE(channel2_->srtp_active());
1541 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1542 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001543 SendRtp1();
1544 SendRtp2();
1545 SendRtcp1();
1546 SendRtcp2();
1547 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 EXPECT_TRUE(CheckRtp1());
1549 EXPECT_TRUE(CheckRtp2());
1550 EXPECT_TRUE(CheckNoRtp1());
1551 EXPECT_TRUE(CheckNoRtp2());
1552 EXPECT_TRUE(CheckRtcp1());
1553 EXPECT_TRUE(CheckRtcp2());
1554 EXPECT_TRUE(CheckNoRtcp1());
1555 EXPECT_TRUE(CheckNoRtcp2());
1556 }
1557
1558 // Test that we properly handling SRTP negotiating down to RTP.
1559 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001560 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001561 EXPECT_FALSE(channel1_->srtp_active());
1562 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 EXPECT_TRUE(SendInitiate());
1564 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001565 EXPECT_FALSE(channel1_->srtp_active());
1566 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001567 SendRtp1();
1568 SendRtp2();
1569 SendRtcp1();
1570 SendRtcp2();
1571 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572 EXPECT_TRUE(CheckRtp1());
1573 EXPECT_TRUE(CheckRtp2());
1574 EXPECT_TRUE(CheckNoRtp1());
1575 EXPECT_TRUE(CheckNoRtp2());
1576 EXPECT_TRUE(CheckRtcp1());
1577 EXPECT_TRUE(CheckRtcp2());
1578 EXPECT_TRUE(CheckNoRtcp1());
1579 EXPECT_TRUE(CheckNoRtcp2());
1580 }
1581
1582 // Test that we can send and receive early media when a provisional answer is
1583 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1584 void SendEarlyMediaUsingRtcpMuxSrtp() {
1585 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1586
deadbeefac22f702017-01-12 21:59:29 -08001587 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1588 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001589 EXPECT_TRUE(SendOffer());
1590 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001591 EXPECT_TRUE(channel1_->srtp_active());
1592 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001593 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1594 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001595 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1596 SendCustomRtcp1(kSsrc1);
1597 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1598 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1601
1602 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001603 SendCustomRtcp2(kSsrc2);
1604 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1605 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1608
1609 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001610 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1611 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001613 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1614 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1615 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1616 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001617 EXPECT_TRUE(channel1_->srtp_active());
1618 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001619 SendCustomRtcp1(kSsrc1);
1620 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1621 SendCustomRtcp2(kSsrc2);
1622 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1623 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001624 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1628 }
1629
1630 // Test that we properly send RTP without SRTP from a thread.
1631 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001632 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_TRUE(SendInitiate());
1634 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1636 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1637 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1638 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1639 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1640 send_rtcp1.thread(),
1641 send_rtcp2.thread()};
1642 WaitForThreads(involved_threads);
1643 EXPECT_TRUE(CheckRtp1());
1644 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 EXPECT_TRUE(CheckNoRtp1());
1646 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647 EXPECT_TRUE(CheckRtcp1());
1648 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649 EXPECT_TRUE(CheckNoRtcp1());
1650 EXPECT_TRUE(CheckNoRtcp2());
1651 }
1652
1653 // Test that we properly send SRTP with RTCP from a thread.
1654 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001655 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 EXPECT_TRUE(SendInitiate());
1657 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1659 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1660 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1661 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1662 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1663 send_rtcp1.thread(),
1664 send_rtcp2.thread()};
1665 WaitForThreads(involved_threads);
1666 EXPECT_TRUE(CheckRtp1());
1667 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 EXPECT_TRUE(CheckNoRtp1());
1669 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670 EXPECT_TRUE(CheckRtcp1());
1671 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 EXPECT_TRUE(CheckNoRtcp1());
1673 EXPECT_TRUE(CheckNoRtcp2());
1674 }
1675
1676 // Test that the mediachannel retains its sending state after the transport
1677 // becomes non-writable.
1678 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001679 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 EXPECT_TRUE(SendInitiate());
1681 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001682 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1683 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001684 SendRtp1();
1685 SendRtp2();
1686 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 EXPECT_TRUE(CheckRtp1());
1688 EXPECT_TRUE(CheckRtp2());
1689 EXPECT_TRUE(CheckNoRtp1());
1690 EXPECT_TRUE(CheckNoRtp2());
1691
wu@webrtc.org97077a32013-10-25 21:18:33 +00001692 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001693 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1694 fake_rtp_dtls_transport1_->SetWritable(false);
1695 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001696 SendRtp1();
1697 SendRtp2();
1698 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 EXPECT_TRUE(CheckRtp1());
1700 EXPECT_TRUE(CheckNoRtp2());
1701
1702 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001703 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1704 fake_rtp_dtls_transport1_->SetWritable(true);
1705 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001707 SendRtp1();
1708 SendRtp2();
1709 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 EXPECT_TRUE(CheckRtp1());
1711 EXPECT_TRUE(CheckRtp2());
1712 EXPECT_TRUE(CheckNoRtp1());
1713 EXPECT_TRUE(CheckNoRtp2());
1714
1715 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001716 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1717 bool asymmetric = true;
1718 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1719 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 EXPECT_TRUE(media_channel1_->sending());
1721
wu@webrtc.org97077a32013-10-25 21:18:33 +00001722 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001723 SendRtp1();
1724 SendRtp2();
1725 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_TRUE(CheckRtp1());
1727 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001728 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729
1730 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001731 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001732 bool asymmetric = true;
1733 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1734 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001735 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001736 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737 SendRtp1();
1738 SendRtp2();
1739 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_TRUE(CheckRtp1());
1741 EXPECT_TRUE(CheckRtp2());
1742 EXPECT_TRUE(CheckNoRtp1());
1743 EXPECT_TRUE(CheckNoRtp2());
1744 }
1745
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001746 void SendBundleToBundle(
1747 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1748 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001750 // Only pl_type1 was added to the bundle filter for both |channel1_|
1751 // and |channel2_|.
1752 int pl_type1 = pl_types[0];
1753 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001754 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001755 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001756 if (rtcp_mux) {
1757 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001758 }
1759 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001761 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1762 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001764 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1765 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001766 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1767 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1768 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1769 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001770
1771 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1773 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1774 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001775 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001776 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1777 EXPECT_TRUE(CheckNoRtp1());
1778 EXPECT_TRUE(CheckNoRtp2());
1779
1780 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1782 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1783 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001784 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001785 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787 SendCustomRtcp1(kSsrc1);
1788 SendCustomRtcp2(kSsrc2);
1789 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1791 EXPECT_TRUE(CheckNoRtcp1());
1792 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1793 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001795 SendCustomRtcp1(kSsrc2);
1796 SendCustomRtcp2(kSsrc1);
1797 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001798 // Bundle filter shouldn't filter out any RTCP.
1799 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1800 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801 }
1802
deadbeefc6b6e092016-12-01 12:49:20 -08001803 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 CreateChannels(0, 0);
1806 EXPECT_TRUE(SendInitiate());
1807 EXPECT_TRUE(SendAccept());
1808 channel1_->StartMediaMonitor(100);
1809 channel2_->StartMediaMonitor(100);
1810 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001811 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1812 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 channel1_->StopMediaMonitor();
1814 channel2_->StopMediaMonitor();
1815 // Ensure a restart of a stopped monitor works.
1816 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001817 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 channel1_->StopMediaMonitor();
1819 // Ensure stopping a stopped monitor is OK.
1820 channel1_->StopMediaMonitor();
1821 }
1822
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823 void TestSetContentFailure() {
1824 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825
Peter Thatchera6d24442015-07-09 21:26:36 -07001826 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001827 std::unique_ptr<typename T::Content> content(
1828 CreateMediaContentWithStream(1));
1829
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001831 EXPECT_FALSE(
1832 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1833 EXPECT_FALSE(
1834 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001837 EXPECT_FALSE(
1838 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1839
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001841 EXPECT_FALSE(
1842 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 }
1844
1845 void TestSendTwoOffers() {
1846 CreateChannels(0, 0);
1847
Peter Thatchera6d24442015-07-09 21:26:36 -07001848 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001849 std::unique_ptr<typename T::Content> content1(
1850 CreateMediaContentWithStream(1));
1851 EXPECT_TRUE(
1852 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1854
Steve Anton18ee1d52017-09-11 11:32:35 -07001855 std::unique_ptr<typename T::Content> content2(
1856 CreateMediaContentWithStream(2));
1857 EXPECT_TRUE(
1858 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1860 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1861 }
1862
1863 void TestReceiveTwoOffers() {
1864 CreateChannels(0, 0);
1865
Peter Thatchera6d24442015-07-09 21:26:36 -07001866 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001867 std::unique_ptr<typename T::Content> content1(
1868 CreateMediaContentWithStream(1));
1869 EXPECT_TRUE(
1870 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1872
Steve Anton18ee1d52017-09-11 11:32:35 -07001873 std::unique_ptr<typename T::Content> content2(
1874 CreateMediaContentWithStream(2));
1875 EXPECT_TRUE(
1876 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1878 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1879 }
1880
1881 void TestSendPrAnswer() {
1882 CreateChannels(0, 0);
1883
Peter Thatchera6d24442015-07-09 21:26:36 -07001884 std::string err;
1885 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001886 std::unique_ptr<typename T::Content> content1(
1887 CreateMediaContentWithStream(1));
1888 EXPECT_TRUE(
1889 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001890 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1891
Peter Thatchera6d24442015-07-09 21:26:36 -07001892 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001893 std::unique_ptr<typename T::Content> content2(
1894 CreateMediaContentWithStream(2));
1895 EXPECT_TRUE(
1896 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1898 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1899
Peter Thatchera6d24442015-07-09 21:26:36 -07001900 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001901 std::unique_ptr<typename T::Content> content3(
1902 CreateMediaContentWithStream(3));
1903 EXPECT_TRUE(
1904 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1906 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1907 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1908 }
1909
1910 void TestReceivePrAnswer() {
1911 CreateChannels(0, 0);
1912
Peter Thatchera6d24442015-07-09 21:26:36 -07001913 std::string err;
1914 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001915 std::unique_ptr<typename T::Content> content1(
1916 CreateMediaContentWithStream(1));
1917 EXPECT_TRUE(
1918 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1920
Peter Thatchera6d24442015-07-09 21:26:36 -07001921 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001922 std::unique_ptr<typename T::Content> content2(
1923 CreateMediaContentWithStream(2));
1924 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1925 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1927 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1928
Peter Thatchera6d24442015-07-09 21:26:36 -07001929 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001930 std::unique_ptr<typename T::Content> content3(
1931 CreateMediaContentWithStream(3));
1932 EXPECT_TRUE(
1933 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1935 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1936 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1937 }
1938
1939 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001940 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 EXPECT_TRUE(SendInitiate());
1942 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001943 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1944 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945
1946 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 // The sending message is only posted. channel2_ should be empty.
1949 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1951 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952
1953 // When channel1_ is deleted, the RTCP packet should be sent out to
1954 // channel2_.
1955 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001956 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 EXPECT_TRUE(CheckRtcp2());
1958 }
1959
zstein56162b92017-04-24 16:54:35 -07001960 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001961 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963
zstein56162b92017-04-24 16:54:35 -07001964 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 EXPECT_TRUE(media_channel1_->ready_to_send());
1967
zstein56162b92017-04-24 16:54:35 -07001968 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001969 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 }
1972
zstein56162b92017-04-24 16:54:35 -07001973 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001974 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 typename T::Content content;
1976 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001977 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001979 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001980 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001981 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001982 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1983 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 EXPECT_FALSE(media_channel1_->ready_to_send());
1985 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1986 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001987 network_thread_->Invoke<void>(RTC_FROM_HERE,
1988 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001989 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001990 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991
zstein56162b92017-04-24 16:54:35 -07001992 // TODO(zstein): Find a way to test this without making
1993 // OnTransportReadyToSend public.
1994 network_thread_->Invoke<void>(
1995 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001996 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997 EXPECT_FALSE(media_channel1_->ready_to_send());
1998 }
1999
skvladdc1c62c2016-03-16 19:07:43 -07002000 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
2001 typename T::Content content;
2002 CreateContent(0, kPcmuCodec, kH264Codec, &content);
2003 content.set_bandwidth(remote_limit);
2004 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
2005 }
2006
deadbeefe702b302017-02-04 12:09:01 -08002007 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07002008 webrtc::RtpParameters parameters;
2009 webrtc::RtpEncodingParameters encoding;
2010 encoding.max_bitrate_bps = limit;
2011 parameters.encodings.push_back(encoding);
2012 return parameters;
2013 }
2014
2015 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08002016 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07002017 EXPECT_EQ(1UL, parameters.encodings.size());
2018 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
2019 }
2020
2021 void DefaultMaxBitrateIsUnlimited() {
2022 CreateChannels(0, 0);
2023 EXPECT_TRUE(
2024 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2025 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08002026 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2027 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002028 }
2029
2030 void CanChangeMaxBitrate() {
2031 CreateChannels(0, 0);
2032 EXPECT_TRUE(
2033 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
2034
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07002035 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08002036 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
2037 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2038 rtc::Optional<int>(1000));
2039 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2040 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07002041 EXPECT_EQ(-1, media_channel1_->max_bps());
2042
deadbeefe702b302017-02-04 12:09:01 -08002043 EXPECT_TRUE(channel1_->SetRtpSendParameters(
2044 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
2045 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
2046 rtc::Optional<int>());
2047 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
2048 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07002049 EXPECT_EQ(-1, media_channel1_->max_bps());
2050 }
2051
Steve Anton8a63f782017-10-23 13:08:53 -07002052 // Test that when a channel gets new transports with a call to
2053 // |SetTransports|, the socket options from the old transports are merged with
2054 // the options on the new transport.
2055 // For example, audio and video may use separate socket options, but initially
2056 // be unbundled, then later become bundled. When this happens, their preferred
2057 // socket options should be merged to the underlying transport they share.
2058 void SocketOptionsMergedOnSetTransport() {
2059 constexpr int kSndBufSize = 4000;
2060 constexpr int kRcvBufSize = 8000;
2061
2062 CreateChannels(0, 0);
2063
2064 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
2065 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
2066 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
2067 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
2068
2069 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
2070 channel2_->rtcp_dtls_transport());
2071
2072 int option_val;
2073 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2074 rtc::Socket::Option::OPT_SNDBUF, &option_val));
2075 EXPECT_EQ(kSndBufSize, option_val);
2076 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
2077 rtc::Socket::Option::OPT_RCVBUF, &option_val));
2078 EXPECT_EQ(kRcvBufSize, option_val);
2079 }
2080
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
2083 static void ProcessThreadQueue(rtc::Thread* thread) {
2084 RTC_DCHECK(thread->IsCurrent());
2085 while (!thread->empty()) {
2086 thread->ProcessMessages(0);
2087 }
2088 }
2089 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
2090 // |threads| and current thread post packets to network thread.
2091 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002092 thread->Invoke<void>(RTC_FROM_HERE,
2093 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002094 }
2095 ProcessThreadQueue(rtc::Thread::Current());
2096 // Network thread move them around and post back to worker = current thread.
2097 if (!network_thread_->IsCurrent()) {
2098 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07002099 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002100 }
2101 // Worker thread = current Thread process received messages.
2102 ProcessThreadQueue(rtc::Thread::Current());
2103 }
Peter Boström34fbfff2015-09-24 19:20:30 +02002104 // TODO(pbos): Remove playout from all media channels and let renderers mute
2105 // themselves.
2106 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002107 std::unique_ptr<rtc::Thread> network_thread_keeper_;
2108 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08002109 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
2110 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
2111 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
2112 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
2113 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
2114 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
2115 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
2116 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117 cricket::FakeMediaEngine media_engine_;
2118 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08002119 typename T::MediaChannel* media_channel1_ = nullptr;
2120 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08002121 std::unique_ptr<typename T::Channel> channel1_;
2122 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123 typename T::Content local_media_content1_;
2124 typename T::Content local_media_content2_;
2125 typename T::Content remote_media_content1_;
2126 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002128 rtc::Buffer rtp_packet_;
2129 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08002130 int media_info_callbacks1_ = 0;
2131 int media_info_callbacks2_ = 0;
2132 int rtcp_mux_activated_callbacks1_ = 0;
2133 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07002134 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135};
2136
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137template<>
2138void ChannelTest<VoiceTraits>::CreateContent(
2139 int flags,
2140 const cricket::AudioCodec& audio_codec,
2141 const cricket::VideoCodec& video_codec,
2142 cricket::AudioContentDescription* audio) {
2143 audio->AddCodec(audio_codec);
2144 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2145 if (flags & SECURE) {
2146 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002147 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2148 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002149 }
2150}
2151
2152template<>
2153void ChannelTest<VoiceTraits>::CopyContent(
2154 const cricket::AudioContentDescription& source,
2155 cricket::AudioContentDescription* audio) {
2156 *audio = source;
2157}
2158
2159template<>
2160bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2161 const cricket::AudioCodec& c2) {
2162 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2163 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2164}
2165
Peter Boström0c4e06b2015-10-07 12:23:21 +02002166template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002168 uint32_t ssrc,
2169 int flags,
2170 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 audio->AddLegacyStream(ssrc);
2172}
2173
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002174class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175 public:
solenberg1dd98f32015-09-10 01:57:14 -07002176 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002177 VoiceChannelSingleThreadTest()
2178 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2179};
2180
2181class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2182 public:
2183 typedef ChannelTest<VoiceTraits> Base;
2184 VoiceChannelDoubleThreadTest()
2185 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002186};
2187
jbauch5869f502017-06-29 12:31:36 -07002188class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2189 : public ChannelTest<VoiceTraits> {
2190 public:
2191 typedef ChannelTest<VoiceTraits> Base;
2192 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2193 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2194 NetworkIsWorker::Yes) {}
2195};
2196
2197class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2198 : public ChannelTest<VoiceTraits> {
2199 public:
2200 typedef ChannelTest<VoiceTraits> Base;
2201 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2202 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2203 NetworkIsWorker::No) {}
2204};
2205
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002207template <>
Steve Anton8699a322017-11-06 15:53:33 -08002208std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209 rtc::Thread* worker_thread,
2210 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002211 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002212 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002213 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2214 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002215 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2216 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002217 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002218 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002219 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2220 worker_thread, network_thread, signaling_thread, std::move(ch),
2221 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2222 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002223 if (!channel->NeedsRtcpTransport()) {
2224 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002225 }
Steve Anton8699a322017-11-06 15:53:33 -08002226 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2227 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228 return channel;
2229}
2230
2231// override to add 0 parameter
2232template<>
2233bool ChannelTest<VideoTraits>::AddStream1(int id) {
2234 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2235}
2236
2237template<>
2238void ChannelTest<VideoTraits>::CreateContent(
2239 int flags,
2240 const cricket::AudioCodec& audio_codec,
2241 const cricket::VideoCodec& video_codec,
2242 cricket::VideoContentDescription* video) {
2243 video->AddCodec(video_codec);
2244 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2245 if (flags & SECURE) {
2246 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002247 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2248 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 }
2250}
2251
2252template<>
2253void ChannelTest<VideoTraits>::CopyContent(
2254 const cricket::VideoContentDescription& source,
2255 cricket::VideoContentDescription* video) {
2256 *video = source;
2257}
2258
2259template<>
2260bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2261 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002262 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263}
2264
Peter Boström0c4e06b2015-10-07 12:23:21 +02002265template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002267 uint32_t ssrc,
2268 int flags,
2269 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270 video->AddLegacyStream(ssrc);
2271}
2272
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002274 public:
solenberg1dd98f32015-09-10 01:57:14 -07002275 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276 VideoChannelSingleThreadTest()
2277 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278};
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2281 public:
2282 typedef ChannelTest<VideoTraits> Base;
2283 VideoChannelDoubleThreadTest()
2284 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2285};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002287TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 Base::TestInit();
2289 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2290 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2291}
2292
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002293TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2294 Base::TestDeinit();
2295}
2296
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 Base::TestSetContents();
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::TestSetContentsNullOffer();
2303}
2304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::TestSetContentsRtcpMux();
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 Base::TestSetContentsRtcpMux();
2311}
2312
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002313TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 Base::TestSetRemoteContentUpdate();
2315}
2316
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002317TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 Base::TestStreams();
2319}
2320
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002321TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 Base::TestUpdateStreamsInLocalContent();
2323}
2324
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 Base::TestUpdateStreamsInRemoteContent();
2327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 Base::TestChangeStreamParamsInContent();
2331}
2332
jbauch5869f502017-06-29 12:31:36 -07002333TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2334 TestChangeEncryptedHeaderExtensionsDtls) {
2335 int flags = DTLS;
2336 Base::TestChangeEncryptedHeaderExtensions(flags);
2337}
2338
2339TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2340 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2341 int flags = DTLS;
2342 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2343}
2344
2345TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2346 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2347 int flags = DTLS;
2348 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2349}
2350
2351TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2352 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2353 int flags = DTLS | GCM_CIPHER;
2354 Base::TestChangeEncryptedHeaderExtensions(flags);
2355}
2356
2357TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2358 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2359 int flags = DTLS | GCM_CIPHER;
2360 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2361}
2362
2363TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2364 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2365 int flags = DTLS | GCM_CIPHER;
2366 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2367}
2368
2369TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2370 TestChangeEncryptedHeaderExtensionsSDES) {
2371 int flags = 0;
2372 Base::TestChangeEncryptedHeaderExtensions(flags);
2373}
2374
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 Base::TestPlayoutAndSendingStates();
2377}
2378
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002379TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002380 CreateChannels(0, 0);
2381 // Test that we can Mute the default channel even though the sending SSRC
2382 // is unknown.
2383 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002384 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002385 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2386 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002387 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2388
2389 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002390 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002391
2392 SendInitiate();
2393 // After the local session description has been set, we can mute a stream
2394 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002395 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002396 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2397 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002398 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399}
2400
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002401TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402 Base::TestMediaContentDirection();
2403}
2404
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002405TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002406 Base::TestNetworkRouteChanges();
2407}
2408
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002409TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 Base::TestCallSetup();
2411}
2412
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 Base::TestCallTeardownRtcpMux();
2415}
2416
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002417TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 Base::SendRtpToRtp();
2419}
2420
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002421TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422 Base::SendRtcpToRtcp();
2423}
2424
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 Base::SendRtcpMuxToRtcp();
2427}
2428
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430 Base::SendRtcpMuxToRtcpMux();
2431}
2432
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002434 Base::SendRequireRtcpMuxToRtcpMux();
2435}
2436
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002438 Base::SendRtcpMuxToRequireRtcpMux();
2439}
2440
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002442 Base::SendRequireRtcpMuxToRequireRtcpMux();
2443}
2444
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002446 Base::SendRequireRtcpMuxToNoRtcpMux();
2447}
2448
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450 Base::SendEarlyRtcpMuxToRtcp();
2451}
2452
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002454 Base::SendEarlyRtcpMuxToRtcpMux();
2455}
2456
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2459}
2460
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 Base::SendSrtpToSrtp();
2463}
2464
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2467}
2468
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 Base::SendSrtpToSrtp(DTLS, 0);
2471}
2472
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002473TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 Base::SendSrtpToSrtp(DTLS, DTLS);
2475}
2476
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002477TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2479}
2480
deadbeeff5346592017-01-24 21:51:21 -08002481// Test using the channel with a raw packet interface, as opposed to a DTLS
2482// transport interface.
2483TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2484 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2485}
2486
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002487TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2489}
2490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002491TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::SendRtpToRtpOnThread();
2493}
2494
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002495TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 Base::SendSrtpToSrtpOnThread();
2497}
2498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002499TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::SendWithWritabilityLoss();
2501}
2502
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002503TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestMediaMonitor();
2505}
2506
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002508TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509 CreateChannels(0, 0);
2510 EXPECT_TRUE(SendInitiate());
2511 EXPECT_TRUE(SendAccept());
2512 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2513
solenberg1d63dd02015-12-02 12:35:09 -08002514 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2515 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2516 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002517
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002518 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002520 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002521 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002522 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002523 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002524 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525}
2526
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002527TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 Base::TestSetContentFailure();
2529}
2530
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002531TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 Base::TestSendTwoOffers();
2533}
2534
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002535TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 Base::TestReceiveTwoOffers();
2537}
2538
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002539TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 Base::TestSendPrAnswer();
2541}
2542
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002543TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 Base::TestReceivePrAnswer();
2545}
2546
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002547TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 Base::TestFlushRtcp();
2549}
2550
zstein56162b92017-04-24 16:54:35 -07002551TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2552 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553}
2554
zstein56162b92017-04-24 16:54:35 -07002555TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2556 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557}
2558
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002560TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002561 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 EXPECT_TRUE(SendInitiate());
2563 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002564 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565
solenberg4bac9c52015-10-09 02:32:53 -07002566 // Default is (1.0).
2567 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2568 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002570 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571
solenberg4bac9c52015-10-09 02:32:53 -07002572 // Set scale to (1.5).
2573 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2574 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2575 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576
solenberg4bac9c52015-10-09 02:32:53 -07002577 // Set scale to (0).
2578 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2579 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2580 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002581}
2582
2583// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002584TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002585 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586 EXPECT_TRUE(SendInitiate());
2587 EXPECT_TRUE(SendAccept());
2588 EXPECT_TRUE(AddStream1(1));
2589 EXPECT_TRUE(AddStream1(2));
2590
solenberg4bac9c52015-10-09 02:32:53 -07002591 double volume;
2592 // Default is (1.0).
2593 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2594 EXPECT_DOUBLE_EQ(1.0, volume);
2595 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2596 EXPECT_DOUBLE_EQ(1.0, volume);
2597 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2598 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002600 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601
solenberg4bac9c52015-10-09 02:32:53 -07002602 // Set scale to (1.5) for ssrc = 1.
2603 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2604 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2605 EXPECT_DOUBLE_EQ(1.5, volume);
2606 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2607 EXPECT_DOUBLE_EQ(1.0, volume);
2608 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2609 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002610
solenberg4bac9c52015-10-09 02:32:53 -07002611 // Set scale to (0) for all ssrcs.
2612 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2613 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2614 EXPECT_DOUBLE_EQ(0.0, volume);
2615 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2616 EXPECT_DOUBLE_EQ(0.0, volume);
2617 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2618 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002619}
2620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002621TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002622 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623}
2624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002625TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002626 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002627}
2628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002629TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002630 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002631}
2632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002633TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002634 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635}
2636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002637TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002638 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002639}
2640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002641TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002642 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002643}
2644
Steve Anton8a63f782017-10-23 13:08:53 -07002645TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2646 Base::SocketOptionsMergedOnSetTransport();
2647}
2648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002649// VoiceChannelDoubleThreadTest
2650TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002652 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2653 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654}
2655
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002656TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2657 Base::TestDeinit();
2658}
2659
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002660TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 Base::TestSetContents();
2662}
2663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002664TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 Base::TestSetContentsNullOffer();
2666}
2667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002668TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 Base::TestSetContentsRtcpMux();
2670}
2671
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002672TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 Base::TestSetContentsRtcpMux();
2674}
2675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002676TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 Base::TestSetRemoteContentUpdate();
2678}
2679
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002680TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 Base::TestStreams();
2682}
2683
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002684TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 Base::TestUpdateStreamsInLocalContent();
2686}
2687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002688TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 Base::TestUpdateStreamsInRemoteContent();
2690}
2691
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002692TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 Base::TestChangeStreamParamsInContent();
2694}
2695
jbauch5869f502017-06-29 12:31:36 -07002696TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2697 TestChangeEncryptedHeaderExtensionsDtls) {
2698 int flags = DTLS;
2699 Base::TestChangeEncryptedHeaderExtensions(flags);
2700}
2701
2702TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2703 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2704 int flags = DTLS;
2705 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2706}
2707
2708TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2709 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2710 int flags = DTLS;
2711 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2712}
2713
2714TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2715 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2716 int flags = DTLS | GCM_CIPHER;
2717 Base::TestChangeEncryptedHeaderExtensions(flags);
2718}
2719
2720TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2721 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2722 int flags = DTLS | GCM_CIPHER;
2723 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2724}
2725
2726TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2727 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2728 int flags = DTLS | GCM_CIPHER;
2729 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2730}
2731
2732TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2733 TestChangeEncryptedHeaderExtensionsSDES) {
2734 int flags = 0;
2735 Base::TestChangeEncryptedHeaderExtensions(flags);
2736}
2737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002738TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739 Base::TestPlayoutAndSendingStates();
2740}
2741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002742TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2743 CreateChannels(0, 0);
2744 // Test that we can Mute the default channel even though the sending SSRC
2745 // is unknown.
2746 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2747 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2748 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2749 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2750 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2751
2752 // Test that we can not mute an unknown SSRC.
2753 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2754
2755 SendInitiate();
2756 // After the local session description has been set, we can mute a stream
2757 // with its SSRC.
2758 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2759 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2760 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2761 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2762}
2763
2764TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2765 Base::TestMediaContentDirection();
2766}
2767
2768TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2769 Base::TestNetworkRouteChanges();
2770}
2771
2772TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2773 Base::TestCallSetup();
2774}
2775
2776TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2777 Base::TestCallTeardownRtcpMux();
2778}
2779
2780TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2781 Base::SendRtpToRtp();
2782}
2783
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002784TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2785 Base::SendRtcpToRtcp();
2786}
2787
2788TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2789 Base::SendRtcpMuxToRtcp();
2790}
2791
2792TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2793 Base::SendRtcpMuxToRtcpMux();
2794}
2795
2796TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2797 Base::SendRequireRtcpMuxToRtcpMux();
2798}
2799
2800TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2801 Base::SendRtcpMuxToRequireRtcpMux();
2802}
2803
2804TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2805 Base::SendRequireRtcpMuxToRequireRtcpMux();
2806}
2807
2808TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2809 Base::SendRequireRtcpMuxToNoRtcpMux();
2810}
2811
2812TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2813 Base::SendEarlyRtcpMuxToRtcp();
2814}
2815
2816TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2817 Base::SendEarlyRtcpMuxToRtcpMux();
2818}
2819
2820TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2821 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2822}
2823
2824TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2825 Base::SendSrtpToSrtp();
2826}
2827
2828TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2829 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2830}
2831
2832TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002833 Base::SendSrtpToSrtp(DTLS, 0);
2834}
2835
2836TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002837 Base::SendSrtpToSrtp(DTLS, DTLS);
2838}
2839
2840TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002841 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2842}
2843
deadbeeff5346592017-01-24 21:51:21 -08002844// Test using the channel with a raw packet interface, as opposed to a DTLS
2845// transport interface.
2846TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2847 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2848}
2849
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002850TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2851 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2852}
2853
2854TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2855 Base::SendRtpToRtpOnThread();
2856}
2857
2858TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2859 Base::SendSrtpToSrtpOnThread();
2860}
2861
2862TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2863 Base::SendWithWritabilityLoss();
2864}
2865
2866TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2867 Base::TestMediaMonitor();
2868}
2869
2870// Test that InsertDtmf properly forwards to the media channel.
2871TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2872 CreateChannels(0, 0);
2873 EXPECT_TRUE(SendInitiate());
2874 EXPECT_TRUE(SendAccept());
2875 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2876
2877 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2878 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2879 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2880
2881 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2882 EXPECT_TRUE(
2883 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2884 EXPECT_TRUE(
2885 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2886 EXPECT_TRUE(
2887 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2888}
2889
2890TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2891 Base::TestSetContentFailure();
2892}
2893
2894TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2895 Base::TestSendTwoOffers();
2896}
2897
2898TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2899 Base::TestReceiveTwoOffers();
2900}
2901
2902TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2903 Base::TestSendPrAnswer();
2904}
2905
2906TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2907 Base::TestReceivePrAnswer();
2908}
2909
2910TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2911 Base::TestFlushRtcp();
2912}
2913
zstein56162b92017-04-24 16:54:35 -07002914TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2915 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002916}
2917
zstein56162b92017-04-24 16:54:35 -07002918TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2919 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002920}
2921
2922// Test that we can scale the output volume properly for 1:1 calls.
2923TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002924 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002925 EXPECT_TRUE(SendInitiate());
2926 EXPECT_TRUE(SendAccept());
2927 double volume;
2928
2929 // Default is (1.0).
2930 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2931 EXPECT_DOUBLE_EQ(1.0, volume);
2932 // invalid ssrc.
2933 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2934
2935 // Set scale to (1.5).
2936 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2937 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2938 EXPECT_DOUBLE_EQ(1.5, volume);
2939
2940 // Set scale to (0).
2941 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2942 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2943 EXPECT_DOUBLE_EQ(0.0, volume);
2944}
2945
2946// Test that we can scale the output volume properly for multiway calls.
2947TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002948 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002949 EXPECT_TRUE(SendInitiate());
2950 EXPECT_TRUE(SendAccept());
2951 EXPECT_TRUE(AddStream1(1));
2952 EXPECT_TRUE(AddStream1(2));
2953
2954 double volume;
2955 // Default is (1.0).
2956 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2957 EXPECT_DOUBLE_EQ(1.0, volume);
2958 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2959 EXPECT_DOUBLE_EQ(1.0, volume);
2960 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2961 EXPECT_DOUBLE_EQ(1.0, volume);
2962 // invalid ssrc.
2963 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2964
2965 // Set scale to (1.5) for ssrc = 1.
2966 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2967 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2968 EXPECT_DOUBLE_EQ(1.5, volume);
2969 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2970 EXPECT_DOUBLE_EQ(1.0, volume);
2971 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2972 EXPECT_DOUBLE_EQ(1.0, volume);
2973
2974 // Set scale to (0) for all ssrcs.
2975 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2976 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2977 EXPECT_DOUBLE_EQ(0.0, volume);
2978 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2979 EXPECT_DOUBLE_EQ(0.0, volume);
2980 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2981 EXPECT_DOUBLE_EQ(0.0, volume);
2982}
2983
2984TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2985 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2986}
2987
2988TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2989 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2990}
2991
2992TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2993 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2994}
2995
2996TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2997 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2998}
2999
3000TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3001 Base::DefaultMaxBitrateIsUnlimited();
3002}
3003
3004TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
3005 Base::CanChangeMaxBitrate();
3006}
3007
Steve Anton8a63f782017-10-23 13:08:53 -07003008TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3009 Base::SocketOptionsMergedOnSetTransport();
3010}
3011
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003012// VideoChannelSingleThreadTest
3013TEST_F(VideoChannelSingleThreadTest, TestInit) {
3014 Base::TestInit();
3015}
3016
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003017TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
3018 Base::TestDeinit();
3019}
3020
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003021TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
3022 Base::TestSetContents();
3023}
3024
3025TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
3026 Base::TestSetContentsNullOffer();
3027}
3028
3029TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
3030 Base::TestSetContentsRtcpMux();
3031}
3032
3033TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3034 Base::TestSetContentsRtcpMux();
3035}
3036
3037TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
3038 Base::TestSetRemoteContentUpdate();
3039}
3040
3041TEST_F(VideoChannelSingleThreadTest, TestStreams) {
3042 Base::TestStreams();
3043}
3044
3045TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
3046 Base::TestUpdateStreamsInLocalContent();
3047}
3048
3049TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
3050 Base::TestUpdateStreamsInRemoteContent();
3051}
3052
3053TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
3054 Base::TestChangeStreamParamsInContent();
3055}
3056
3057TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
3058 Base::TestPlayoutAndSendingStates();
3059}
3060
3061TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07003062 CreateChannels(0, 0);
3063 // Test that we can Mute the default channel even though the sending SSRC
3064 // is unknown.
3065 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003066 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003067 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003068 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003069 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3070 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003071 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003072 SendInitiate();
3073 // After the local session description has been set, we can mute a stream
3074 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003075 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07003076 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003077 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07003078 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003079}
3080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003081TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003082 Base::TestMediaContentDirection();
3083}
3084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003085TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07003086 Base::TestNetworkRouteChanges();
3087}
3088
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003089TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003090 Base::TestCallSetup();
3091}
3092
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003093TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094 Base::TestCallTeardownRtcpMux();
3095}
3096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003097TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003098 Base::SendRtpToRtp();
3099}
3100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003101TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003102 Base::SendRtcpToRtcp();
3103}
3104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003105TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106 Base::SendRtcpMuxToRtcp();
3107}
3108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003109TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110 Base::SendRtcpMuxToRtcpMux();
3111}
3112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003113TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003114 Base::SendRequireRtcpMuxToRtcpMux();
3115}
3116
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003117TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003118 Base::SendRtcpMuxToRequireRtcpMux();
3119}
3120
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003121TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003122 Base::SendRequireRtcpMuxToRequireRtcpMux();
3123}
3124
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003125TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07003126 Base::SendRequireRtcpMuxToNoRtcpMux();
3127}
3128
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003129TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003130 Base::SendEarlyRtcpMuxToRtcp();
3131}
3132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003133TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003134 Base::SendEarlyRtcpMuxToRtcpMux();
3135}
3136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003137TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003138 Base::SendSrtpToSrtp();
3139}
3140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003141TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003142 Base::SendSrtpToSrtp();
3143}
3144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003145TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003146 Base::SendSrtpToSrtp(DTLS, 0);
3147}
3148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003149TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003150 Base::SendSrtpToSrtp(DTLS, DTLS);
3151}
3152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003153TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003154 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3155}
3156
deadbeeff5346592017-01-24 21:51:21 -08003157// Test using the channel with a raw packet interface, as opposed to a DTLS
3158// transport interface.
3159TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3160 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3161}
3162
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003163TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003164 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3165}
3166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003167TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003168 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3169}
3170
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003171TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003172 Base::SendRtpToRtpOnThread();
3173}
3174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003175TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003176 Base::SendSrtpToSrtpOnThread();
3177}
3178
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003179TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003180 Base::SendWithWritabilityLoss();
3181}
3182
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003183TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 Base::TestMediaMonitor();
3185}
3186
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003187TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003188 Base::TestSetContentFailure();
3189}
3190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003191TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003192 Base::TestSendTwoOffers();
3193}
3194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003195TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003196 Base::TestReceiveTwoOffers();
3197}
3198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003199TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003200 Base::TestSendPrAnswer();
3201}
3202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003203TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003204 Base::TestReceivePrAnswer();
3205}
3206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003207TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003208 Base::TestFlushRtcp();
3209}
3210
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003211TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003212 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003213}
3214
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003215TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003216 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003217}
3218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003219TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003220 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003221}
3222
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003223TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003224 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003225}
3226
zstein56162b92017-04-24 16:54:35 -07003227TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3228 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003229}
3230
zstein56162b92017-04-24 16:54:35 -07003231TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3232 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003233}
3234
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003235TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003236 Base::DefaultMaxBitrateIsUnlimited();
3237}
3238
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003239TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003240 Base::CanChangeMaxBitrate();
3241}
3242
Steve Anton8a63f782017-10-23 13:08:53 -07003243TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3244 Base::SocketOptionsMergedOnSetTransport();
3245}
3246
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003247// VideoChannelDoubleThreadTest
3248TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3249 Base::TestInit();
3250}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003251
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003252TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3253 Base::TestDeinit();
3254}
3255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003256TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3257 Base::TestSetContents();
3258}
3259
3260TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3261 Base::TestSetContentsNullOffer();
3262}
3263
3264TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3265 Base::TestSetContentsRtcpMux();
3266}
3267
3268TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3269 Base::TestSetContentsRtcpMux();
3270}
3271
3272TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3273 Base::TestSetRemoteContentUpdate();
3274}
3275
3276TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3277 Base::TestStreams();
3278}
3279
3280TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3281 Base::TestUpdateStreamsInLocalContent();
3282}
3283
3284TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3285 Base::TestUpdateStreamsInRemoteContent();
3286}
3287
3288TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3289 Base::TestChangeStreamParamsInContent();
3290}
3291
3292TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3293 Base::TestPlayoutAndSendingStates();
3294}
3295
3296TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3297 CreateChannels(0, 0);
3298 // Test that we can Mute the default channel even though the sending SSRC
3299 // is unknown.
3300 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003301 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003302 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003303 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003304 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3305 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003306 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003307 SendInitiate();
3308 // After the local session description has been set, we can mute a stream
3309 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003310 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003311 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003312 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003313 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3314}
3315
3316TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3317 Base::TestMediaContentDirection();
3318}
3319
3320TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3321 Base::TestNetworkRouteChanges();
3322}
3323
3324TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3325 Base::TestCallSetup();
3326}
3327
3328TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3329 Base::TestCallTeardownRtcpMux();
3330}
3331
3332TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3333 Base::SendRtpToRtp();
3334}
3335
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003336TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3337 Base::SendRtcpToRtcp();
3338}
3339
3340TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3341 Base::SendRtcpMuxToRtcp();
3342}
3343
3344TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3345 Base::SendRtcpMuxToRtcpMux();
3346}
3347
3348TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3349 Base::SendRequireRtcpMuxToRtcpMux();
3350}
3351
3352TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3353 Base::SendRtcpMuxToRequireRtcpMux();
3354}
3355
3356TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3357 Base::SendRequireRtcpMuxToRequireRtcpMux();
3358}
3359
3360TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3361 Base::SendRequireRtcpMuxToNoRtcpMux();
3362}
3363
3364TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3365 Base::SendEarlyRtcpMuxToRtcp();
3366}
3367
3368TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3369 Base::SendEarlyRtcpMuxToRtcpMux();
3370}
3371
3372TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3373 Base::SendSrtpToSrtp();
3374}
3375
3376TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3377 Base::SendSrtpToSrtp();
3378}
3379
3380TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003381 Base::SendSrtpToSrtp(DTLS, 0);
3382}
3383
3384TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003385 Base::SendSrtpToSrtp(DTLS, DTLS);
3386}
3387
3388TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003389 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3390}
3391
deadbeeff5346592017-01-24 21:51:21 -08003392// Test using the channel with a raw packet interface, as opposed to a DTLS
3393// transport interface.
3394TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3395 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3396}
3397
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003398TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3399 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3400}
3401
3402TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3403 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3404}
3405
3406TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3407 Base::SendRtpToRtpOnThread();
3408}
3409
3410TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3411 Base::SendSrtpToSrtpOnThread();
3412}
3413
3414TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3415 Base::SendWithWritabilityLoss();
3416}
3417
3418TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3419 Base::TestMediaMonitor();
3420}
3421
3422TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3423 Base::TestSetContentFailure();
3424}
3425
3426TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3427 Base::TestSendTwoOffers();
3428}
3429
3430TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3431 Base::TestReceiveTwoOffers();
3432}
3433
3434TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3435 Base::TestSendPrAnswer();
3436}
3437
3438TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3439 Base::TestReceivePrAnswer();
3440}
3441
3442TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3443 Base::TestFlushRtcp();
3444}
3445
3446TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3447 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3448}
3449
3450TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3451 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3452}
3453
3454TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3455 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3456}
3457
3458TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3459 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3460}
3461
zstein56162b92017-04-24 16:54:35 -07003462TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3463 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003464}
3465
zstein56162b92017-04-24 16:54:35 -07003466TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3467 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003468}
3469
3470TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3471 Base::DefaultMaxBitrateIsUnlimited();
3472}
3473
3474TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3475 Base::CanChangeMaxBitrate();
3476}
3477
Steve Anton8a63f782017-10-23 13:08:53 -07003478TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3479 Base::SocketOptionsMergedOnSetTransport();
3480}
3481
deadbeef953c2ce2017-01-09 14:53:41 -08003482// RtpDataChannelSingleThreadTest
3483class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003484 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003485 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003486 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003487 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3488};
3489
deadbeef953c2ce2017-01-09 14:53:41 -08003490// RtpDataChannelDoubleThreadTest
3491class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003492 public:
3493 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003494 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003495 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003496};
3497
3498// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003499template <>
Steve Anton8699a322017-11-06 15:53:33 -08003500std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003501 rtc::Thread* worker_thread,
3502 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003503 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003504 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003505 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3506 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003507 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3508 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003509 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003510 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003511 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3512 worker_thread, network_thread, signaling_thread, std::move(ch),
3513 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3514 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003515 if (!channel->NeedsRtcpTransport()) {
3516 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003517 }
Steve Anton8699a322017-11-06 15:53:33 -08003518 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3519 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003520 return channel;
3521}
3522
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003523template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003524void ChannelTest<DataTraits>::CreateContent(
3525 int flags,
3526 const cricket::AudioCodec& audio_codec,
3527 const cricket::VideoCodec& video_codec,
3528 cricket::DataContentDescription* data) {
3529 data->AddCodec(kGoogleDataCodec);
3530 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3531 if (flags & SECURE) {
3532 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003533 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3534 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003535 }
3536}
3537
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003538template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003539void ChannelTest<DataTraits>::CopyContent(
3540 const cricket::DataContentDescription& source,
3541 cricket::DataContentDescription* data) {
3542 *data = source;
3543}
3544
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003545template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003546bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3547 const cricket::DataCodec& c2) {
3548 return c1.name == c2.name;
3549}
3550
Peter Boström0c4e06b2015-10-07 12:23:21 +02003551template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003552void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003553 uint32_t ssrc,
3554 int flags,
3555 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003556 data->AddLegacyStream(ssrc);
3557}
3558
deadbeef953c2ce2017-01-09 14:53:41 -08003559TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003560 Base::TestInit();
3561 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3562}
3563
deadbeef953c2ce2017-01-09 14:53:41 -08003564TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003565 Base::TestDeinit();
3566}
3567
deadbeef953c2ce2017-01-09 14:53:41 -08003568TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003569 Base::TestSetContents();
3570}
3571
deadbeef953c2ce2017-01-09 14:53:41 -08003572TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003573 Base::TestSetContentsNullOffer();
3574}
3575
deadbeef953c2ce2017-01-09 14:53:41 -08003576TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003577 Base::TestSetContentsRtcpMux();
3578}
3579
deadbeef953c2ce2017-01-09 14:53:41 -08003580TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003581 Base::TestSetRemoteContentUpdate();
3582}
3583
deadbeef953c2ce2017-01-09 14:53:41 -08003584TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003585 Base::TestStreams();
3586}
3587
deadbeef953c2ce2017-01-09 14:53:41 -08003588TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003589 Base::TestUpdateStreamsInLocalContent();
3590}
3591
deadbeef953c2ce2017-01-09 14:53:41 -08003592TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003593 Base::TestUpdateStreamsInRemoteContent();
3594}
3595
deadbeef953c2ce2017-01-09 14:53:41 -08003596TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003597 Base::TestChangeStreamParamsInContent();
3598}
3599
deadbeef953c2ce2017-01-09 14:53:41 -08003600TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003601 Base::TestPlayoutAndSendingStates();
3602}
3603
deadbeef953c2ce2017-01-09 14:53:41 -08003604TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003605 Base::TestMediaContentDirection();
3606}
3607
deadbeef953c2ce2017-01-09 14:53:41 -08003608TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003609 Base::TestCallSetup();
3610}
3611
deadbeef953c2ce2017-01-09 14:53:41 -08003612TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003613 Base::TestCallTeardownRtcpMux();
3614}
3615
zstein56162b92017-04-24 16:54:35 -07003616TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3617 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003618}
3619
zstein56162b92017-04-24 16:54:35 -07003620TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3621 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003622}
3623
deadbeef953c2ce2017-01-09 14:53:41 -08003624TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003625 Base::SendRtpToRtp();
3626}
3627
deadbeef953c2ce2017-01-09 14:53:41 -08003628TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003629 Base::SendRtcpToRtcp();
3630}
3631
deadbeef953c2ce2017-01-09 14:53:41 -08003632TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003633 Base::SendRtcpMuxToRtcp();
3634}
3635
deadbeef953c2ce2017-01-09 14:53:41 -08003636TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003637 Base::SendRtcpMuxToRtcpMux();
3638}
3639
deadbeef953c2ce2017-01-09 14:53:41 -08003640TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003641 Base::SendEarlyRtcpMuxToRtcp();
3642}
3643
deadbeef953c2ce2017-01-09 14:53:41 -08003644TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003645 Base::SendEarlyRtcpMuxToRtcpMux();
3646}
3647
deadbeef953c2ce2017-01-09 14:53:41 -08003648TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003649 Base::SendSrtpToSrtp();
3650}
3651
deadbeef953c2ce2017-01-09 14:53:41 -08003652TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003653 Base::SendSrtpToSrtp();
3654}
3655
deadbeef953c2ce2017-01-09 14:53:41 -08003656TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003657 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3658}
3659
deadbeef953c2ce2017-01-09 14:53:41 -08003660TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003661 Base::SendRtpToRtpOnThread();
3662}
3663
deadbeef953c2ce2017-01-09 14:53:41 -08003664TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003665 Base::SendSrtpToSrtpOnThread();
3666}
3667
deadbeef953c2ce2017-01-09 14:53:41 -08003668TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003669 Base::SendWithWritabilityLoss();
3670}
3671
deadbeef953c2ce2017-01-09 14:53:41 -08003672TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003673 Base::TestMediaMonitor();
3674}
3675
Steve Anton8a63f782017-10-23 13:08:53 -07003676TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3677 Base::SocketOptionsMergedOnSetTransport();
3678}
3679
deadbeef953c2ce2017-01-09 14:53:41 -08003680TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003681 CreateChannels(0, 0);
3682 EXPECT_TRUE(SendInitiate());
3683 EXPECT_TRUE(SendAccept());
3684
3685 cricket::SendDataParams params;
3686 params.ssrc = 42;
3687 unsigned char data[] = {'f', 'o', 'o'};
3688 rtc::CopyOnWriteBuffer payload(data, 3);
3689 cricket::SendDataResult result;
3690 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3691 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3692 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3693}
3694
deadbeef953c2ce2017-01-09 14:53:41 -08003695TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003696 Base::TestInit();
3697 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3698}
3699
deadbeef953c2ce2017-01-09 14:53:41 -08003700TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003701 Base::TestDeinit();
3702}
3703
deadbeef953c2ce2017-01-09 14:53:41 -08003704TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003705 Base::TestSetContents();
3706}
3707
deadbeef953c2ce2017-01-09 14:53:41 -08003708TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003709 Base::TestSetContentsNullOffer();
3710}
3711
deadbeef953c2ce2017-01-09 14:53:41 -08003712TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003713 Base::TestSetContentsRtcpMux();
3714}
3715
deadbeef953c2ce2017-01-09 14:53:41 -08003716TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003717 Base::TestSetRemoteContentUpdate();
3718}
3719
deadbeef953c2ce2017-01-09 14:53:41 -08003720TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003721 Base::TestStreams();
3722}
3723
deadbeef953c2ce2017-01-09 14:53:41 -08003724TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003725 Base::TestUpdateStreamsInLocalContent();
3726}
3727
deadbeef953c2ce2017-01-09 14:53:41 -08003728TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003729 Base::TestUpdateStreamsInRemoteContent();
3730}
3731
deadbeef953c2ce2017-01-09 14:53:41 -08003732TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003733 Base::TestChangeStreamParamsInContent();
3734}
3735
deadbeef953c2ce2017-01-09 14:53:41 -08003736TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003737 Base::TestPlayoutAndSendingStates();
3738}
3739
deadbeef953c2ce2017-01-09 14:53:41 -08003740TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003741 Base::TestMediaContentDirection();
3742}
3743
deadbeef953c2ce2017-01-09 14:53:41 -08003744TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003745 Base::TestCallSetup();
3746}
3747
deadbeef953c2ce2017-01-09 14:53:41 -08003748TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003749 Base::TestCallTeardownRtcpMux();
3750}
3751
zstein56162b92017-04-24 16:54:35 -07003752TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3753 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003754}
3755
zstein56162b92017-04-24 16:54:35 -07003756TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3757 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003758}
3759
deadbeef953c2ce2017-01-09 14:53:41 -08003760TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003761 Base::SendRtpToRtp();
3762}
3763
deadbeef953c2ce2017-01-09 14:53:41 -08003764TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003765 Base::SendRtcpToRtcp();
3766}
3767
deadbeef953c2ce2017-01-09 14:53:41 -08003768TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003769 Base::SendRtcpMuxToRtcp();
3770}
3771
deadbeef953c2ce2017-01-09 14:53:41 -08003772TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003773 Base::SendRtcpMuxToRtcpMux();
3774}
3775
deadbeef953c2ce2017-01-09 14:53:41 -08003776TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003777 Base::SendEarlyRtcpMuxToRtcp();
3778}
3779
deadbeef953c2ce2017-01-09 14:53:41 -08003780TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003781 Base::SendEarlyRtcpMuxToRtcpMux();
3782}
3783
deadbeef953c2ce2017-01-09 14:53:41 -08003784TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003785 Base::SendSrtpToSrtp();
3786}
3787
deadbeef953c2ce2017-01-09 14:53:41 -08003788TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003789 Base::SendSrtpToSrtp();
3790}
3791
deadbeef953c2ce2017-01-09 14:53:41 -08003792TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003793 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3794}
3795
deadbeef953c2ce2017-01-09 14:53:41 -08003796TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003797 Base::SendRtpToRtpOnThread();
3798}
3799
deadbeef953c2ce2017-01-09 14:53:41 -08003800TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003801 Base::SendSrtpToSrtpOnThread();
3802}
3803
deadbeef953c2ce2017-01-09 14:53:41 -08003804TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003805 Base::SendWithWritabilityLoss();
3806}
3807
deadbeef953c2ce2017-01-09 14:53:41 -08003808TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003809 Base::TestMediaMonitor();
3810}
3811
Steve Anton8a63f782017-10-23 13:08:53 -07003812TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3813 Base::SocketOptionsMergedOnSetTransport();
3814}
3815
deadbeef953c2ce2017-01-09 14:53:41 -08003816TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003817 CreateChannels(0, 0);
3818 EXPECT_TRUE(SendInitiate());
3819 EXPECT_TRUE(SendAccept());
3820
3821 cricket::SendDataParams params;
3822 params.ssrc = 42;
3823 unsigned char data[] = {
3824 'f', 'o', 'o'
3825 };
jbaucheec21bd2016-03-20 06:15:43 -07003826 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003827 cricket::SendDataResult result;
3828 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3829 EXPECT_EQ(params.ssrc,
3830 media_channel1_->last_sent_data_params().ssrc);
3831 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3832}
3833
deadbeefbad5dad2017-01-17 18:32:35 -08003834#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3835
3836// Verifies some DCHECKs are in place.
3837// Uses VoiceChannel, but any BaseChannel subclass would work.
3838class BaseChannelDeathTest : public testing::Test {
3839 public:
3840 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003841 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3842 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3843 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003844 voice_channel_(rtc::Thread::Current(),
3845 rtc::Thread::Current(),
3846 rtc::Thread::Current(),
3847 &fake_media_engine_,
3848 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3849 nullptr,
3850 cricket::AudioOptions()),
3851 cricket::CN_AUDIO,
3852 false,
3853 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003854
3855 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003856 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003857 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3858 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003859 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003860};
3861
deadbeeff5346592017-01-24 21:51:21 -08003862TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003863 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3864 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003865 cricket::FakeDtlsTransport new_rtcp_transport(
3866 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3867 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003868}
3869
deadbeeff5346592017-01-24 21:51:21 -08003870TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003871 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3872 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003873 cricket::FakeDtlsTransport new_rtp_transport(
3874 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3875 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003876}
3877
deadbeeff5346592017-01-24 21:51:21 -08003878TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003879 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3880 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003881 // Activate RTCP muxing, simulating offer/answer negotiation.
3882 cricket::AudioContentDescription content;
3883 content.set_rtcp_mux(true);
3884 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3885 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003886 cricket::FakeDtlsTransport new_rtp_transport(
3887 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3888 cricket::FakeDtlsTransport new_rtcp_transport(
3889 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003890 // After muxing is enabled, no RTCP transport should be passed in here.
3891 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003892 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3893 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003894}
3895
3896// This test will probably go away if/when we move the transport name out of
3897// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003898TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003899 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3900 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003901 cricket::FakeDtlsTransport new_rtp_transport(
3902 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3903 cricket::FakeDtlsTransport new_rtcp_transport(
3904 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003905 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003906 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3907 "");
3908}
3909
3910// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003911// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003912TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003913 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3914 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003915 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003916 voice_channel_.SetTransports(
3917 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3918 static_cast<rtc::PacketTransportInternal*>(
3919 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003920 "");
3921}
3922
deadbeef5bd5ca32017-02-10 11:31:50 -08003923// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003924// DtlsTransportInternal.
3925TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003926 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3927 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003928 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3929 &fake_rtp_dtls_transport_),
3930 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003931}
3932
3933#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3934
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003935// TODO(pthatcher): TestSetReceiver?