blob: 52cb419495af65a81a9cbcffe6846de25934a031 [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;
zhihuangb2cdd932017-01-19 16:54:25 -080032using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034using cricket::StreamParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Danil Chapovalov33b01f22016-05-11 19:55:27 +020036namespace {
37const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
38const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070040const cricket::VideoCodec kH264Codec(97, "H264");
41const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020042const cricket::DataCodec kGoogleDataCodec(101, "google-data");
43const uint32_t kSsrc1 = 0x1111;
44const uint32_t kSsrc2 = 0x2222;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020045const int kAudioPts[] = {0, 8};
46const int kVideoPts[] = {97, 99};
47enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080048const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
deadbeefcbecd352015-09-23 11:50:27 -070051template <class ChannelT,
52 class MediaChannelT,
53 class ContentT,
54 class CodecT,
55 class MediaInfoT,
56 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057class Traits {
58 public:
59 typedef ChannelT Channel;
60 typedef MediaChannelT MediaChannel;
61 typedef ContentT Content;
62 typedef CodecT Codec;
63 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020064 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065};
66
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067class VoiceTraits : public Traits<cricket::VoiceChannel,
68 cricket::FakeVoiceMediaChannel,
69 cricket::AudioContentDescription,
70 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020071 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070072 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073
74class VideoTraits : public Traits<cricket::VideoChannel,
75 cricket::FakeVideoMediaChannel,
76 cricket::VideoContentDescription,
77 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020078 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070079 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080
deadbeef953c2ce2017-01-09 14:53:41 -080081class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 cricket::FakeDataMediaChannel,
83 cricket::DataContentDescription,
84 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020085 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070086 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087
deadbeef953c2ce2017-01-09 14:53:41 -080088// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089template<class T>
90class ChannelTest : public testing::Test, public sigslot::has_slots<> {
91 public:
deadbeefac22f702017-01-12 21:59:29 -080092 enum Flags {
93 RTCP_MUX = 0x1,
94 RTCP_MUX_REQUIRED = 0x2,
95 SECURE = 0x4,
96 SSRC_MUX = 0x8,
97 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080098 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080099 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700100 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700101 GCM_CIPHER = 0x40,
102 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800103 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
Peter Boström34fbfff2015-09-24 19:20:30 +0200105 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200106 rtc::ArrayView<const uint8_t> rtp_data,
107 rtc::ArrayView<const uint8_t> rtcp_data,
108 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200109 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200110 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800111 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200112 if (network_is_worker == NetworkIsWorker::Yes) {
113 network_thread_ = rtc::Thread::Current();
114 } else {
115 network_thread_keeper_ = rtc::Thread::Create();
116 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 network_thread_ = network_thread_keeper_.get();
118 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800122 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
123 nullptr, typename T::Options()),
124 rtc::MakeUnique<typename T::MediaChannel>(
125 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200126 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
Steve Anton8699a322017-11-06 15:53:33 -0800128 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
129 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 int flags1,
131 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800132 // Network thread is started in CreateChannels, to allow the test to
133 // configure a fake clock before any threads are spawned and attempt to
134 // access the time.
135 if (network_thread_keeper_) {
136 network_thread_keeper_->Start();
137 }
deadbeefac22f702017-01-12 21:59:29 -0800138 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800139 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
140 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
141 // Make sure if using raw packet transports, they're used for both
142 // channels.
143 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200144 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800145 media_channel1_ = ch1.get();
146 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800147 rtc::PacketTransportInternal* rtp1 = nullptr;
148 rtc::PacketTransportInternal* rtcp1 = nullptr;
149 rtc::PacketTransportInternal* rtp2 = nullptr;
150 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800151 // Based on flags, create fake DTLS or raw packet transports.
152 if (flags1 & RAW_PACKET_TRANSPORT) {
153 fake_rtp_packet_transport1_.reset(
154 new rtc::FakePacketTransport("channel1_rtp"));
155 rtp1 = fake_rtp_packet_transport1_.get();
156 if (!(flags1 & RTCP_MUX_REQUIRED)) {
157 fake_rtcp_packet_transport1_.reset(
158 new rtc::FakePacketTransport("channel1_rtcp"));
159 rtcp1 = fake_rtcp_packet_transport1_.get();
160 }
161 } else {
162 // Confirmed to work with KT_RSA and KT_ECDSA.
163 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
164 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
165 rtp1 = fake_rtp_dtls_transport1_.get();
166 if (!(flags1 & RTCP_MUX_REQUIRED)) {
167 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
168 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
169 rtcp1 = fake_rtcp_dtls_transport1_.get();
170 }
171 if (flags1 & DTLS) {
172 auto cert1 =
173 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
174 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
175 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
176 if (fake_rtcp_dtls_transport1_) {
177 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
178 }
179 }
jbauch5869f502017-06-29 12:31:36 -0700180 if (flags1 & ENCRYPTED_HEADERS) {
181 rtc::CryptoOptions crypto_options;
182 crypto_options.enable_encrypted_rtp_header_extensions = true;
183 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 }
187 }
188 if (flags1 & GCM_CIPHER) {
189 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
190 rtc::SRTP_AEAD_AES_256_GCM);
191 if (fake_rtcp_dtls_transport1_) {
192 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
193 rtc::SRTP_AEAD_AES_256_GCM);
194 }
195 }
deadbeeff5346592017-01-24 21:51:21 -0800196 }
197 // Based on flags, create fake DTLS or raw packet transports.
198 if (flags2 & RAW_PACKET_TRANSPORT) {
199 fake_rtp_packet_transport2_.reset(
200 new rtc::FakePacketTransport("channel2_rtp"));
201 rtp2 = fake_rtp_packet_transport2_.get();
202 if (!(flags2 & RTCP_MUX_REQUIRED)) {
203 fake_rtcp_packet_transport2_.reset(
204 new rtc::FakePacketTransport("channel2_rtcp"));
205 rtcp2 = fake_rtcp_packet_transport2_.get();
206 }
207 } else {
208 // Confirmed to work with KT_RSA and KT_ECDSA.
209 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
210 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
211 rtp2 = fake_rtp_dtls_transport2_.get();
212 if (!(flags2 & RTCP_MUX_REQUIRED)) {
213 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
214 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
215 rtcp2 = fake_rtcp_dtls_transport2_.get();
216 }
217 if (flags2 & DTLS) {
218 auto cert2 =
219 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
220 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
221 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
222 if (fake_rtcp_dtls_transport2_) {
223 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
224 }
225 }
jbauch5869f502017-06-29 12:31:36 -0700226 if (flags2 & ENCRYPTED_HEADERS) {
227 rtc::CryptoOptions crypto_options;
228 crypto_options.enable_encrypted_rtp_header_extensions = true;
229 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
230 if (fake_rtcp_dtls_transport2_) {
231 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 }
233 }
234 if (flags2 & GCM_CIPHER) {
235 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
236 rtc::SRTP_AEAD_AES_256_GCM);
237 if (fake_rtcp_dtls_transport2_) {
238 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
239 rtc::SRTP_AEAD_AES_256_GCM);
240 }
241 }
deadbeeff5346592017-01-24 21:51:21 -0800242 }
Steve Anton8699a322017-11-06 15:53:33 -0800243 channel1_ =
244 CreateChannel(worker_thread, network_thread_, &media_engine_,
245 std::move(ch1), fake_rtp_dtls_transport1_.get(),
246 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
247 channel2_ =
248 CreateChannel(worker_thread, network_thread_, &media_engine_,
249 std::move(ch2), fake_rtp_dtls_transport2_.get(),
250 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 channel1_->SignalMediaMonitor.connect(this,
252 &ChannelTest<T>::OnMediaMonitor1);
253 channel2_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800255 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800256 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000259 if ((flags1 & DTLS) && (flags2 & DTLS)) {
260 flags1 = (flags1 & ~SECURE);
261 flags2 = (flags2 & ~SECURE);
262 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 CreateContent(flags1, kPcmuCodec, kH264Codec,
264 &local_media_content1_);
265 CreateContent(flags2, kPcmuCodec, kH264Codec,
266 &local_media_content2_);
267 CopyContent(local_media_content1_, &remote_media_content1_);
268 CopyContent(local_media_content2_, &remote_media_content2_);
269
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000270 // Add stream information (SSRC) to the local content but not to the remote
271 // content. This means that we per default know the SSRC of what we send but
272 // not what we receive.
273 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
274 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
275
276 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
277 if (flags1 & SSRC_MUX) {
278 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
279 }
280 if (flags2 & SSRC_MUX) {
281 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
282 }
283 }
Steve Anton8699a322017-11-06 15:53:33 -0800284 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200285 rtc::Thread* worker_thread,
286 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700287 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800288 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800289 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
290 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800291 rtc::PacketTransportInternal* fake_rtp_packet_transport,
292 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700293 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800294 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800295 auto channel = rtc::MakeUnique<typename T::Channel>(
296 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800297 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
298 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800299 if (!channel->NeedsRtcpTransport()) {
300 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800301 }
Steve Anton8699a322017-11-06 15:53:33 -0800302 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
303 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000304 return channel;
305 }
306
deadbeeff5346592017-01-24 21:51:21 -0800307 void ConnectFakeTransports() {
308 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
309 bool asymmetric = false;
310 // Depending on test flags, could be using DTLS or raw packet transport.
311 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
312 fake_rtp_dtls_transport1_->SetDestination(
313 fake_rtp_dtls_transport2_.get(), asymmetric);
314 }
315 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
316 fake_rtcp_dtls_transport1_->SetDestination(
317 fake_rtcp_dtls_transport2_.get(), asymmetric);
318 }
319 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
320 fake_rtp_packet_transport1_->SetDestination(
321 fake_rtp_packet_transport2_.get(), asymmetric);
322 }
323 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
324 fake_rtcp_packet_transport1_->SetDestination(
325 fake_rtcp_packet_transport2_.get(), asymmetric);
326 }
327 });
328 }
329
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000331 bool result = channel1_->SetLocalContent(&local_media_content1_,
332 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 if (result) {
334 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 result = channel2_->SetRemoteContent(&remote_media_content1_,
336 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800338 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 result = channel2_->SetLocalContent(&local_media_content2_,
340 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 }
342 }
343 return result;
344 }
345
346 bool SendAccept() {
347 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000348 return channel1_->SetRemoteContent(&remote_media_content2_,
349 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 }
351
352 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 bool result = channel1_->SetLocalContent(&local_media_content1_,
354 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 if (result) {
356 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000357 result = channel2_->SetRemoteContent(&remote_media_content1_,
358 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 }
360 return result;
361 }
362
363 bool SendProvisionalAnswer() {
364 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000365 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 if (result) {
367 channel2_->Enable(true);
368 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000369 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800370 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 }
372 return result;
373 }
374
375 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000376 bool result = channel2_->SetLocalContent(&local_media_content2_,
377 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000379 result = channel1_->SetRemoteContent(&remote_media_content2_,
380 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 return result;
382 }
383
deadbeeff5346592017-01-24 21:51:21 -0800384 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 channel1_.reset();
386 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800387 fake_rtp_dtls_transport1_.reset();
388 fake_rtcp_dtls_transport1_.reset();
389 fake_rtp_dtls_transport2_.reset();
390 fake_rtcp_dtls_transport2_.reset();
391 fake_rtp_packet_transport1_.reset();
392 fake_rtcp_packet_transport1_.reset();
393 fake_rtp_packet_transport2_.reset();
394 fake_rtcp_packet_transport2_.reset();
395 if (network_thread_keeper_) {
396 network_thread_keeper_.reset();
397 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 return true;
399 }
400
401 bool AddStream1(int id) {
402 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
403 }
404 bool RemoveStream1(int id) {
405 return channel1_->RemoveRecvStream(id);
406 }
407
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp1() {
409 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
410 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtp2() {
413 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
414 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendRtcp1() {
417 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendRtcp2() {
420 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
422 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
428 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
429 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtcp1(uint32_t ssrc) {
432 rtc::Buffer data = CreateRtcpData(ssrc);
433 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendCustomRtcp2(uint32_t ssrc) {
436 rtc::Buffer data = CreateRtcpData(ssrc);
437 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 }
443 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
446 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200447 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
449 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 }
452 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200453 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
455 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
459 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtcpData(ssrc);
463 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200465 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Buffer data = CreateRtcpData(ssrc);
467 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
470 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200472 rtc::SetBE32(data.data() + 8, ssrc);
473 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000474 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 return data;
478 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
480 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 return data;
484 }
485
486 bool CheckNoRtp1() {
487 return media_channel1_->CheckNoRtp();
488 }
489 bool CheckNoRtp2() {
490 return media_channel2_->CheckNoRtp();
491 }
492 bool CheckNoRtcp1() {
493 return media_channel1_->CheckNoRtcp();
494 }
495 bool CheckNoRtcp2() {
496 return media_channel2_->CheckNoRtcp();
497 }
498
499 void CreateContent(int flags,
500 const cricket::AudioCodec& audio_codec,
501 const cricket::VideoCodec& video_codec,
502 typename T::Content* content) {
503 // overridden in specialized classes
504 }
505 void CopyContent(const typename T::Content& source,
506 typename T::Content* content) {
507 // overridden in specialized classes
508 }
509
Steve Anton18ee1d52017-09-11 11:32:35 -0700510 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700512 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
513 typename T::Content* content = new typename T::Content();
514 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
515 AddLegacyStreamInContent(ssrc, 0, content);
516 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517 }
518
ossu292d6582016-03-17 02:31:13 -0700519 // Will manage the lifetime of a CallThread, making sure it's
520 // destroyed before this object goes out of scope.
521 class ScopedCallThread {
522 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200523 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700524 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 : thread_(rtc::Thread::Create()),
526 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700527 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700528 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700529 }
530
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700534
535 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200536 std::unique_ptr<rtc::Thread> thread_;
537 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700538 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
541 return false; // overridden in specialized classes
542 }
543
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200544 void OnMediaMonitor1(typename T::Channel* channel,
545 const typename T::MediaInfo& info) {
546 RTC_DCHECK_EQ(channel, channel1_.get());
547 media_info_callbacks1_++;
548 }
549 void OnMediaMonitor2(typename T::Channel* channel,
550 const typename T::MediaInfo& info) {
551 RTC_DCHECK_EQ(channel, channel2_.get());
552 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 }
deadbeeff5346592017-01-24 21:51:21 -0800554 void OnRtcpMuxFullyActive1(const std::string&) {
555 rtcp_mux_activated_callbacks1_++;
556 }
557 void OnRtcpMuxFullyActive2(const std::string&) {
558 rtcp_mux_activated_callbacks2_++;
559 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560
Honghai Zhangcc411c02016-03-29 17:27:21 -0700561 cricket::CandidatePairInterface* last_selected_candidate_pair() {
562 return last_selected_candidate_pair_;
563 }
564
Peter Boström0c4e06b2015-10-07 12:23:21 +0200565 void AddLegacyStreamInContent(uint32_t ssrc,
566 int flags,
567 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Base implementation.
569 }
570
571 // Tests that can be used by derived classes.
572
573 // Basic sanity check.
574 void TestInit() {
575 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700576 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200578 if (verify_playout_) {
579 EXPECT_FALSE(media_channel1_->playout());
580 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_TRUE(media_channel1_->codecs().empty());
582 EXPECT_TRUE(media_channel1_->recv_streams().empty());
583 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
584 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly configure
588 // the codecs.
589 void TestSetContents() {
590 CreateChannels(0, 0);
591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000593 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000595 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 ASSERT_EQ(1U, media_channel1_->codecs().size());
597 EXPECT_TRUE(CodecMatches(content.codecs()[0],
598 media_channel1_->codecs()[0]));
599 }
600
601 // Test that SetLocalContent and SetRemoteContent properly deals
602 // with an empty offer.
603 void TestSetContentsNullOffer() {
604 CreateChannels(0, 0);
605 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000606 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000609 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 ASSERT_EQ(1U, media_channel1_->codecs().size());
611 EXPECT_TRUE(CodecMatches(content.codecs()[0],
612 media_channel1_->codecs()[0]));
613 }
614
615 // Test that SetLocalContent and SetRemoteContent properly set RTCP
616 // mux.
617 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800618 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 typename T::Content content;
620 CreateContent(0, kPcmuCodec, kH264Codec, &content);
621 // Both sides agree on mux. Should no longer be a separate RTCP channel.
622 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000623 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
624 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000626 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 }
630
631 // Test that SetLocalContent and SetRemoteContent properly set RTCP
632 // mux when a provisional answer is received.
633 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800634 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 typename T::Content content;
636 CreateContent(0, kPcmuCodec, kH264Codec, &content);
637 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000638 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
639 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800640 // Both sides agree on mux. Should signal RTCP mux as fully activated.
641 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000642 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800643 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000645 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000647 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
648 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800649 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 }
651
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 // Test that Add/RemoveStream properly forward to the media channel.
653 void TestStreams() {
654 CreateChannels(0, 0);
655 EXPECT_TRUE(AddStream1(1));
656 EXPECT_TRUE(AddStream1(2));
657 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
658 EXPECT_TRUE(RemoveStream1(2));
659 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
660 EXPECT_TRUE(RemoveStream1(1));
661 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
662 }
663
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 // Test that SetLocalContent and SetRemoteContent properly
665 // handles adding and removing StreamParams when the action is a full
666 // CA_OFFER / CA_ANSWER.
667 void TestChangeStreamParamsInContent() {
668 cricket::StreamParams stream1;
669 stream1.groupid = "group1";
670 stream1.id = "stream1";
671 stream1.ssrcs.push_back(kSsrc1);
672 stream1.cname = "stream1_cname";
673
674 cricket::StreamParams stream2;
675 stream2.groupid = "group1";
676 stream2.id = "stream2";
677 stream2.ssrcs.push_back(kSsrc2);
678 stream2.cname = "stream2_cname";
679
680 // Setup a call where channel 1 send |stream1| to channel 2.
681 CreateChannels(0, 0);
682 typename T::Content content1;
683 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
684 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000685 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_TRUE(channel1_->Enable(true));
687 EXPECT_EQ(1u, media_channel1_->send_streams().size());
688
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000689 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800691 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692
693 // Channel 2 do not send anything.
694 typename T::Content content2;
695 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_TRUE(channel2_->Enable(true));
700 EXPECT_EQ(0u, media_channel2_->send_streams().size());
701
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200702 SendCustomRtp1(kSsrc1, 0);
703 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
705
706 // Let channel 2 update the content by sending |stream2| and enable SRTP.
707 typename T::Content content3;
708 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
709 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 ASSERT_EQ(1u, media_channel2_->send_streams().size());
712 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
713
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000714 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
716 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
717
718 // Channel 1 replies but stop sending stream1.
719 typename T::Content content4;
720 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000721 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_EQ(0u, media_channel1_->send_streams().size());
723
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000724 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
726
Zhi Huangcf990f52017-09-22 12:12:30 -0700727 EXPECT_TRUE(channel1_->srtp_active());
728 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200729 SendCustomRtp2(kSsrc2, 0);
730 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
732 }
733
jbauch5869f502017-06-29 12:31:36 -0700734 enum EncryptedHeaderTestScenario {
735 // Offer/Answer are processed before DTLS completes.
736 DEFAULT,
737 // DTLS completes before any Offer/Answer have been sent.
738 DTLS_BEFORE_OFFER_ANSWER,
739 // DTLS completes after channel 2 has processed (remote) Offer and (local)
740 // Answer.
741 DTLS_AFTER_CHANNEL2_READY,
742 };
743
744 // Test that encrypted header extensions are working and can be changed when
745 // sending a new OFFER/ANSWER.
746 void TestChangeEncryptedHeaderExtensions(int flags,
747 EncryptedHeaderTestScenario scenario = DEFAULT) {
748 RTC_CHECK(scenario == 0 || (flags & DTLS));
749 struct PacketListener : public sigslot::has_slots<> {
750 PacketListener() {}
751 void OnReadPacket(rtc::PacketTransportInternal* transport,
752 const char* data, size_t size, const rtc::PacketTime& time,
753 int flags) {
754 CompareHeaderExtensions(
755 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
756 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
757 false);
758 }
759 std::vector<int> encrypted_headers;
760 } packet_listener1, packet_listener2;
761
762 cricket::StreamParams stream1;
763 stream1.groupid = "group1";
764 stream1.id = "stream1";
765 stream1.ssrcs.push_back(kSsrc1);
766 stream1.cname = "stream1_cname";
767
768 cricket::StreamParams stream2;
769 stream2.groupid = "group1";
770 stream2.id = "stream2";
771 stream2.ssrcs.push_back(kSsrc2);
772 stream2.cname = "stream2_cname";
773
774 // Use SRTP when testing encrypted extensions.
775 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
776 // Enable SDES if channel is not using DTLS.
777 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
778
779 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
780 // Make sure to use URIs that are supported for encryption.
781 cricket::RtpHeaderExtensions extensions1;
782 extensions1.push_back(
783 RtpExtension(RtpExtension::kAudioLevelUri, 10));
784 extensions1.push_back(
785 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
786
787 cricket::RtpHeaderExtensions extensions2;
788 extensions2.push_back(
789 RtpExtension(RtpExtension::kAudioLevelUri, 10));
790 extensions2.push_back(
791 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
792 extensions2.push_back(
793 RtpExtension(RtpExtension::kVideoRotationUri, 3));
794 extensions2.push_back(
795 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
796
797 // Setup a call where channel 1 send |stream1| to channel 2.
798 CreateChannels(channel_flags, channel_flags);
799 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
800 &packet_listener1, &PacketListener::OnReadPacket);
801 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
802 &packet_listener2, &PacketListener::OnReadPacket);
803
804 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
805 ConnectFakeTransports();
806 WaitForThreads();
807 }
808
809 typename T::Content content1;
810 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
811 content1.AddStream(stream1);
812 content1.set_rtp_header_extensions(extensions1);
813 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
814 EXPECT_TRUE(channel1_->Enable(true));
815 EXPECT_EQ(1u, media_channel1_->send_streams().size());
816 packet_listener1.encrypted_headers.push_back(1);
817
818 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
819 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
820
821 // Channel 2 sends back |stream2|.
822 typename T::Content content2;
823 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
824 content2.AddStream(stream2);
825 content2.set_rtp_header_extensions(extensions1);
826 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
827 EXPECT_TRUE(channel2_->Enable(true));
828 EXPECT_EQ(1u, media_channel2_->send_streams().size());
829 packet_listener2.encrypted_headers.push_back(1);
830
831 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
832 ConnectFakeTransports();
833 WaitForThreads();
834 }
835
836 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
837 scenario == DTLS_AFTER_CHANNEL2_READY) {
838 // In both scenarios with partially completed Offer/Answer, sending
839 // packets from Channel 2 to Channel 1 should work.
840 SendCustomRtp2(kSsrc2, 0);
841 WaitForThreads();
842 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
843 }
844
845 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
846 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
847
848 if (scenario == DEFAULT) {
849 ConnectFakeTransports();
850 WaitForThreads();
851 }
852
853 SendCustomRtp1(kSsrc1, 0);
854 SendCustomRtp2(kSsrc2, 0);
855 WaitForThreads();
856 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
857 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
858
859 // Let channel 2 update the encrypted header extensions.
860 typename T::Content content3;
861 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
862 content3.AddStream(stream2);
863 content3.set_rtp_header_extensions(extensions2);
864 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
865 ASSERT_EQ(1u, media_channel2_->send_streams().size());
866 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
867 packet_listener2.encrypted_headers.clear();
868 packet_listener2.encrypted_headers.push_back(2);
869 packet_listener2.encrypted_headers.push_back(4);
870
871 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
872 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
873 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
874
875 // Channel 1 is already sending the new encrypted extensions. These
876 // can be decrypted by channel 2. Channel 2 is still sending the old
877 // encrypted extensions (which can be decrypted by channel 1).
878
879 if (flags & DTLS) {
880 // DTLS supports updating the encrypted extensions with only the OFFER
881 // being processed. For SDES both the OFFER and ANSWER must have been
882 // processed to update encrypted extensions, so we can't check this case.
883 SendCustomRtp1(kSsrc1, 0);
884 SendCustomRtp2(kSsrc2, 0);
885 WaitForThreads();
886 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
887 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
888 }
889
890 // Channel 1 replies with the same extensions.
891 typename T::Content content4;
892 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
893 content4.AddStream(stream1);
894 content4.set_rtp_header_extensions(extensions2);
895 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
896 EXPECT_EQ(1u, media_channel1_->send_streams().size());
897 packet_listener1.encrypted_headers.clear();
898 packet_listener1.encrypted_headers.push_back(2);
899 packet_listener1.encrypted_headers.push_back(4);
900
901 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
902 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
903
904 SendCustomRtp1(kSsrc1, 0);
905 SendCustomRtp2(kSsrc2, 0);
906 WaitForThreads();
907 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
908 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
909 }
910
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 // Test that we only start playout and sending at the right times.
912 void TestPlayoutAndSendingStates() {
913 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200914 if (verify_playout_) {
915 EXPECT_FALSE(media_channel1_->playout());
916 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200918 if (verify_playout_) {
919 EXPECT_FALSE(media_channel2_->playout());
920 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 EXPECT_FALSE(media_channel2_->sending());
922 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200923 if (verify_playout_) {
924 EXPECT_FALSE(media_channel1_->playout());
925 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000927 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
928 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200929 if (verify_playout_) {
930 EXPECT_TRUE(media_channel1_->playout());
931 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000933 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
934 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200935 if (verify_playout_) {
936 EXPECT_FALSE(media_channel2_->playout());
937 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000939 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
940 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200941 if (verify_playout_) {
942 EXPECT_FALSE(media_channel2_->playout());
943 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800945 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200946 if (verify_playout_) {
947 EXPECT_TRUE(media_channel1_->playout());
948 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200950 if (verify_playout_) {
951 EXPECT_FALSE(media_channel2_->playout());
952 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 EXPECT_FALSE(media_channel2_->sending());
954 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200955 if (verify_playout_) {
956 EXPECT_TRUE(media_channel2_->playout());
957 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000959 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
960 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200961 if (verify_playout_) {
962 EXPECT_TRUE(media_channel1_->playout());
963 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964 EXPECT_TRUE(media_channel1_->sending());
965 }
966
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000967 // Test that changing the MediaContentDirection in the local and remote
968 // session description start playout and sending at the right time.
969 void TestMediaContentDirection() {
970 CreateChannels(0, 0);
971 typename T::Content content1;
972 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
973 typename T::Content content2;
974 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
975 // Set |content2| to be InActive.
976 content2.set_direction(cricket::MD_INACTIVE);
977
978 EXPECT_TRUE(channel1_->Enable(true));
979 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200980 if (verify_playout_) {
981 EXPECT_FALSE(media_channel1_->playout());
982 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200984 if (verify_playout_) {
985 EXPECT_FALSE(media_channel2_->playout());
986 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987 EXPECT_FALSE(media_channel2_->sending());
988
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000989 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
990 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
991 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
992 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800993 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994
Peter Boström34fbfff2015-09-24 19:20:30 +0200995 if (verify_playout_) {
996 EXPECT_TRUE(media_channel1_->playout());
997 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200999 if (verify_playout_) {
1000 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1001 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1003
1004 // Update |content2| to be RecvOnly.
1005 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001006 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1007 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008
Peter Boström34fbfff2015-09-24 19:20:30 +02001009 if (verify_playout_) {
1010 EXPECT_TRUE(media_channel1_->playout());
1011 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001012 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001013 if (verify_playout_) {
1014 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1015 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1017
1018 // Update |content2| to be SendRecv.
1019 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001020 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1021 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022
Peter Boström34fbfff2015-09-24 19:20:30 +02001023 if (verify_playout_) {
1024 EXPECT_TRUE(media_channel1_->playout());
1025 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001027 if (verify_playout_) {
1028 EXPECT_TRUE(media_channel2_->playout());
1029 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_TRUE(media_channel2_->sending());
1031 }
1032
Honghai Zhangcc411c02016-03-29 17:27:21 -07001033 // Tests that when the transport channel signals a candidate pair change
1034 // event, the media channel will receive a call on the network route change.
1035 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001036 static constexpr uint16_t kLocalNetId = 1;
1037 static constexpr uint16_t kRemoteNetId = 2;
1038 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001039 // Ipv4(20) + UDP(8).
1040 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001041
Honghai Zhangcc411c02016-03-29 17:27:21 -07001042 CreateChannels(0, 0);
1043
Honghai Zhangcc411c02016-03-29 17:27:21 -07001044 typename T::MediaChannel* media_channel1 =
1045 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001046 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001047
Zhi Huang942bc2e2017-11-13 13:26:07 -08001048 // Need to wait for the threads before calling
1049 // |set_num_network_route_changes| because the network route would be set
1050 // when creating the channel.
1051 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001052 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001053 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001054 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001055 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001056 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1057
1058 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001059 });
1060 WaitForThreads();
1061 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001062 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001063 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001064
eladalon05b07bb2017-08-24 07:40:16 -07001065 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001066 rtc::NetworkRoute network_route;
1067 network_route.connected = true;
1068 network_route.local_network_id = kLocalNetId;
1069 network_route.remote_network_id = kRemoteNetId;
1070 network_route.last_sent_packet_id = kLastPacketId;
1071 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001072 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001073 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1074
1075 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001076 });
1077 WaitForThreads();
1078 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001079 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001080 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001081 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001083 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001084 EXPECT_EQ(kTransportOverheadPerPacket,
1085 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001086 }
1087
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 // Test setting up a call.
1089 void TestCallSetup() {
1090 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001091 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001093 if (verify_playout_) {
1094 EXPECT_TRUE(media_channel1_->playout());
1095 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_FALSE(media_channel1_->sending());
1097 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001098 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_TRUE(media_channel1_->sending());
1100 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001101 if (verify_playout_) {
1102 EXPECT_TRUE(media_channel2_->playout());
1103 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_TRUE(media_channel2_->sending());
1105 EXPECT_EQ(1U, media_channel2_->codecs().size());
1106 }
1107
1108 // Test that we don't crash if packets are sent during call teardown
1109 // when RTCP mux is enabled. This is a regression test against a specific
1110 // race condition that would only occur when a RTCP packet was sent during
1111 // teardown of a channel on which RTCP mux was enabled.
1112 void TestCallTeardownRtcpMux() {
1113 class LastWordMediaChannel : public T::MediaChannel {
1114 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001115 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001117 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1118 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1120 }
1121 };
Steve Anton8699a322017-11-06 15:53:33 -08001122 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1123 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(SendInitiate());
1125 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001126 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 }
1128
1129 // Send voice RTP data to the other side and ensure it gets there.
1130 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001131 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 EXPECT_TRUE(SendInitiate());
1133 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001134 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1135 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001136 SendRtp1();
1137 SendRtp2();
1138 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(CheckRtp1());
1140 EXPECT_TRUE(CheckRtp2());
1141 EXPECT_TRUE(CheckNoRtp1());
1142 EXPECT_TRUE(CheckNoRtp2());
1143 }
1144
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001145 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001146 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001147 EXPECT_TRUE(SendInitiate());
1148 EXPECT_TRUE(SendAccept());
1149 SendRtp1();
1150 SendRtp2();
1151 SendRtcp1();
1152 SendRtcp2();
1153 // Do not wait, destroy channels.
1154 channel1_.reset(nullptr);
1155 channel2_.reset(nullptr);
1156 }
1157
deadbeefac22f702017-01-12 21:59:29 -08001158 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001160 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_TRUE(SendInitiate());
1162 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001163 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1164 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001165 SendRtcp1();
1166 SendRtcp2();
1167 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_TRUE(CheckRtcp1());
1169 EXPECT_TRUE(CheckRtcp2());
1170 EXPECT_TRUE(CheckNoRtcp1());
1171 EXPECT_TRUE(CheckNoRtcp2());
1172 }
1173
1174 // Check that RTCP is transmitted if only the initiator supports mux.
1175 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001176 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 EXPECT_TRUE(SendInitiate());
1178 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001179 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1180 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001181 SendRtcp1();
1182 SendRtcp2();
1183 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(CheckRtcp1());
1185 EXPECT_TRUE(CheckRtcp2());
1186 EXPECT_TRUE(CheckNoRtcp1());
1187 EXPECT_TRUE(CheckNoRtcp2());
1188 }
1189
1190 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1191 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001192 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001194 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1195 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1196 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001198 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1199 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001200 SendRtp1();
1201 SendRtp2();
1202 SendRtcp1();
1203 SendRtcp2();
1204 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 EXPECT_TRUE(CheckRtp1());
1206 EXPECT_TRUE(CheckRtp2());
1207 EXPECT_TRUE(CheckNoRtp1());
1208 EXPECT_TRUE(CheckNoRtp2());
1209 EXPECT_TRUE(CheckRtcp1());
1210 EXPECT_TRUE(CheckRtcp2());
1211 EXPECT_TRUE(CheckNoRtcp1());
1212 EXPECT_TRUE(CheckNoRtcp2());
1213 }
1214
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001215 // Check that RTP and RTCP are transmitted ok when both sides
1216 // support mux and one the offerer requires mux.
1217 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001218 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001219 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001220 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1221 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001222 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001223 SendRtp1();
1224 SendRtp2();
1225 SendRtcp1();
1226 SendRtcp2();
1227 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001228 EXPECT_TRUE(CheckRtp1());
1229 EXPECT_TRUE(CheckRtp2());
1230 EXPECT_TRUE(CheckNoRtp1());
1231 EXPECT_TRUE(CheckNoRtp2());
1232 EXPECT_TRUE(CheckRtcp1());
1233 EXPECT_TRUE(CheckRtcp2());
1234 EXPECT_TRUE(CheckNoRtcp1());
1235 EXPECT_TRUE(CheckNoRtcp2());
1236 }
1237
1238 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001239 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001240 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001241 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001242 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001243 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1244 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1245 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001246 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001247 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1248 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001249 SendRtp1();
1250 SendRtp2();
1251 SendRtcp1();
1252 SendRtcp2();
1253 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001254 EXPECT_TRUE(CheckRtp1());
1255 EXPECT_TRUE(CheckRtp2());
1256 EXPECT_TRUE(CheckNoRtp1());
1257 EXPECT_TRUE(CheckNoRtp2());
1258 EXPECT_TRUE(CheckRtcp1());
1259 EXPECT_TRUE(CheckRtcp2());
1260 EXPECT_TRUE(CheckNoRtcp1());
1261 EXPECT_TRUE(CheckNoRtcp2());
1262 }
1263
1264 // Check that RTP and RTCP are transmitted ok when both sides
1265 // require mux.
1266 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001267 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001268 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001269 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1270 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001271 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001272 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001273 SendRtp1();
1274 SendRtp2();
1275 SendRtcp1();
1276 SendRtcp2();
1277 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001278 EXPECT_TRUE(CheckRtp1());
1279 EXPECT_TRUE(CheckRtp2());
1280 EXPECT_TRUE(CheckNoRtp1());
1281 EXPECT_TRUE(CheckNoRtp2());
1282 EXPECT_TRUE(CheckRtcp1());
1283 EXPECT_TRUE(CheckRtcp2());
1284 EXPECT_TRUE(CheckNoRtcp1());
1285 EXPECT_TRUE(CheckNoRtcp2());
1286 }
1287
1288 // Check that SendAccept fails if the answerer doesn't support mux
1289 // and the offerer requires it.
1290 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001291 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001292 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001293 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1294 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001295 EXPECT_FALSE(SendAccept());
1296 }
1297
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298 // Check that RTCP data sent by the initiator before the accept is not muxed.
1299 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001300 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001301 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001302 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1303 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304
1305 // RTCP can be sent before the call is accepted, if the transport is ready.
1306 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001307 SendRtcp1();
1308 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_TRUE(CheckNoRtp2());
1310 EXPECT_TRUE(CheckRtcp2());
1311
1312 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001313 SendRtcp2();
1314 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(CheckNoRtp1());
1316 EXPECT_TRUE(CheckRtcp1());
1317
1318 // Complete call setup and ensure everything is still OK.
1319 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001320 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001321 SendRtcp1();
1322 SendRtcp2();
1323 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325 EXPECT_TRUE(CheckRtcp1());
1326 }
1327
1328
1329 // Check that RTCP data is not muxed until both sides have enabled muxing,
1330 // but that we properly demux before we get the accept message, since there
1331 // is a race between RTP data and the jingle accept.
1332 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001333 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001334 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001335 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1336 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337
1338 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1339 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001340 SendRtcp1();
1341 WaitForThreads();
1342 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343
1344 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001345 SendRtcp2();
1346 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347 EXPECT_TRUE(CheckNoRtp1());
1348 EXPECT_TRUE(CheckRtcp1());
1349
1350 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001351 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001353 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1354 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001355 SendRtcp1();
1356 SendRtcp2();
1357 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001359 EXPECT_TRUE(CheckRtcp1());
1360 }
1361
1362 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001363 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001365 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1366 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367
deadbeefac22f702017-01-12 21:59:29 -08001368 int flags1 = SECURE | flags1_in;
1369 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 bool dtls1 = !!(flags1_in & DTLS);
1371 bool dtls2 = !!(flags2_in & DTLS);
1372 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001373 EXPECT_FALSE(channel1_->srtp_active());
1374 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001375 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001376 WaitForThreads();
1377 EXPECT_TRUE(channel1_->writable());
1378 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001379 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001380 EXPECT_TRUE(channel1_->srtp_active());
1381 EXPECT_TRUE(channel2_->srtp_active());
1382 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1383 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001384 SendRtp1();
1385 SendRtp2();
1386 SendRtcp1();
1387 SendRtcp2();
1388 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001389 EXPECT_TRUE(CheckRtp1());
1390 EXPECT_TRUE(CheckRtp2());
1391 EXPECT_TRUE(CheckNoRtp1());
1392 EXPECT_TRUE(CheckNoRtp2());
1393 EXPECT_TRUE(CheckRtcp1());
1394 EXPECT_TRUE(CheckRtcp2());
1395 EXPECT_TRUE(CheckNoRtcp1());
1396 EXPECT_TRUE(CheckNoRtcp2());
1397 }
1398
1399 // Test that we properly handling SRTP negotiating down to RTP.
1400 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001401 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001402 EXPECT_FALSE(channel1_->srtp_active());
1403 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 EXPECT_TRUE(SendInitiate());
1405 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001406 EXPECT_FALSE(channel1_->srtp_active());
1407 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001408 SendRtp1();
1409 SendRtp2();
1410 SendRtcp1();
1411 SendRtcp2();
1412 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 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 // Test that we can send and receive early media when a provisional answer is
1424 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1425 void SendEarlyMediaUsingRtcpMuxSrtp() {
1426 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1427
deadbeefac22f702017-01-12 21:59:29 -08001428 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1429 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 EXPECT_TRUE(SendOffer());
1431 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001432 EXPECT_TRUE(channel1_->srtp_active());
1433 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001434 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1435 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001436 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1437 SendCustomRtcp1(kSsrc1);
1438 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1439 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1442
1443 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001444 SendCustomRtcp2(kSsrc2);
1445 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1446 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001448 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1449
1450 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001451 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1452 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001453 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001454 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1455 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1456 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1457 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001458 EXPECT_TRUE(channel1_->srtp_active());
1459 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001460 SendCustomRtcp1(kSsrc1);
1461 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1462 SendCustomRtcp2(kSsrc2);
1463 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1464 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1469 }
1470
1471 // Test that we properly send RTP without SRTP from a thread.
1472 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001473 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001474 EXPECT_TRUE(SendInitiate());
1475 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001476 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1477 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1478 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1479 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1480 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1481 send_rtcp1.thread(),
1482 send_rtcp2.thread()};
1483 WaitForThreads(involved_threads);
1484 EXPECT_TRUE(CheckRtp1());
1485 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486 EXPECT_TRUE(CheckNoRtp1());
1487 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001488 EXPECT_TRUE(CheckRtcp1());
1489 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490 EXPECT_TRUE(CheckNoRtcp1());
1491 EXPECT_TRUE(CheckNoRtcp2());
1492 }
1493
1494 // Test that we properly send SRTP with RTCP from a thread.
1495 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001496 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497 EXPECT_TRUE(SendInitiate());
1498 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001499 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1500 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1501 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1502 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1503 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1504 send_rtcp1.thread(),
1505 send_rtcp2.thread()};
1506 WaitForThreads(involved_threads);
1507 EXPECT_TRUE(CheckRtp1());
1508 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509 EXPECT_TRUE(CheckNoRtp1());
1510 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511 EXPECT_TRUE(CheckRtcp1());
1512 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 EXPECT_TRUE(CheckNoRtcp1());
1514 EXPECT_TRUE(CheckNoRtcp2());
1515 }
1516
1517 // Test that the mediachannel retains its sending state after the transport
1518 // becomes non-writable.
1519 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001520 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 EXPECT_TRUE(SendInitiate());
1522 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001523 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1524 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001525 SendRtp1();
1526 SendRtp2();
1527 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528 EXPECT_TRUE(CheckRtp1());
1529 EXPECT_TRUE(CheckRtp2());
1530 EXPECT_TRUE(CheckNoRtp1());
1531 EXPECT_TRUE(CheckNoRtp2());
1532
wu@webrtc.org97077a32013-10-25 21:18:33 +00001533 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001534 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1535 fake_rtp_dtls_transport1_->SetWritable(false);
1536 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001537 SendRtp1();
1538 SendRtp2();
1539 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_TRUE(CheckRtp1());
1541 EXPECT_TRUE(CheckNoRtp2());
1542
1543 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001544 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1545 fake_rtp_dtls_transport1_->SetWritable(true);
1546 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001548 SendRtp1();
1549 SendRtp2();
1550 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 EXPECT_TRUE(CheckRtp1());
1552 EXPECT_TRUE(CheckRtp2());
1553 EXPECT_TRUE(CheckNoRtp1());
1554 EXPECT_TRUE(CheckNoRtp2());
1555
1556 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001557 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1558 bool asymmetric = true;
1559 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1560 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561 EXPECT_TRUE(media_channel1_->sending());
1562
wu@webrtc.org97077a32013-10-25 21:18:33 +00001563 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001564 SendRtp1();
1565 SendRtp2();
1566 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567 EXPECT_TRUE(CheckRtp1());
1568 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001569 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570
1571 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001572 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001573 bool asymmetric = true;
1574 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1575 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001576 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001578 SendRtp1();
1579 SendRtp2();
1580 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 EXPECT_TRUE(CheckRtp1());
1582 EXPECT_TRUE(CheckRtp2());
1583 EXPECT_TRUE(CheckNoRtp1());
1584 EXPECT_TRUE(CheckNoRtp2());
1585 }
1586
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001587 void SendBundleToBundle(
1588 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1589 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001591 // Only pl_type1 was added to the bundle filter for both |channel1_|
1592 // and |channel2_|.
1593 int pl_type1 = pl_types[0];
1594 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001595 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001596 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001597 if (rtcp_mux) {
1598 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001599 }
1600 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001602 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1603 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001605 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1606 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001607 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1608 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1609 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1610 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001611
1612 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001613 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1614 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1615 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001616 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001617 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1618 EXPECT_TRUE(CheckNoRtp1());
1619 EXPECT_TRUE(CheckNoRtp2());
1620
1621 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1623 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1624 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001625 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001626 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1627
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001628 SendCustomRtcp1(kSsrc1);
1629 SendCustomRtcp2(kSsrc2);
1630 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1632 EXPECT_TRUE(CheckNoRtcp1());
1633 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1634 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001636 SendCustomRtcp1(kSsrc2);
1637 SendCustomRtcp2(kSsrc1);
1638 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001639 // Bundle filter shouldn't filter out any RTCP.
1640 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1641 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 }
1643
deadbeefc6b6e092016-12-01 12:49:20 -08001644 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 CreateChannels(0, 0);
1647 EXPECT_TRUE(SendInitiate());
1648 EXPECT_TRUE(SendAccept());
1649 channel1_->StartMediaMonitor(100);
1650 channel2_->StartMediaMonitor(100);
1651 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001652 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1653 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 channel1_->StopMediaMonitor();
1655 channel2_->StopMediaMonitor();
1656 // Ensure a restart of a stopped monitor works.
1657 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001658 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 channel1_->StopMediaMonitor();
1660 // Ensure stopping a stopped monitor is OK.
1661 channel1_->StopMediaMonitor();
1662 }
1663
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 void TestSetContentFailure() {
1665 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666
Peter Thatchera6d24442015-07-09 21:26:36 -07001667 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001668 std::unique_ptr<typename T::Content> content(
1669 CreateMediaContentWithStream(1));
1670
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001672 EXPECT_FALSE(
1673 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1674 EXPECT_FALSE(
1675 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001678 EXPECT_FALSE(
1679 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1680
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001682 EXPECT_FALSE(
1683 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 }
1685
1686 void TestSendTwoOffers() {
1687 CreateChannels(0, 0);
1688
Peter Thatchera6d24442015-07-09 21:26:36 -07001689 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001690 std::unique_ptr<typename T::Content> content1(
1691 CreateMediaContentWithStream(1));
1692 EXPECT_TRUE(
1693 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1695
Steve Anton18ee1d52017-09-11 11:32:35 -07001696 std::unique_ptr<typename T::Content> content2(
1697 CreateMediaContentWithStream(2));
1698 EXPECT_TRUE(
1699 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1701 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1702 }
1703
1704 void TestReceiveTwoOffers() {
1705 CreateChannels(0, 0);
1706
Peter Thatchera6d24442015-07-09 21:26:36 -07001707 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001708 std::unique_ptr<typename T::Content> content1(
1709 CreateMediaContentWithStream(1));
1710 EXPECT_TRUE(
1711 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1713
Steve Anton18ee1d52017-09-11 11:32:35 -07001714 std::unique_ptr<typename T::Content> content2(
1715 CreateMediaContentWithStream(2));
1716 EXPECT_TRUE(
1717 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1719 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1720 }
1721
1722 void TestSendPrAnswer() {
1723 CreateChannels(0, 0);
1724
Peter Thatchera6d24442015-07-09 21:26:36 -07001725 std::string err;
1726 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001727 std::unique_ptr<typename T::Content> content1(
1728 CreateMediaContentWithStream(1));
1729 EXPECT_TRUE(
1730 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1732
Peter Thatchera6d24442015-07-09 21:26:36 -07001733 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001734 std::unique_ptr<typename T::Content> content2(
1735 CreateMediaContentWithStream(2));
1736 EXPECT_TRUE(
1737 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1739 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1740
Peter Thatchera6d24442015-07-09 21:26:36 -07001741 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001742 std::unique_ptr<typename T::Content> content3(
1743 CreateMediaContentWithStream(3));
1744 EXPECT_TRUE(
1745 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1747 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1748 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1749 }
1750
1751 void TestReceivePrAnswer() {
1752 CreateChannels(0, 0);
1753
Peter Thatchera6d24442015-07-09 21:26:36 -07001754 std::string err;
1755 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001756 std::unique_ptr<typename T::Content> content1(
1757 CreateMediaContentWithStream(1));
1758 EXPECT_TRUE(
1759 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1761
Peter Thatchera6d24442015-07-09 21:26:36 -07001762 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001763 std::unique_ptr<typename T::Content> content2(
1764 CreateMediaContentWithStream(2));
1765 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1766 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1768 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1769
Peter Thatchera6d24442015-07-09 21:26:36 -07001770 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001771 std::unique_ptr<typename T::Content> content3(
1772 CreateMediaContentWithStream(3));
1773 EXPECT_TRUE(
1774 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1776 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1777 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1778 }
1779
1780 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001781 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001782 EXPECT_TRUE(SendInitiate());
1783 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001784 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1785 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786
1787 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 // The sending message is only posted. channel2_ should be empty.
1790 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001791 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1792 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793
1794 // When channel1_ is deleted, the RTCP packet should be sent out to
1795 // channel2_.
1796 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 EXPECT_TRUE(CheckRtcp2());
1799 }
1800
zstein56162b92017-04-24 16:54:35 -07001801 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001802 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001804
zstein56162b92017-04-24 16:54:35 -07001805 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 EXPECT_TRUE(media_channel1_->ready_to_send());
1808
zstein56162b92017-04-24 16:54:35 -07001809 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001810 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 }
1813
zstein56162b92017-04-24 16:54:35 -07001814 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001815 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 typename T::Content content;
1817 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001818 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001820 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001821 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001822 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001823 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1824 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 EXPECT_FALSE(media_channel1_->ready_to_send());
1826 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1827 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001828 network_thread_->Invoke<void>(RTC_FROM_HERE,
1829 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001832
zstein56162b92017-04-24 16:54:35 -07001833 // TODO(zstein): Find a way to test this without making
1834 // OnTransportReadyToSend public.
1835 network_thread_->Invoke<void>(
1836 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001837 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 EXPECT_FALSE(media_channel1_->ready_to_send());
1839 }
1840
skvladdc1c62c2016-03-16 19:07:43 -07001841 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1842 typename T::Content content;
1843 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1844 content.set_bandwidth(remote_limit);
1845 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
1846 }
1847
deadbeefe702b302017-02-04 12:09:01 -08001848 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001849 webrtc::RtpParameters parameters;
1850 webrtc::RtpEncodingParameters encoding;
1851 encoding.max_bitrate_bps = limit;
1852 parameters.encodings.push_back(encoding);
1853 return parameters;
1854 }
1855
1856 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001857 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001858 EXPECT_EQ(1UL, parameters.encodings.size());
1859 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1860 }
1861
1862 void DefaultMaxBitrateIsUnlimited() {
1863 CreateChannels(0, 0);
1864 EXPECT_TRUE(
1865 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1866 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001867 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1868 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001869 }
1870
1871 void CanChangeMaxBitrate() {
1872 CreateChannels(0, 0);
1873 EXPECT_TRUE(
1874 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1875
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001876 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08001877 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
1878 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1879 rtc::Optional<int>(1000));
1880 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1881 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07001882 EXPECT_EQ(-1, media_channel1_->max_bps());
1883
deadbeefe702b302017-02-04 12:09:01 -08001884 EXPECT_TRUE(channel1_->SetRtpSendParameters(
1885 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
1886 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1887 rtc::Optional<int>());
1888 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1889 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001890 EXPECT_EQ(-1, media_channel1_->max_bps());
1891 }
1892
Steve Anton8a63f782017-10-23 13:08:53 -07001893 // Test that when a channel gets new transports with a call to
1894 // |SetTransports|, the socket options from the old transports are merged with
1895 // the options on the new transport.
1896 // For example, audio and video may use separate socket options, but initially
1897 // be unbundled, then later become bundled. When this happens, their preferred
1898 // socket options should be merged to the underlying transport they share.
1899 void SocketOptionsMergedOnSetTransport() {
1900 constexpr int kSndBufSize = 4000;
1901 constexpr int kRcvBufSize = 8000;
1902
1903 CreateChannels(0, 0);
1904
1905 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1906 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1907 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1908 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1909
1910 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1911 channel2_->rtcp_dtls_transport());
1912
1913 int option_val;
1914 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1915 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1916 EXPECT_EQ(kSndBufSize, option_val);
1917 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1918 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1919 EXPECT_EQ(kRcvBufSize, option_val);
1920 }
1921
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1924 static void ProcessThreadQueue(rtc::Thread* thread) {
1925 RTC_DCHECK(thread->IsCurrent());
1926 while (!thread->empty()) {
1927 thread->ProcessMessages(0);
1928 }
1929 }
1930 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1931 // |threads| and current thread post packets to network thread.
1932 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001933 thread->Invoke<void>(RTC_FROM_HERE,
1934 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935 }
1936 ProcessThreadQueue(rtc::Thread::Current());
1937 // Network thread move them around and post back to worker = current thread.
1938 if (!network_thread_->IsCurrent()) {
1939 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001940 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941 }
1942 // Worker thread = current Thread process received messages.
1943 ProcessThreadQueue(rtc::Thread::Current());
1944 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001945 // TODO(pbos): Remove playout from all media channels and let renderers mute
1946 // themselves.
1947 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1949 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001950 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1951 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1952 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1953 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1954 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1955 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1956 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1957 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 cricket::FakeMediaEngine media_engine_;
1959 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001960 typename T::MediaChannel* media_channel1_ = nullptr;
1961 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001962 std::unique_ptr<typename T::Channel> channel1_;
1963 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 typename T::Content local_media_content1_;
1965 typename T::Content local_media_content2_;
1966 typename T::Content remote_media_content1_;
1967 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001969 rtc::Buffer rtp_packet_;
1970 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001971 int media_info_callbacks1_ = 0;
1972 int media_info_callbacks2_ = 0;
1973 int rtcp_mux_activated_callbacks1_ = 0;
1974 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001975 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976};
1977
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978template<>
1979void ChannelTest<VoiceTraits>::CreateContent(
1980 int flags,
1981 const cricket::AudioCodec& audio_codec,
1982 const cricket::VideoCodec& video_codec,
1983 cricket::AudioContentDescription* audio) {
1984 audio->AddCodec(audio_codec);
1985 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
1986 if (flags & SECURE) {
1987 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001988 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1989 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001990 }
1991}
1992
1993template<>
1994void ChannelTest<VoiceTraits>::CopyContent(
1995 const cricket::AudioContentDescription& source,
1996 cricket::AudioContentDescription* audio) {
1997 *audio = source;
1998}
1999
2000template<>
2001bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2002 const cricket::AudioCodec& c2) {
2003 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2004 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2005}
2006
Peter Boström0c4e06b2015-10-07 12:23:21 +02002007template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002008void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002009 uint32_t ssrc,
2010 int flags,
2011 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002012 audio->AddLegacyStream(ssrc);
2013}
2014
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002015class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002016 public:
solenberg1dd98f32015-09-10 01:57:14 -07002017 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002018 VoiceChannelSingleThreadTest()
2019 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2020};
2021
2022class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2023 public:
2024 typedef ChannelTest<VoiceTraits> Base;
2025 VoiceChannelDoubleThreadTest()
2026 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002027};
2028
jbauch5869f502017-06-29 12:31:36 -07002029class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2030 : public ChannelTest<VoiceTraits> {
2031 public:
2032 typedef ChannelTest<VoiceTraits> Base;
2033 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2034 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2035 NetworkIsWorker::Yes) {}
2036};
2037
2038class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2039 : public ChannelTest<VoiceTraits> {
2040 public:
2041 typedef ChannelTest<VoiceTraits> Base;
2042 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2043 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2044 NetworkIsWorker::No) {}
2045};
2046
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002048template <>
Steve Anton8699a322017-11-06 15:53:33 -08002049std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002050 rtc::Thread* worker_thread,
2051 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002052 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002053 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002054 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2055 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002056 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2057 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002058 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002059 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002060 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2061 worker_thread, network_thread, signaling_thread, std::move(ch),
2062 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2063 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002064 if (!channel->NeedsRtcpTransport()) {
2065 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002066 }
Steve Anton8699a322017-11-06 15:53:33 -08002067 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2068 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002069 return channel;
2070}
2071
2072// override to add 0 parameter
2073template<>
2074bool ChannelTest<VideoTraits>::AddStream1(int id) {
2075 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2076}
2077
2078template<>
2079void ChannelTest<VideoTraits>::CreateContent(
2080 int flags,
2081 const cricket::AudioCodec& audio_codec,
2082 const cricket::VideoCodec& video_codec,
2083 cricket::VideoContentDescription* video) {
2084 video->AddCodec(video_codec);
2085 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2086 if (flags & SECURE) {
2087 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002088 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2089 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 }
2091}
2092
2093template<>
2094void ChannelTest<VideoTraits>::CopyContent(
2095 const cricket::VideoContentDescription& source,
2096 cricket::VideoContentDescription* video) {
2097 *video = source;
2098}
2099
2100template<>
2101bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2102 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002103 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104}
2105
Peter Boström0c4e06b2015-10-07 12:23:21 +02002106template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002107void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002108 uint32_t ssrc,
2109 int flags,
2110 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111 video->AddLegacyStream(ssrc);
2112}
2113
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002114class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002115 public:
solenberg1dd98f32015-09-10 01:57:14 -07002116 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002117 VideoChannelSingleThreadTest()
2118 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119};
2120
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002121class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2122 public:
2123 typedef ChannelTest<VideoTraits> Base;
2124 VideoChannelDoubleThreadTest()
2125 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2126};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002128TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 Base::TestInit();
2130 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2131 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2132}
2133
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002134TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2135 Base::TestDeinit();
2136}
2137
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002138TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002139 Base::TestSetContents();
2140}
2141
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002142TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 Base::TestSetContentsNullOffer();
2144}
2145
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002146TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147 Base::TestSetContentsRtcpMux();
2148}
2149
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002150TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151 Base::TestSetContentsRtcpMux();
2152}
2153
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002154TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002155 Base::TestStreams();
2156}
2157
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002158TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159 Base::TestChangeStreamParamsInContent();
2160}
2161
jbauch5869f502017-06-29 12:31:36 -07002162TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2163 TestChangeEncryptedHeaderExtensionsDtls) {
2164 int flags = DTLS;
2165 Base::TestChangeEncryptedHeaderExtensions(flags);
2166}
2167
2168TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2169 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2170 int flags = DTLS;
2171 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2172}
2173
2174TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2175 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2176 int flags = DTLS;
2177 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2178}
2179
2180TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2181 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2182 int flags = DTLS | GCM_CIPHER;
2183 Base::TestChangeEncryptedHeaderExtensions(flags);
2184}
2185
2186TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2187 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2188 int flags = DTLS | GCM_CIPHER;
2189 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2190}
2191
2192TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2193 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2194 int flags = DTLS | GCM_CIPHER;
2195 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2196}
2197
2198TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2199 TestChangeEncryptedHeaderExtensionsSDES) {
2200 int flags = 0;
2201 Base::TestChangeEncryptedHeaderExtensions(flags);
2202}
2203
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002204TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002205 Base::TestPlayoutAndSendingStates();
2206}
2207
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002208TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002209 CreateChannels(0, 0);
2210 // Test that we can Mute the default channel even though the sending SSRC
2211 // is unknown.
2212 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002213 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002214 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2215 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002216 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2217
2218 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002219 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002220
2221 SendInitiate();
2222 // After the local session description has been set, we can mute a stream
2223 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002224 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002225 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2226 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002227 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228}
2229
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002230TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231 Base::TestMediaContentDirection();
2232}
2233
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002234TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002235 Base::TestNetworkRouteChanges();
2236}
2237
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002238TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 Base::TestCallSetup();
2240}
2241
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002242TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 Base::TestCallTeardownRtcpMux();
2244}
2245
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002246TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247 Base::SendRtpToRtp();
2248}
2249
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002250TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251 Base::SendRtcpToRtcp();
2252}
2253
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255 Base::SendRtcpMuxToRtcp();
2256}
2257
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002258TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259 Base::SendRtcpMuxToRtcpMux();
2260}
2261
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002262TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002263 Base::SendRequireRtcpMuxToRtcpMux();
2264}
2265
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002266TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002267 Base::SendRtcpMuxToRequireRtcpMux();
2268}
2269
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002270TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002271 Base::SendRequireRtcpMuxToRequireRtcpMux();
2272}
2273
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002274TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002275 Base::SendRequireRtcpMuxToNoRtcpMux();
2276}
2277
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002278TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279 Base::SendEarlyRtcpMuxToRtcp();
2280}
2281
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002282TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002283 Base::SendEarlyRtcpMuxToRtcpMux();
2284}
2285
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002286TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2288}
2289
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002290TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291 Base::SendSrtpToSrtp();
2292}
2293
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002294TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2296}
2297
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002298TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299 Base::SendSrtpToSrtp(DTLS, 0);
2300}
2301
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303 Base::SendSrtpToSrtp(DTLS, DTLS);
2304}
2305
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2308}
2309
deadbeeff5346592017-01-24 21:51:21 -08002310// Test using the channel with a raw packet interface, as opposed to a DTLS
2311// transport interface.
2312TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2313 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2314}
2315
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002316TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2318}
2319
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002320TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321 Base::SendRtpToRtpOnThread();
2322}
2323
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002324TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325 Base::SendSrtpToSrtpOnThread();
2326}
2327
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002328TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 Base::SendWithWritabilityLoss();
2330}
2331
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002332TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333 Base::TestMediaMonitor();
2334}
2335
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002337TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 CreateChannels(0, 0);
2339 EXPECT_TRUE(SendInitiate());
2340 EXPECT_TRUE(SendAccept());
2341 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2342
solenberg1d63dd02015-12-02 12:35:09 -08002343 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2344 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2345 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002347 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002349 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002350 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002351 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002352 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002353 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354}
2355
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002356TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 Base::TestSetContentFailure();
2358}
2359
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002360TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361 Base::TestSendTwoOffers();
2362}
2363
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002364TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::TestReceiveTwoOffers();
2366}
2367
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002368TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::TestSendPrAnswer();
2370}
2371
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002372TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::TestReceivePrAnswer();
2374}
2375
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002376TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 Base::TestFlushRtcp();
2378}
2379
zstein56162b92017-04-24 16:54:35 -07002380TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2381 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382}
2383
zstein56162b92017-04-24 16:54:35 -07002384TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2385 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386}
2387
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002389TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002390 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 EXPECT_TRUE(SendInitiate());
2392 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002393 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394
solenberg4bac9c52015-10-09 02:32:53 -07002395 // Default is (1.0).
2396 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2397 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002399 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400
solenberg4bac9c52015-10-09 02:32:53 -07002401 // Set scale to (1.5).
2402 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2403 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2404 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405
solenberg4bac9c52015-10-09 02:32:53 -07002406 // Set scale to (0).
2407 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2408 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2409 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410}
2411
2412// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002414 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415 EXPECT_TRUE(SendInitiate());
2416 EXPECT_TRUE(SendAccept());
2417 EXPECT_TRUE(AddStream1(1));
2418 EXPECT_TRUE(AddStream1(2));
2419
solenberg4bac9c52015-10-09 02:32:53 -07002420 double volume;
2421 // Default is (1.0).
2422 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2423 EXPECT_DOUBLE_EQ(1.0, volume);
2424 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2425 EXPECT_DOUBLE_EQ(1.0, volume);
2426 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2427 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002429 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430
solenberg4bac9c52015-10-09 02:32:53 -07002431 // Set scale to (1.5) for ssrc = 1.
2432 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2433 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2434 EXPECT_DOUBLE_EQ(1.5, volume);
2435 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2436 EXPECT_DOUBLE_EQ(1.0, volume);
2437 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2438 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439
solenberg4bac9c52015-10-09 02:32:53 -07002440 // Set scale to (0) for all ssrcs.
2441 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2442 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2443 EXPECT_DOUBLE_EQ(0.0, volume);
2444 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2445 EXPECT_DOUBLE_EQ(0.0, volume);
2446 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2447 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448}
2449
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002450TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002451 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452}
2453
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002454TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002455 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002456}
2457
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002458TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002459 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002460}
2461
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002462TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002463 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464}
2465
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002466TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002467 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002468}
2469
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002470TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002471 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002472}
2473
Steve Anton8a63f782017-10-23 13:08:53 -07002474TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2475 Base::SocketOptionsMergedOnSetTransport();
2476}
2477
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002478// VoiceChannelDoubleThreadTest
2479TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002481 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2482 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483}
2484
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002485TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2486 Base::TestDeinit();
2487}
2488
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002489TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002490 Base::TestSetContents();
2491}
2492
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002493TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 Base::TestSetContentsNullOffer();
2495}
2496
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002497TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 Base::TestSetContentsRtcpMux();
2499}
2500
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002501TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002502 Base::TestSetContentsRtcpMux();
2503}
2504
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002505TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506 Base::TestStreams();
2507}
2508
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002509TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 Base::TestChangeStreamParamsInContent();
2511}
2512
jbauch5869f502017-06-29 12:31:36 -07002513TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2514 TestChangeEncryptedHeaderExtensionsDtls) {
2515 int flags = DTLS;
2516 Base::TestChangeEncryptedHeaderExtensions(flags);
2517}
2518
2519TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2520 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2521 int flags = DTLS;
2522 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2523}
2524
2525TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2526 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2527 int flags = DTLS;
2528 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2529}
2530
2531TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2532 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2533 int flags = DTLS | GCM_CIPHER;
2534 Base::TestChangeEncryptedHeaderExtensions(flags);
2535}
2536
2537TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2538 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2539 int flags = DTLS | GCM_CIPHER;
2540 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2541}
2542
2543TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2544 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2545 int flags = DTLS | GCM_CIPHER;
2546 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2547}
2548
2549TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2550 TestChangeEncryptedHeaderExtensionsSDES) {
2551 int flags = 0;
2552 Base::TestChangeEncryptedHeaderExtensions(flags);
2553}
2554
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002555TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 Base::TestPlayoutAndSendingStates();
2557}
2558
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002559TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2560 CreateChannels(0, 0);
2561 // Test that we can Mute the default channel even though the sending SSRC
2562 // is unknown.
2563 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2564 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2565 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2566 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2567 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2568
2569 // Test that we can not mute an unknown SSRC.
2570 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2571
2572 SendInitiate();
2573 // After the local session description has been set, we can mute a stream
2574 // with its SSRC.
2575 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2576 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2577 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2578 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2579}
2580
2581TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2582 Base::TestMediaContentDirection();
2583}
2584
2585TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2586 Base::TestNetworkRouteChanges();
2587}
2588
2589TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2590 Base::TestCallSetup();
2591}
2592
2593TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2594 Base::TestCallTeardownRtcpMux();
2595}
2596
2597TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2598 Base::SendRtpToRtp();
2599}
2600
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002601TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2602 Base::SendRtcpToRtcp();
2603}
2604
2605TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2606 Base::SendRtcpMuxToRtcp();
2607}
2608
2609TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2610 Base::SendRtcpMuxToRtcpMux();
2611}
2612
2613TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2614 Base::SendRequireRtcpMuxToRtcpMux();
2615}
2616
2617TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2618 Base::SendRtcpMuxToRequireRtcpMux();
2619}
2620
2621TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2622 Base::SendRequireRtcpMuxToRequireRtcpMux();
2623}
2624
2625TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2626 Base::SendRequireRtcpMuxToNoRtcpMux();
2627}
2628
2629TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2630 Base::SendEarlyRtcpMuxToRtcp();
2631}
2632
2633TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2634 Base::SendEarlyRtcpMuxToRtcpMux();
2635}
2636
2637TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2638 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2639}
2640
2641TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2642 Base::SendSrtpToSrtp();
2643}
2644
2645TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2646 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2647}
2648
2649TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002650 Base::SendSrtpToSrtp(DTLS, 0);
2651}
2652
2653TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002654 Base::SendSrtpToSrtp(DTLS, DTLS);
2655}
2656
2657TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002658 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2659}
2660
deadbeeff5346592017-01-24 21:51:21 -08002661// Test using the channel with a raw packet interface, as opposed to a DTLS
2662// transport interface.
2663TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2664 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2665}
2666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002667TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2668 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2669}
2670
2671TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2672 Base::SendRtpToRtpOnThread();
2673}
2674
2675TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2676 Base::SendSrtpToSrtpOnThread();
2677}
2678
2679TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2680 Base::SendWithWritabilityLoss();
2681}
2682
2683TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2684 Base::TestMediaMonitor();
2685}
2686
2687// Test that InsertDtmf properly forwards to the media channel.
2688TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2689 CreateChannels(0, 0);
2690 EXPECT_TRUE(SendInitiate());
2691 EXPECT_TRUE(SendAccept());
2692 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2693
2694 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2695 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2696 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2697
2698 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2699 EXPECT_TRUE(
2700 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2701 EXPECT_TRUE(
2702 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2703 EXPECT_TRUE(
2704 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2705}
2706
2707TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2708 Base::TestSetContentFailure();
2709}
2710
2711TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2712 Base::TestSendTwoOffers();
2713}
2714
2715TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2716 Base::TestReceiveTwoOffers();
2717}
2718
2719TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2720 Base::TestSendPrAnswer();
2721}
2722
2723TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2724 Base::TestReceivePrAnswer();
2725}
2726
2727TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2728 Base::TestFlushRtcp();
2729}
2730
zstein56162b92017-04-24 16:54:35 -07002731TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2732 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002733}
2734
zstein56162b92017-04-24 16:54:35 -07002735TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2736 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002737}
2738
2739// Test that we can scale the output volume properly for 1:1 calls.
2740TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002741 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002742 EXPECT_TRUE(SendInitiate());
2743 EXPECT_TRUE(SendAccept());
2744 double volume;
2745
2746 // Default is (1.0).
2747 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2748 EXPECT_DOUBLE_EQ(1.0, volume);
2749 // invalid ssrc.
2750 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2751
2752 // Set scale to (1.5).
2753 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2754 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2755 EXPECT_DOUBLE_EQ(1.5, volume);
2756
2757 // Set scale to (0).
2758 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2759 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2760 EXPECT_DOUBLE_EQ(0.0, volume);
2761}
2762
2763// Test that we can scale the output volume properly for multiway calls.
2764TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002765 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002766 EXPECT_TRUE(SendInitiate());
2767 EXPECT_TRUE(SendAccept());
2768 EXPECT_TRUE(AddStream1(1));
2769 EXPECT_TRUE(AddStream1(2));
2770
2771 double volume;
2772 // Default is (1.0).
2773 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2774 EXPECT_DOUBLE_EQ(1.0, volume);
2775 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2776 EXPECT_DOUBLE_EQ(1.0, volume);
2777 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2778 EXPECT_DOUBLE_EQ(1.0, volume);
2779 // invalid ssrc.
2780 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2781
2782 // Set scale to (1.5) for ssrc = 1.
2783 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2784 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2785 EXPECT_DOUBLE_EQ(1.5, volume);
2786 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2787 EXPECT_DOUBLE_EQ(1.0, volume);
2788 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2789 EXPECT_DOUBLE_EQ(1.0, volume);
2790
2791 // Set scale to (0) for all ssrcs.
2792 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2793 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2794 EXPECT_DOUBLE_EQ(0.0, volume);
2795 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2796 EXPECT_DOUBLE_EQ(0.0, volume);
2797 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2798 EXPECT_DOUBLE_EQ(0.0, volume);
2799}
2800
2801TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2802 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2803}
2804
2805TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2806 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2807}
2808
2809TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2810 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2811}
2812
2813TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2814 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2815}
2816
2817TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2818 Base::DefaultMaxBitrateIsUnlimited();
2819}
2820
2821TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2822 Base::CanChangeMaxBitrate();
2823}
2824
Steve Anton8a63f782017-10-23 13:08:53 -07002825TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2826 Base::SocketOptionsMergedOnSetTransport();
2827}
2828
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002829// VideoChannelSingleThreadTest
2830TEST_F(VideoChannelSingleThreadTest, TestInit) {
2831 Base::TestInit();
2832}
2833
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002834TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2835 Base::TestDeinit();
2836}
2837
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002838TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2839 Base::TestSetContents();
2840}
2841
2842TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2843 Base::TestSetContentsNullOffer();
2844}
2845
2846TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2847 Base::TestSetContentsRtcpMux();
2848}
2849
2850TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2851 Base::TestSetContentsRtcpMux();
2852}
2853
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002854TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2855 Base::TestStreams();
2856}
2857
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002858TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2859 Base::TestChangeStreamParamsInContent();
2860}
2861
2862TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2863 Base::TestPlayoutAndSendingStates();
2864}
2865
2866TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002867 CreateChannels(0, 0);
2868 // Test that we can Mute the default channel even though the sending SSRC
2869 // is unknown.
2870 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002871 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002872 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002873 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002874 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2875 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002876 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002877 SendInitiate();
2878 // After the local session description has been set, we can mute a stream
2879 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002880 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002881 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002882 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002883 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884}
2885
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002886TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 Base::TestMediaContentDirection();
2888}
2889
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002890TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002891 Base::TestNetworkRouteChanges();
2892}
2893
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002894TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002895 Base::TestCallSetup();
2896}
2897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002898TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899 Base::TestCallTeardownRtcpMux();
2900}
2901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002902TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 Base::SendRtpToRtp();
2904}
2905
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002906TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 Base::SendRtcpToRtcp();
2908}
2909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002910TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 Base::SendRtcpMuxToRtcp();
2912}
2913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002914TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 Base::SendRtcpMuxToRtcpMux();
2916}
2917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002918TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002919 Base::SendRequireRtcpMuxToRtcpMux();
2920}
2921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002922TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002923 Base::SendRtcpMuxToRequireRtcpMux();
2924}
2925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002926TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002927 Base::SendRequireRtcpMuxToRequireRtcpMux();
2928}
2929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002930TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002931 Base::SendRequireRtcpMuxToNoRtcpMux();
2932}
2933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002934TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 Base::SendEarlyRtcpMuxToRtcp();
2936}
2937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002938TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002939 Base::SendEarlyRtcpMuxToRtcpMux();
2940}
2941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002942TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 Base::SendSrtpToSrtp();
2944}
2945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002946TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 Base::SendSrtpToSrtp();
2948}
2949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002950TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951 Base::SendSrtpToSrtp(DTLS, 0);
2952}
2953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002954TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955 Base::SendSrtpToSrtp(DTLS, DTLS);
2956}
2957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002958TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2960}
2961
deadbeeff5346592017-01-24 21:51:21 -08002962// Test using the channel with a raw packet interface, as opposed to a DTLS
2963// transport interface.
2964TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2965 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2966}
2967
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002968TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2970}
2971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002972TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2974}
2975
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002976TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977 Base::SendRtpToRtpOnThread();
2978}
2979
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002980TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981 Base::SendSrtpToSrtpOnThread();
2982}
2983
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002984TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002985 Base::SendWithWritabilityLoss();
2986}
2987
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002988TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989 Base::TestMediaMonitor();
2990}
2991
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002992TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993 Base::TestSetContentFailure();
2994}
2995
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002996TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997 Base::TestSendTwoOffers();
2998}
2999
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003000TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001 Base::TestReceiveTwoOffers();
3002}
3003
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003004TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005 Base::TestSendPrAnswer();
3006}
3007
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003008TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003009 Base::TestReceivePrAnswer();
3010}
3011
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003012TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013 Base::TestFlushRtcp();
3014}
3015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003016TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003017 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018}
3019
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003020TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003021 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003022}
3023
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003024TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003025 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003026}
3027
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003028TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003029 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003030}
3031
zstein56162b92017-04-24 16:54:35 -07003032TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3033 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034}
3035
zstein56162b92017-04-24 16:54:35 -07003036TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3037 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003038}
3039
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003040TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003041 Base::DefaultMaxBitrateIsUnlimited();
3042}
3043
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003044TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003045 Base::CanChangeMaxBitrate();
3046}
3047
Steve Anton8a63f782017-10-23 13:08:53 -07003048TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3049 Base::SocketOptionsMergedOnSetTransport();
3050}
3051
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003052// VideoChannelDoubleThreadTest
3053TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3054 Base::TestInit();
3055}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003056
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003057TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3058 Base::TestDeinit();
3059}
3060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003061TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3062 Base::TestSetContents();
3063}
3064
3065TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3066 Base::TestSetContentsNullOffer();
3067}
3068
3069TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3070 Base::TestSetContentsRtcpMux();
3071}
3072
3073TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3074 Base::TestSetContentsRtcpMux();
3075}
3076
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003077TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3078 Base::TestStreams();
3079}
3080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003081TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3082 Base::TestChangeStreamParamsInContent();
3083}
3084
3085TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3086 Base::TestPlayoutAndSendingStates();
3087}
3088
3089TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3090 CreateChannels(0, 0);
3091 // Test that we can Mute the default channel even though the sending SSRC
3092 // is unknown.
3093 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003094 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003095 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003096 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003097 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3098 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003099 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003100 SendInitiate();
3101 // After the local session description has been set, we can mute a stream
3102 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003103 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003104 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003105 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003106 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3107}
3108
3109TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3110 Base::TestMediaContentDirection();
3111}
3112
3113TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3114 Base::TestNetworkRouteChanges();
3115}
3116
3117TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3118 Base::TestCallSetup();
3119}
3120
3121TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3122 Base::TestCallTeardownRtcpMux();
3123}
3124
3125TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3126 Base::SendRtpToRtp();
3127}
3128
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003129TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3130 Base::SendRtcpToRtcp();
3131}
3132
3133TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3134 Base::SendRtcpMuxToRtcp();
3135}
3136
3137TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3138 Base::SendRtcpMuxToRtcpMux();
3139}
3140
3141TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3142 Base::SendRequireRtcpMuxToRtcpMux();
3143}
3144
3145TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3146 Base::SendRtcpMuxToRequireRtcpMux();
3147}
3148
3149TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3150 Base::SendRequireRtcpMuxToRequireRtcpMux();
3151}
3152
3153TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3154 Base::SendRequireRtcpMuxToNoRtcpMux();
3155}
3156
3157TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3158 Base::SendEarlyRtcpMuxToRtcp();
3159}
3160
3161TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3162 Base::SendEarlyRtcpMuxToRtcpMux();
3163}
3164
3165TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3166 Base::SendSrtpToSrtp();
3167}
3168
3169TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3170 Base::SendSrtpToSrtp();
3171}
3172
3173TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003174 Base::SendSrtpToSrtp(DTLS, 0);
3175}
3176
3177TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003178 Base::SendSrtpToSrtp(DTLS, DTLS);
3179}
3180
3181TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003182 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3183}
3184
deadbeeff5346592017-01-24 21:51:21 -08003185// Test using the channel with a raw packet interface, as opposed to a DTLS
3186// transport interface.
3187TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3188 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3189}
3190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003191TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3192 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3193}
3194
3195TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3196 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3197}
3198
3199TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3200 Base::SendRtpToRtpOnThread();
3201}
3202
3203TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3204 Base::SendSrtpToSrtpOnThread();
3205}
3206
3207TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3208 Base::SendWithWritabilityLoss();
3209}
3210
3211TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3212 Base::TestMediaMonitor();
3213}
3214
3215TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3216 Base::TestSetContentFailure();
3217}
3218
3219TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3220 Base::TestSendTwoOffers();
3221}
3222
3223TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3224 Base::TestReceiveTwoOffers();
3225}
3226
3227TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3228 Base::TestSendPrAnswer();
3229}
3230
3231TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3232 Base::TestReceivePrAnswer();
3233}
3234
3235TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3236 Base::TestFlushRtcp();
3237}
3238
3239TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3240 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3241}
3242
3243TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3244 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3245}
3246
3247TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3248 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3249}
3250
3251TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3252 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3253}
3254
zstein56162b92017-04-24 16:54:35 -07003255TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3256 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003257}
3258
zstein56162b92017-04-24 16:54:35 -07003259TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3260 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003261}
3262
3263TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3264 Base::DefaultMaxBitrateIsUnlimited();
3265}
3266
3267TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3268 Base::CanChangeMaxBitrate();
3269}
3270
Steve Anton8a63f782017-10-23 13:08:53 -07003271TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3272 Base::SocketOptionsMergedOnSetTransport();
3273}
3274
deadbeef953c2ce2017-01-09 14:53:41 -08003275// RtpDataChannelSingleThreadTest
3276class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003277 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003278 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003279 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003280 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3281};
3282
deadbeef953c2ce2017-01-09 14:53:41 -08003283// RtpDataChannelDoubleThreadTest
3284class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003285 public:
3286 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003287 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003288 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003289};
3290
3291// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003292template <>
Steve Anton8699a322017-11-06 15:53:33 -08003293std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003294 rtc::Thread* worker_thread,
3295 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003296 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003297 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003298 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3299 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003300 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3301 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003302 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003303 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003304 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3305 worker_thread, network_thread, signaling_thread, std::move(ch),
3306 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3307 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003308 if (!channel->NeedsRtcpTransport()) {
3309 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003310 }
Steve Anton8699a322017-11-06 15:53:33 -08003311 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3312 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003313 return channel;
3314}
3315
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003316template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003317void ChannelTest<DataTraits>::CreateContent(
3318 int flags,
3319 const cricket::AudioCodec& audio_codec,
3320 const cricket::VideoCodec& video_codec,
3321 cricket::DataContentDescription* data) {
3322 data->AddCodec(kGoogleDataCodec);
3323 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3324 if (flags & SECURE) {
3325 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003326 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3327 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003328 }
3329}
3330
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003331template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003332void ChannelTest<DataTraits>::CopyContent(
3333 const cricket::DataContentDescription& source,
3334 cricket::DataContentDescription* data) {
3335 *data = source;
3336}
3337
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003338template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003339bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3340 const cricket::DataCodec& c2) {
3341 return c1.name == c2.name;
3342}
3343
Peter Boström0c4e06b2015-10-07 12:23:21 +02003344template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003345void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003346 uint32_t ssrc,
3347 int flags,
3348 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003349 data->AddLegacyStream(ssrc);
3350}
3351
deadbeef953c2ce2017-01-09 14:53:41 -08003352TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003353 Base::TestInit();
3354 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3355}
3356
deadbeef953c2ce2017-01-09 14:53:41 -08003357TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003358 Base::TestDeinit();
3359}
3360
deadbeef953c2ce2017-01-09 14:53:41 -08003361TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003362 Base::TestSetContents();
3363}
3364
deadbeef953c2ce2017-01-09 14:53:41 -08003365TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003366 Base::TestSetContentsNullOffer();
3367}
3368
deadbeef953c2ce2017-01-09 14:53:41 -08003369TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003370 Base::TestSetContentsRtcpMux();
3371}
3372
deadbeef953c2ce2017-01-09 14:53:41 -08003373TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003374 Base::TestStreams();
3375}
3376
deadbeef953c2ce2017-01-09 14:53:41 -08003377TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003378 Base::TestChangeStreamParamsInContent();
3379}
3380
deadbeef953c2ce2017-01-09 14:53:41 -08003381TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003382 Base::TestPlayoutAndSendingStates();
3383}
3384
deadbeef953c2ce2017-01-09 14:53:41 -08003385TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003386 Base::TestMediaContentDirection();
3387}
3388
deadbeef953c2ce2017-01-09 14:53:41 -08003389TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003390 Base::TestCallSetup();
3391}
3392
deadbeef953c2ce2017-01-09 14:53:41 -08003393TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003394 Base::TestCallTeardownRtcpMux();
3395}
3396
zstein56162b92017-04-24 16:54:35 -07003397TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3398 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003399}
3400
zstein56162b92017-04-24 16:54:35 -07003401TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3402 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003403}
3404
deadbeef953c2ce2017-01-09 14:53:41 -08003405TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003406 Base::SendRtpToRtp();
3407}
3408
deadbeef953c2ce2017-01-09 14:53:41 -08003409TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003410 Base::SendRtcpToRtcp();
3411}
3412
deadbeef953c2ce2017-01-09 14:53:41 -08003413TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003414 Base::SendRtcpMuxToRtcp();
3415}
3416
deadbeef953c2ce2017-01-09 14:53:41 -08003417TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003418 Base::SendRtcpMuxToRtcpMux();
3419}
3420
deadbeef953c2ce2017-01-09 14:53:41 -08003421TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003422 Base::SendEarlyRtcpMuxToRtcp();
3423}
3424
deadbeef953c2ce2017-01-09 14:53:41 -08003425TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003426 Base::SendEarlyRtcpMuxToRtcpMux();
3427}
3428
deadbeef953c2ce2017-01-09 14:53:41 -08003429TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003430 Base::SendSrtpToSrtp();
3431}
3432
deadbeef953c2ce2017-01-09 14:53:41 -08003433TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003434 Base::SendSrtpToSrtp();
3435}
3436
deadbeef953c2ce2017-01-09 14:53:41 -08003437TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003438 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3439}
3440
deadbeef953c2ce2017-01-09 14:53:41 -08003441TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003442 Base::SendRtpToRtpOnThread();
3443}
3444
deadbeef953c2ce2017-01-09 14:53:41 -08003445TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003446 Base::SendSrtpToSrtpOnThread();
3447}
3448
deadbeef953c2ce2017-01-09 14:53:41 -08003449TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003450 Base::SendWithWritabilityLoss();
3451}
3452
deadbeef953c2ce2017-01-09 14:53:41 -08003453TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003454 Base::TestMediaMonitor();
3455}
3456
Steve Anton8a63f782017-10-23 13:08:53 -07003457TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3458 Base::SocketOptionsMergedOnSetTransport();
3459}
3460
deadbeef953c2ce2017-01-09 14:53:41 -08003461TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003462 CreateChannels(0, 0);
3463 EXPECT_TRUE(SendInitiate());
3464 EXPECT_TRUE(SendAccept());
3465
3466 cricket::SendDataParams params;
3467 params.ssrc = 42;
3468 unsigned char data[] = {'f', 'o', 'o'};
3469 rtc::CopyOnWriteBuffer payload(data, 3);
3470 cricket::SendDataResult result;
3471 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3472 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3473 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3474}
3475
deadbeef953c2ce2017-01-09 14:53:41 -08003476TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003477 Base::TestInit();
3478 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3479}
3480
deadbeef953c2ce2017-01-09 14:53:41 -08003481TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003482 Base::TestDeinit();
3483}
3484
deadbeef953c2ce2017-01-09 14:53:41 -08003485TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003486 Base::TestSetContents();
3487}
3488
deadbeef953c2ce2017-01-09 14:53:41 -08003489TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003490 Base::TestSetContentsNullOffer();
3491}
3492
deadbeef953c2ce2017-01-09 14:53:41 -08003493TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003494 Base::TestSetContentsRtcpMux();
3495}
3496
deadbeef953c2ce2017-01-09 14:53:41 -08003497TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003498 Base::TestStreams();
3499}
3500
deadbeef953c2ce2017-01-09 14:53:41 -08003501TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003502 Base::TestChangeStreamParamsInContent();
3503}
3504
deadbeef953c2ce2017-01-09 14:53:41 -08003505TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003506 Base::TestPlayoutAndSendingStates();
3507}
3508
deadbeef953c2ce2017-01-09 14:53:41 -08003509TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003510 Base::TestMediaContentDirection();
3511}
3512
deadbeef953c2ce2017-01-09 14:53:41 -08003513TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003514 Base::TestCallSetup();
3515}
3516
deadbeef953c2ce2017-01-09 14:53:41 -08003517TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003518 Base::TestCallTeardownRtcpMux();
3519}
3520
zstein56162b92017-04-24 16:54:35 -07003521TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3522 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003523}
3524
zstein56162b92017-04-24 16:54:35 -07003525TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3526 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003527}
3528
deadbeef953c2ce2017-01-09 14:53:41 -08003529TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003530 Base::SendRtpToRtp();
3531}
3532
deadbeef953c2ce2017-01-09 14:53:41 -08003533TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003534 Base::SendRtcpToRtcp();
3535}
3536
deadbeef953c2ce2017-01-09 14:53:41 -08003537TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003538 Base::SendRtcpMuxToRtcp();
3539}
3540
deadbeef953c2ce2017-01-09 14:53:41 -08003541TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003542 Base::SendRtcpMuxToRtcpMux();
3543}
3544
deadbeef953c2ce2017-01-09 14:53:41 -08003545TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003546 Base::SendEarlyRtcpMuxToRtcp();
3547}
3548
deadbeef953c2ce2017-01-09 14:53:41 -08003549TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003550 Base::SendEarlyRtcpMuxToRtcpMux();
3551}
3552
deadbeef953c2ce2017-01-09 14:53:41 -08003553TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003554 Base::SendSrtpToSrtp();
3555}
3556
deadbeef953c2ce2017-01-09 14:53:41 -08003557TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003558 Base::SendSrtpToSrtp();
3559}
3560
deadbeef953c2ce2017-01-09 14:53:41 -08003561TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003562 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3563}
3564
deadbeef953c2ce2017-01-09 14:53:41 -08003565TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003566 Base::SendRtpToRtpOnThread();
3567}
3568
deadbeef953c2ce2017-01-09 14:53:41 -08003569TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003570 Base::SendSrtpToSrtpOnThread();
3571}
3572
deadbeef953c2ce2017-01-09 14:53:41 -08003573TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003574 Base::SendWithWritabilityLoss();
3575}
3576
deadbeef953c2ce2017-01-09 14:53:41 -08003577TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003578 Base::TestMediaMonitor();
3579}
3580
Steve Anton8a63f782017-10-23 13:08:53 -07003581TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3582 Base::SocketOptionsMergedOnSetTransport();
3583}
3584
deadbeef953c2ce2017-01-09 14:53:41 -08003585TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003586 CreateChannels(0, 0);
3587 EXPECT_TRUE(SendInitiate());
3588 EXPECT_TRUE(SendAccept());
3589
3590 cricket::SendDataParams params;
3591 params.ssrc = 42;
3592 unsigned char data[] = {
3593 'f', 'o', 'o'
3594 };
jbaucheec21bd2016-03-20 06:15:43 -07003595 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003596 cricket::SendDataResult result;
3597 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3598 EXPECT_EQ(params.ssrc,
3599 media_channel1_->last_sent_data_params().ssrc);
3600 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3601}
3602
deadbeefbad5dad2017-01-17 18:32:35 -08003603#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3604
3605// Verifies some DCHECKs are in place.
3606// Uses VoiceChannel, but any BaseChannel subclass would work.
3607class BaseChannelDeathTest : public testing::Test {
3608 public:
3609 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003610 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3611 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3612 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003613 voice_channel_(rtc::Thread::Current(),
3614 rtc::Thread::Current(),
3615 rtc::Thread::Current(),
3616 &fake_media_engine_,
3617 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3618 nullptr,
3619 cricket::AudioOptions()),
3620 cricket::CN_AUDIO,
3621 false,
3622 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003623
3624 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003625 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003626 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3627 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003628 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003629};
3630
deadbeeff5346592017-01-24 21:51:21 -08003631TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003632 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3633 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003634 cricket::FakeDtlsTransport new_rtcp_transport(
3635 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3636 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003637}
3638
deadbeeff5346592017-01-24 21:51:21 -08003639TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003640 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3641 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003642 cricket::FakeDtlsTransport new_rtp_transport(
3643 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3644 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003645}
3646
deadbeeff5346592017-01-24 21:51:21 -08003647TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003648 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3649 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003650 // Activate RTCP muxing, simulating offer/answer negotiation.
3651 cricket::AudioContentDescription content;
3652 content.set_rtcp_mux(true);
3653 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3654 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003655 cricket::FakeDtlsTransport new_rtp_transport(
3656 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3657 cricket::FakeDtlsTransport new_rtcp_transport(
3658 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003659 // After muxing is enabled, no RTCP transport should be passed in here.
3660 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003661 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3662 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003663}
3664
3665// This test will probably go away if/when we move the transport name out of
3666// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003667TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003668 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3669 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003670 cricket::FakeDtlsTransport new_rtp_transport(
3671 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3672 cricket::FakeDtlsTransport new_rtcp_transport(
3673 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003674 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003675 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3676 "");
3677}
3678
3679// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003680// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003681TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003682 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3683 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003684 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003685 voice_channel_.SetTransports(
3686 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3687 static_cast<rtc::PacketTransportInternal*>(
3688 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003689 "");
3690}
3691
deadbeef5bd5ca32017-02-10 11:31:50 -08003692// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003693// DtlsTransportInternal.
3694TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003695 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3696 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003697 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3698 &fake_rtp_dtls_transport_),
3699 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003700}
3701
3702#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3703
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003704// TODO(pthatcher): TestSetReceiver?