blob: 7e3b45993acd2656b97f5199555a295e5353a89b [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>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010012#include <utility>
kwiberg31022942016-03-11 14:18:21 -080013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/array_view.h"
15#include "media/base/fakemediaengine.h"
16#include "media/base/fakertp.h"
17#include "media/base/mediachannel.h"
18#include "media/base/testutils.h"
19#include "p2p/base/fakecandidatepair.h"
20#include "p2p/base/fakedtlstransport.h"
21#include "p2p/base/fakepackettransport.h"
22#include "pc/channel.h"
23#include "rtc_base/buffer.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/fakeclock.h"
26#include "rtc_base/gunit.h"
27#include "rtc_base/logging.h"
28#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
zhihuangb2cdd932017-01-19 16:54:25 -080030using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080033using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080034using webrtc::SdpType;
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_,
Steve Anton3828c062017-12-06 10:34:51 -0800332 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800336 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800340 SdpType::kAnswer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800349 SdpType::kAnswer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800358 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800365 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 if (result) {
367 channel2_->Enable(true);
368 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800369 SdpType::kPrAnswer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800377 SdpType::kAnswer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800380 SdpType::kAnswer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800593 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800595 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, 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;
Steve Anton3828c062017-12-06 10:34:51 -0800606 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800623 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
624 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800626 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800628 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800638 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
639 EXPECT_TRUE(
640 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800641 // Both sides agree on mux. Should signal RTCP mux as fully activated.
642 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800644 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800648 EXPECT_TRUE(
649 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 }
653
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Test that Add/RemoveStream properly forward to the media channel.
655 void TestStreams() {
656 CreateChannels(0, 0);
657 EXPECT_TRUE(AddStream1(1));
658 EXPECT_TRUE(AddStream1(2));
659 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
660 EXPECT_TRUE(RemoveStream1(2));
661 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
662 EXPECT_TRUE(RemoveStream1(1));
663 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
664 }
665
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Test that SetLocalContent and SetRemoteContent properly
667 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800668 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 void TestChangeStreamParamsInContent() {
670 cricket::StreamParams stream1;
671 stream1.groupid = "group1";
672 stream1.id = "stream1";
673 stream1.ssrcs.push_back(kSsrc1);
674 stream1.cname = "stream1_cname";
675
676 cricket::StreamParams stream2;
677 stream2.groupid = "group1";
678 stream2.id = "stream2";
679 stream2.ssrcs.push_back(kSsrc2);
680 stream2.cname = "stream2_cname";
681
682 // Setup a call where channel 1 send |stream1| to channel 2.
683 CreateChannels(0, 0);
684 typename T::Content content1;
685 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
686 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800687 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(channel1_->Enable(true));
689 EXPECT_EQ(1u, media_channel1_->send_streams().size());
690
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800693 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // Channel 2 do not send anything.
696 typename T::Content content2;
697 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800698 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_TRUE(channel2_->Enable(true));
702 EXPECT_EQ(0u, media_channel2_->send_streams().size());
703
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200704 SendCustomRtp1(kSsrc1, 0);
705 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
707
708 // Let channel 2 update the content by sending |stream2| and enable SRTP.
709 typename T::Content content3;
710 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
711 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 ASSERT_EQ(1u, media_channel2_->send_streams().size());
714 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
715
Steve Anton3828c062017-12-06 10:34:51 -0800716 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
718 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
719
720 // Channel 1 replies but stop sending stream1.
721 typename T::Content content4;
722 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800723 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
725
Steve Anton3828c062017-12-06 10:34:51 -0800726 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
728
Zhi Huangcf990f52017-09-22 12:12:30 -0700729 EXPECT_TRUE(channel1_->srtp_active());
730 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200731 SendCustomRtp2(kSsrc2, 0);
732 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
734 }
735
jbauch5869f502017-06-29 12:31:36 -0700736 enum EncryptedHeaderTestScenario {
737 // Offer/Answer are processed before DTLS completes.
738 DEFAULT,
739 // DTLS completes before any Offer/Answer have been sent.
740 DTLS_BEFORE_OFFER_ANSWER,
741 // DTLS completes after channel 2 has processed (remote) Offer and (local)
742 // Answer.
743 DTLS_AFTER_CHANNEL2_READY,
744 };
745
746 // Test that encrypted header extensions are working and can be changed when
747 // sending a new OFFER/ANSWER.
748 void TestChangeEncryptedHeaderExtensions(int flags,
749 EncryptedHeaderTestScenario scenario = DEFAULT) {
750 RTC_CHECK(scenario == 0 || (flags & DTLS));
751 struct PacketListener : public sigslot::has_slots<> {
752 PacketListener() {}
753 void OnReadPacket(rtc::PacketTransportInternal* transport,
754 const char* data, size_t size, const rtc::PacketTime& time,
755 int flags) {
756 CompareHeaderExtensions(
757 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
758 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
759 false);
760 }
761 std::vector<int> encrypted_headers;
762 } packet_listener1, packet_listener2;
763
764 cricket::StreamParams stream1;
765 stream1.groupid = "group1";
766 stream1.id = "stream1";
767 stream1.ssrcs.push_back(kSsrc1);
768 stream1.cname = "stream1_cname";
769
770 cricket::StreamParams stream2;
771 stream2.groupid = "group1";
772 stream2.id = "stream2";
773 stream2.ssrcs.push_back(kSsrc2);
774 stream2.cname = "stream2_cname";
775
776 // Use SRTP when testing encrypted extensions.
777 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
778 // Enable SDES if channel is not using DTLS.
779 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
780
781 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
782 // Make sure to use URIs that are supported for encryption.
783 cricket::RtpHeaderExtensions extensions1;
784 extensions1.push_back(
785 RtpExtension(RtpExtension::kAudioLevelUri, 10));
786 extensions1.push_back(
787 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
788
789 cricket::RtpHeaderExtensions extensions2;
790 extensions2.push_back(
791 RtpExtension(RtpExtension::kAudioLevelUri, 10));
792 extensions2.push_back(
793 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
794 extensions2.push_back(
795 RtpExtension(RtpExtension::kVideoRotationUri, 3));
796 extensions2.push_back(
797 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
798
799 // Setup a call where channel 1 send |stream1| to channel 2.
800 CreateChannels(channel_flags, channel_flags);
801 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
802 &packet_listener1, &PacketListener::OnReadPacket);
803 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
804 &packet_listener2, &PacketListener::OnReadPacket);
805
806 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
807 ConnectFakeTransports();
808 WaitForThreads();
809 }
810
811 typename T::Content content1;
812 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
813 content1.AddStream(stream1);
814 content1.set_rtp_header_extensions(extensions1);
Steve Anton3828c062017-12-06 10:34:51 -0800815 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700816 EXPECT_TRUE(channel1_->Enable(true));
817 EXPECT_EQ(1u, media_channel1_->send_streams().size());
818 packet_listener1.encrypted_headers.push_back(1);
819
Steve Anton3828c062017-12-06 10:34:51 -0800820 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700821 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
822
823 // Channel 2 sends back |stream2|.
824 typename T::Content content2;
825 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
826 content2.AddStream(stream2);
827 content2.set_rtp_header_extensions(extensions1);
Steve Anton3828c062017-12-06 10:34:51 -0800828 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700829 EXPECT_TRUE(channel2_->Enable(true));
830 EXPECT_EQ(1u, media_channel2_->send_streams().size());
831 packet_listener2.encrypted_headers.push_back(1);
832
833 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
834 ConnectFakeTransports();
835 WaitForThreads();
836 }
837
838 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
839 scenario == DTLS_AFTER_CHANNEL2_READY) {
840 // In both scenarios with partially completed Offer/Answer, sending
841 // packets from Channel 2 to Channel 1 should work.
842 SendCustomRtp2(kSsrc2, 0);
843 WaitForThreads();
844 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
845 }
846
Steve Anton3828c062017-12-06 10:34:51 -0800847 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700848 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
849
850 if (scenario == DEFAULT) {
851 ConnectFakeTransports();
852 WaitForThreads();
853 }
854
855 SendCustomRtp1(kSsrc1, 0);
856 SendCustomRtp2(kSsrc2, 0);
857 WaitForThreads();
858 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
859 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
860
861 // Let channel 2 update the encrypted header extensions.
862 typename T::Content content3;
863 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
864 content3.AddStream(stream2);
865 content3.set_rtp_header_extensions(extensions2);
Steve Anton3828c062017-12-06 10:34:51 -0800866 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700867 ASSERT_EQ(1u, media_channel2_->send_streams().size());
868 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
869 packet_listener2.encrypted_headers.clear();
870 packet_listener2.encrypted_headers.push_back(2);
871 packet_listener2.encrypted_headers.push_back(4);
872
Steve Anton3828c062017-12-06 10:34:51 -0800873 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700874 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
875 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
876
877 // Channel 1 is already sending the new encrypted extensions. These
878 // can be decrypted by channel 2. Channel 2 is still sending the old
879 // encrypted extensions (which can be decrypted by channel 1).
880
881 if (flags & DTLS) {
882 // DTLS supports updating the encrypted extensions with only the OFFER
883 // being processed. For SDES both the OFFER and ANSWER must have been
884 // processed to update encrypted extensions, so we can't check this case.
885 SendCustomRtp1(kSsrc1, 0);
886 SendCustomRtp2(kSsrc2, 0);
887 WaitForThreads();
888 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
889 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
890 }
891
892 // Channel 1 replies with the same extensions.
893 typename T::Content content4;
894 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
895 content4.AddStream(stream1);
896 content4.set_rtp_header_extensions(extensions2);
Steve Anton3828c062017-12-06 10:34:51 -0800897 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700898 EXPECT_EQ(1u, media_channel1_->send_streams().size());
899 packet_listener1.encrypted_headers.clear();
900 packet_listener1.encrypted_headers.push_back(2);
901 packet_listener1.encrypted_headers.push_back(4);
902
Steve Anton3828c062017-12-06 10:34:51 -0800903 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700904 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
905
906 SendCustomRtp1(kSsrc1, 0);
907 SendCustomRtp2(kSsrc2, 0);
908 WaitForThreads();
909 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
910 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
911 }
912
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 // Test that we only start playout and sending at the right times.
914 void TestPlayoutAndSendingStates() {
915 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200916 if (verify_playout_) {
917 EXPECT_FALSE(media_channel1_->playout());
918 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200920 if (verify_playout_) {
921 EXPECT_FALSE(media_channel2_->playout());
922 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 EXPECT_FALSE(media_channel2_->sending());
924 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200925 if (verify_playout_) {
926 EXPECT_FALSE(media_channel1_->playout());
927 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000929 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800930 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200931 if (verify_playout_) {
932 EXPECT_TRUE(media_channel1_->playout());
933 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000934 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000935 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800936 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200937 if (verify_playout_) {
938 EXPECT_FALSE(media_channel2_->playout());
939 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000941 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800942 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200943 if (verify_playout_) {
944 EXPECT_FALSE(media_channel2_->playout());
945 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800947 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200948 if (verify_playout_) {
949 EXPECT_TRUE(media_channel1_->playout());
950 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200952 if (verify_playout_) {
953 EXPECT_FALSE(media_channel2_->playout());
954 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 EXPECT_FALSE(media_channel2_->sending());
956 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200957 if (verify_playout_) {
958 EXPECT_TRUE(media_channel2_->playout());
959 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000961 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800962 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200963 if (verify_playout_) {
964 EXPECT_TRUE(media_channel1_->playout());
965 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 EXPECT_TRUE(media_channel1_->sending());
967 }
968
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969 // Test that changing the MediaContentDirection in the local and remote
970 // session description start playout and sending at the right time.
971 void TestMediaContentDirection() {
972 CreateChannels(0, 0);
973 typename T::Content content1;
974 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
975 typename T::Content content2;
976 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
977 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800978 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979
980 EXPECT_TRUE(channel1_->Enable(true));
981 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200982 if (verify_playout_) {
983 EXPECT_FALSE(media_channel1_->playout());
984 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200986 if (verify_playout_) {
987 EXPECT_FALSE(media_channel2_->playout());
988 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989 EXPECT_FALSE(media_channel2_->sending());
990
Steve Anton3828c062017-12-06 10:34:51 -0800991 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
992 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
993 EXPECT_TRUE(
994 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
995 EXPECT_TRUE(
996 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800997 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998
Peter Boström34fbfff2015-09-24 19:20:30 +0200999 if (verify_playout_) {
1000 EXPECT_TRUE(media_channel1_->playout());
1001 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001003 if (verify_playout_) {
1004 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1005 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1007
1008 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -08001009 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -08001010 EXPECT_TRUE(
1011 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
1012 EXPECT_TRUE(
1013 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014
Peter Boström34fbfff2015-09-24 19:20:30 +02001015 if (verify_playout_) {
1016 EXPECT_TRUE(media_channel1_->playout());
1017 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001019 if (verify_playout_) {
1020 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1021 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1023
1024 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -08001025 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -08001026 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
1027 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028
Peter Boström34fbfff2015-09-24 19:20:30 +02001029 if (verify_playout_) {
1030 EXPECT_TRUE(media_channel1_->playout());
1031 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001033 if (verify_playout_) {
1034 EXPECT_TRUE(media_channel2_->playout());
1035 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 EXPECT_TRUE(media_channel2_->sending());
1037 }
1038
Honghai Zhangcc411c02016-03-29 17:27:21 -07001039 // Tests that when the transport channel signals a candidate pair change
1040 // event, the media channel will receive a call on the network route change.
1041 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001042 static constexpr uint16_t kLocalNetId = 1;
1043 static constexpr uint16_t kRemoteNetId = 2;
1044 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001045 // Ipv4(20) + UDP(8).
1046 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001047
Honghai Zhangcc411c02016-03-29 17:27:21 -07001048 CreateChannels(0, 0);
1049
Honghai Zhangcc411c02016-03-29 17:27:21 -07001050 typename T::MediaChannel* media_channel1 =
1051 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001052 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001053
Zhi Huang942bc2e2017-11-13 13:26:07 -08001054 // Need to wait for the threads before calling
1055 // |set_num_network_route_changes| because the network route would be set
1056 // when creating the channel.
1057 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001058 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001059 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001060 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001061 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001062 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1063
1064 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001065 });
1066 WaitForThreads();
1067 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001068 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001069 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001070
eladalon05b07bb2017-08-24 07:40:16 -07001071 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001072 rtc::NetworkRoute network_route;
1073 network_route.connected = true;
1074 network_route.local_network_id = kLocalNetId;
1075 network_route.remote_network_id = kRemoteNetId;
1076 network_route.last_sent_packet_id = kLastPacketId;
1077 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001079 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1080
1081 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 });
1083 WaitForThreads();
1084 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001085 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001086 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001087 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001088 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001089 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001090 EXPECT_EQ(kTransportOverheadPerPacket,
1091 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001092 }
1093
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 // Test setting up a call.
1095 void TestCallSetup() {
1096 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001097 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001099 if (verify_playout_) {
1100 EXPECT_TRUE(media_channel1_->playout());
1101 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 EXPECT_FALSE(media_channel1_->sending());
1103 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001104 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_TRUE(media_channel1_->sending());
1106 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001107 if (verify_playout_) {
1108 EXPECT_TRUE(media_channel2_->playout());
1109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_TRUE(media_channel2_->sending());
1111 EXPECT_EQ(1U, media_channel2_->codecs().size());
1112 }
1113
1114 // Test that we don't crash if packets are sent during call teardown
1115 // when RTCP mux is enabled. This is a regression test against a specific
1116 // race condition that would only occur when a RTCP packet was sent during
1117 // teardown of a channel on which RTCP mux was enabled.
1118 void TestCallTeardownRtcpMux() {
1119 class LastWordMediaChannel : public T::MediaChannel {
1120 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001123 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1124 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1126 }
1127 };
Steve Anton8699a322017-11-06 15:53:33 -08001128 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1129 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(SendInitiate());
1131 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001132 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 }
1134
1135 // Send voice RTP data to the other side and ensure it gets there.
1136 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001137 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 EXPECT_TRUE(SendInitiate());
1139 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001140 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1141 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001142 SendRtp1();
1143 SendRtp2();
1144 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_TRUE(CheckRtp1());
1146 EXPECT_TRUE(CheckRtp2());
1147 EXPECT_TRUE(CheckNoRtp1());
1148 EXPECT_TRUE(CheckNoRtp2());
1149 }
1150
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001151 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001152 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001153 EXPECT_TRUE(SendInitiate());
1154 EXPECT_TRUE(SendAccept());
1155 SendRtp1();
1156 SendRtp2();
1157 SendRtcp1();
1158 SendRtcp2();
1159 // Do not wait, destroy channels.
1160 channel1_.reset(nullptr);
1161 channel2_.reset(nullptr);
1162 }
1163
deadbeefac22f702017-01-12 21:59:29 -08001164 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001166 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 EXPECT_TRUE(SendInitiate());
1168 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001169 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1170 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001171 SendRtcp1();
1172 SendRtcp2();
1173 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 EXPECT_TRUE(CheckRtcp1());
1175 EXPECT_TRUE(CheckRtcp2());
1176 EXPECT_TRUE(CheckNoRtcp1());
1177 EXPECT_TRUE(CheckNoRtcp2());
1178 }
1179
1180 // Check that RTCP is transmitted if only the initiator supports mux.
1181 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001182 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(SendInitiate());
1184 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001185 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1186 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001187 SendRtcp1();
1188 SendRtcp2();
1189 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190 EXPECT_TRUE(CheckRtcp1());
1191 EXPECT_TRUE(CheckRtcp2());
1192 EXPECT_TRUE(CheckNoRtcp1());
1193 EXPECT_TRUE(CheckNoRtcp2());
1194 }
1195
1196 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1197 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001198 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001200 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1201 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1202 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001204 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1205 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001206 SendRtp1();
1207 SendRtp2();
1208 SendRtcp1();
1209 SendRtcp2();
1210 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 EXPECT_TRUE(CheckRtp1());
1212 EXPECT_TRUE(CheckRtp2());
1213 EXPECT_TRUE(CheckNoRtp1());
1214 EXPECT_TRUE(CheckNoRtp2());
1215 EXPECT_TRUE(CheckRtcp1());
1216 EXPECT_TRUE(CheckRtcp2());
1217 EXPECT_TRUE(CheckNoRtcp1());
1218 EXPECT_TRUE(CheckNoRtcp2());
1219 }
1220
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001221 // Check that RTP and RTCP are transmitted ok when both sides
1222 // support mux and one the offerer requires mux.
1223 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001224 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001225 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001226 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1227 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001228 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001229 SendRtp1();
1230 SendRtp2();
1231 SendRtcp1();
1232 SendRtcp2();
1233 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001234 EXPECT_TRUE(CheckRtp1());
1235 EXPECT_TRUE(CheckRtp2());
1236 EXPECT_TRUE(CheckNoRtp1());
1237 EXPECT_TRUE(CheckNoRtp2());
1238 EXPECT_TRUE(CheckRtcp1());
1239 EXPECT_TRUE(CheckRtcp2());
1240 EXPECT_TRUE(CheckNoRtcp1());
1241 EXPECT_TRUE(CheckNoRtcp2());
1242 }
1243
1244 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001245 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001246 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001247 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001248 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001249 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1250 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1251 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001252 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001253 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1254 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001255 SendRtp1();
1256 SendRtp2();
1257 SendRtcp1();
1258 SendRtcp2();
1259 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001260 EXPECT_TRUE(CheckRtp1());
1261 EXPECT_TRUE(CheckRtp2());
1262 EXPECT_TRUE(CheckNoRtp1());
1263 EXPECT_TRUE(CheckNoRtp2());
1264 EXPECT_TRUE(CheckRtcp1());
1265 EXPECT_TRUE(CheckRtcp2());
1266 EXPECT_TRUE(CheckNoRtcp1());
1267 EXPECT_TRUE(CheckNoRtcp2());
1268 }
1269
1270 // Check that RTP and RTCP are transmitted ok when both sides
1271 // require mux.
1272 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001273 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001274 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001275 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1276 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001277 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001278 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001279 SendRtp1();
1280 SendRtp2();
1281 SendRtcp1();
1282 SendRtcp2();
1283 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001284 EXPECT_TRUE(CheckRtp1());
1285 EXPECT_TRUE(CheckRtp2());
1286 EXPECT_TRUE(CheckNoRtp1());
1287 EXPECT_TRUE(CheckNoRtp2());
1288 EXPECT_TRUE(CheckRtcp1());
1289 EXPECT_TRUE(CheckRtcp2());
1290 EXPECT_TRUE(CheckNoRtcp1());
1291 EXPECT_TRUE(CheckNoRtcp2());
1292 }
1293
1294 // Check that SendAccept fails if the answerer doesn't support mux
1295 // and the offerer requires it.
1296 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001297 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001298 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001299 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1300 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001301 EXPECT_FALSE(SendAccept());
1302 }
1303
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 // Check that RTCP data sent by the initiator before the accept is not muxed.
1305 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001306 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001308 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1309 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001310
1311 // RTCP can be sent before the call is accepted, if the transport is ready.
1312 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001313 SendRtcp1();
1314 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(CheckNoRtp2());
1316 EXPECT_TRUE(CheckRtcp2());
1317
1318 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001319 SendRtcp2();
1320 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001321 EXPECT_TRUE(CheckNoRtp1());
1322 EXPECT_TRUE(CheckRtcp1());
1323
1324 // Complete call setup and ensure everything is still OK.
1325 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001326 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001327 SendRtcp1();
1328 SendRtcp2();
1329 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331 EXPECT_TRUE(CheckRtcp1());
1332 }
1333
1334
1335 // Check that RTCP data is not muxed until both sides have enabled muxing,
1336 // but that we properly demux before we get the accept message, since there
1337 // is a race between RTP data and the jingle accept.
1338 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001339 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001341 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1342 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343
1344 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1345 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 SendRtcp1();
1347 WaitForThreads();
1348 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349
1350 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001351 SendRtcp2();
1352 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353 EXPECT_TRUE(CheckNoRtp1());
1354 EXPECT_TRUE(CheckRtcp1());
1355
1356 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001357 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001359 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1360 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001361 SendRtcp1();
1362 SendRtcp2();
1363 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_TRUE(CheckRtcp1());
1366 }
1367
1368 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001369 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001371 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1372 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373
deadbeefac22f702017-01-12 21:59:29 -08001374 int flags1 = SECURE | flags1_in;
1375 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 bool dtls1 = !!(flags1_in & DTLS);
1377 bool dtls2 = !!(flags2_in & DTLS);
1378 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001379 EXPECT_FALSE(channel1_->srtp_active());
1380 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001382 WaitForThreads();
1383 EXPECT_TRUE(channel1_->writable());
1384 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001385 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001386 EXPECT_TRUE(channel1_->srtp_active());
1387 EXPECT_TRUE(channel2_->srtp_active());
1388 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1389 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 SendRtp1();
1391 SendRtp2();
1392 SendRtcp1();
1393 SendRtcp2();
1394 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395 EXPECT_TRUE(CheckRtp1());
1396 EXPECT_TRUE(CheckRtp2());
1397 EXPECT_TRUE(CheckNoRtp1());
1398 EXPECT_TRUE(CheckNoRtp2());
1399 EXPECT_TRUE(CheckRtcp1());
1400 EXPECT_TRUE(CheckRtcp2());
1401 EXPECT_TRUE(CheckNoRtcp1());
1402 EXPECT_TRUE(CheckNoRtcp2());
1403 }
1404
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001405 // Test that the DTLS to SDES fallback is not supported and the negotiation
1406 // between DTLS to SDES end points will fail.
1407 void SendDtlsToSdesNotSupported() {
1408 int flags1 = SECURE | DTLS;
1409 int flags2 = SECURE;
1410 CreateChannels(flags1, flags2);
1411 EXPECT_FALSE(channel1_->srtp_active());
1412 EXPECT_FALSE(channel2_->srtp_active());
1413 EXPECT_FALSE(SendInitiate());
1414 }
1415
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416 // Test that we properly handling SRTP negotiating down to RTP.
1417 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001418 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001419 EXPECT_FALSE(channel1_->srtp_active());
1420 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421 EXPECT_TRUE(SendInitiate());
1422 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001423 EXPECT_FALSE(channel1_->srtp_active());
1424 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001425 SendRtp1();
1426 SendRtp2();
1427 SendRtcp1();
1428 SendRtcp2();
1429 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 EXPECT_TRUE(CheckRtp1());
1431 EXPECT_TRUE(CheckRtp2());
1432 EXPECT_TRUE(CheckNoRtp1());
1433 EXPECT_TRUE(CheckNoRtp2());
1434 EXPECT_TRUE(CheckRtcp1());
1435 EXPECT_TRUE(CheckRtcp2());
1436 EXPECT_TRUE(CheckNoRtcp1());
1437 EXPECT_TRUE(CheckNoRtcp2());
1438 }
1439
1440 // Test that we can send and receive early media when a provisional answer is
1441 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1442 void SendEarlyMediaUsingRtcpMuxSrtp() {
1443 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1444
deadbeefac22f702017-01-12 21:59:29 -08001445 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1446 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_TRUE(SendOffer());
1448 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001449 EXPECT_TRUE(channel1_->srtp_active());
1450 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001451 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1452 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001453 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1454 SendCustomRtcp1(kSsrc1);
1455 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1456 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1459
1460 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001461 SendCustomRtcp2(kSsrc2);
1462 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1463 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1466
1467 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001468 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1469 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001471 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1472 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1473 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1474 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001475 EXPECT_TRUE(channel1_->srtp_active());
1476 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001477 SendCustomRtcp1(kSsrc1);
1478 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1479 SendCustomRtcp2(kSsrc2);
1480 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1481 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001485 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1486 }
1487
1488 // Test that we properly send RTP without SRTP from a thread.
1489 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001490 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(SendInitiate());
1492 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1494 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1495 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1496 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1497 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1498 send_rtcp1.thread(),
1499 send_rtcp2.thread()};
1500 WaitForThreads(involved_threads);
1501 EXPECT_TRUE(CheckRtp1());
1502 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 EXPECT_TRUE(CheckNoRtp1());
1504 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001505 EXPECT_TRUE(CheckRtcp1());
1506 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507 EXPECT_TRUE(CheckNoRtcp1());
1508 EXPECT_TRUE(CheckNoRtcp2());
1509 }
1510
1511 // Test that we properly send SRTP with RTCP from a thread.
1512 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001513 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_TRUE(SendInitiate());
1515 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001516 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1517 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1518 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1519 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1520 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1521 send_rtcp1.thread(),
1522 send_rtcp2.thread()};
1523 WaitForThreads(involved_threads);
1524 EXPECT_TRUE(CheckRtp1());
1525 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 EXPECT_TRUE(CheckNoRtp1());
1527 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001528 EXPECT_TRUE(CheckRtcp1());
1529 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 EXPECT_TRUE(CheckNoRtcp1());
1531 EXPECT_TRUE(CheckNoRtcp2());
1532 }
1533
1534 // Test that the mediachannel retains its sending state after the transport
1535 // becomes non-writable.
1536 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001537 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538 EXPECT_TRUE(SendInitiate());
1539 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001540 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1541 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542 SendRtp1();
1543 SendRtp2();
1544 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545 EXPECT_TRUE(CheckRtp1());
1546 EXPECT_TRUE(CheckRtp2());
1547 EXPECT_TRUE(CheckNoRtp1());
1548 EXPECT_TRUE(CheckNoRtp2());
1549
wu@webrtc.org97077a32013-10-25 21:18:33 +00001550 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001551 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1552 fake_rtp_dtls_transport1_->SetWritable(false);
1553 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001554 SendRtp1();
1555 SendRtp2();
1556 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557 EXPECT_TRUE(CheckRtp1());
1558 EXPECT_TRUE(CheckNoRtp2());
1559
1560 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001561 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1562 fake_rtp_dtls_transport1_->SetWritable(true);
1563 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001565 SendRtp1();
1566 SendRtp2();
1567 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 EXPECT_TRUE(CheckRtp1());
1569 EXPECT_TRUE(CheckRtp2());
1570 EXPECT_TRUE(CheckNoRtp1());
1571 EXPECT_TRUE(CheckNoRtp2());
1572
1573 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001574 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1575 bool asymmetric = true;
1576 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1577 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 EXPECT_TRUE(media_channel1_->sending());
1579
wu@webrtc.org97077a32013-10-25 21:18:33 +00001580 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001581 SendRtp1();
1582 SendRtp2();
1583 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584 EXPECT_TRUE(CheckRtp1());
1585 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001586 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587
1588 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001589 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001590 bool asymmetric = true;
1591 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1592 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001593 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001595 SendRtp1();
1596 SendRtp2();
1597 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 EXPECT_TRUE(CheckRtp1());
1599 EXPECT_TRUE(CheckRtp2());
1600 EXPECT_TRUE(CheckNoRtp1());
1601 EXPECT_TRUE(CheckNoRtp2());
1602 }
1603
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001604 void SendBundleToBundle(
1605 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1606 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001608 // Only pl_type1 was added to the bundle filter for both |channel1_|
1609 // and |channel2_|.
1610 int pl_type1 = pl_types[0];
1611 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001612 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001613 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001614 if (rtcp_mux) {
1615 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001616 }
1617 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001619 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1620 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001622 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1623 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001624 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1625 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1626 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1627 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001628
1629 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1631 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1632 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001633 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001634 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1635 EXPECT_TRUE(CheckNoRtp1());
1636 EXPECT_TRUE(CheckNoRtp2());
1637
1638 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1640 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1641 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001642 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001643 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645 SendCustomRtcp1(kSsrc1);
1646 SendCustomRtcp2(kSsrc2);
1647 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1649 EXPECT_TRUE(CheckNoRtcp1());
1650 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1651 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653 SendCustomRtcp1(kSsrc2);
1654 SendCustomRtcp2(kSsrc1);
1655 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001656 // Bundle filter shouldn't filter out any RTCP.
1657 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1658 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 }
1660
deadbeefc6b6e092016-12-01 12:49:20 -08001661 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 CreateChannels(0, 0);
1664 EXPECT_TRUE(SendInitiate());
1665 EXPECT_TRUE(SendAccept());
1666 channel1_->StartMediaMonitor(100);
1667 channel2_->StartMediaMonitor(100);
1668 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001669 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1670 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 channel1_->StopMediaMonitor();
1672 channel2_->StopMediaMonitor();
1673 // Ensure a restart of a stopped monitor works.
1674 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001675 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 channel1_->StopMediaMonitor();
1677 // Ensure stopping a stopped monitor is OK.
1678 channel1_->StopMediaMonitor();
1679 }
1680
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 void TestSetContentFailure() {
1682 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683
Peter Thatchera6d24442015-07-09 21:26:36 -07001684 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001685 std::unique_ptr<typename T::Content> content(
1686 CreateMediaContentWithStream(1));
1687
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001689 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001690 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001691 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001692 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001695 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001696 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001697
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001699 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001700 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 }
1702
1703 void TestSendTwoOffers() {
1704 CreateChannels(0, 0);
1705
Peter Thatchera6d24442015-07-09 21:26:36 -07001706 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001707 std::unique_ptr<typename T::Content> content1(
1708 CreateMediaContentWithStream(1));
1709 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001710 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1712
Steve Anton18ee1d52017-09-11 11:32:35 -07001713 std::unique_ptr<typename T::Content> content2(
1714 CreateMediaContentWithStream(2));
1715 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001716 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1718 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1719 }
1720
1721 void TestReceiveTwoOffers() {
1722 CreateChannels(0, 0);
1723
Peter Thatchera6d24442015-07-09 21:26:36 -07001724 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001725 std::unique_ptr<typename T::Content> content1(
1726 CreateMediaContentWithStream(1));
1727 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001728 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1730
Steve Anton18ee1d52017-09-11 11:32:35 -07001731 std::unique_ptr<typename T::Content> content2(
1732 CreateMediaContentWithStream(2));
1733 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001734 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1736 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1737 }
1738
1739 void TestSendPrAnswer() {
1740 CreateChannels(0, 0);
1741
Peter Thatchera6d24442015-07-09 21:26:36 -07001742 std::string err;
1743 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001744 std::unique_ptr<typename T::Content> content1(
1745 CreateMediaContentWithStream(1));
1746 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001747 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1749
Peter Thatchera6d24442015-07-09 21:26:36 -07001750 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001751 std::unique_ptr<typename T::Content> content2(
1752 CreateMediaContentWithStream(2));
1753 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001754 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1756 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1757
Peter Thatchera6d24442015-07-09 21:26:36 -07001758 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001759 std::unique_ptr<typename T::Content> content3(
1760 CreateMediaContentWithStream(3));
1761 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001762 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1764 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1765 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1766 }
1767
1768 void TestReceivePrAnswer() {
1769 CreateChannels(0, 0);
1770
Peter Thatchera6d24442015-07-09 21:26:36 -07001771 std::string err;
1772 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001773 std::unique_ptr<typename T::Content> content1(
1774 CreateMediaContentWithStream(1));
1775 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001776 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1778
Peter Thatchera6d24442015-07-09 21:26:36 -07001779 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001780 std::unique_ptr<typename T::Content> content2(
1781 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001782 EXPECT_TRUE(
1783 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1785 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1786
Peter Thatchera6d24442015-07-09 21:26:36 -07001787 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001788 std::unique_ptr<typename T::Content> content3(
1789 CreateMediaContentWithStream(3));
1790 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001791 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1793 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1794 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1795 }
1796
1797 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001798 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 EXPECT_TRUE(SendInitiate());
1800 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001801 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1802 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803
1804 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001805 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 // The sending message is only posted. channel2_ should be empty.
1807 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1809 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810
1811 // When channel1_ is deleted, the RTCP packet should be sent out to
1812 // channel2_.
1813 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 EXPECT_TRUE(CheckRtcp2());
1816 }
1817
zstein56162b92017-04-24 16:54:35 -07001818 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001819 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821
zstein56162b92017-04-24 16:54:35 -07001822 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 EXPECT_TRUE(media_channel1_->ready_to_send());
1825
zstein56162b92017-04-24 16:54:35 -07001826 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 }
1830
zstein56162b92017-04-24 16:54:35 -07001831 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001832 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 typename T::Content content;
1834 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001835 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08001837 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001838 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -08001839 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001840 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1841 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 EXPECT_FALSE(media_channel1_->ready_to_send());
1843 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1844 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001845 network_thread_->Invoke<void>(RTC_FROM_HERE,
1846 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849
zstein56162b92017-04-24 16:54:35 -07001850 // TODO(zstein): Find a way to test this without making
1851 // OnTransportReadyToSend public.
1852 network_thread_->Invoke<void>(
1853 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001854 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 EXPECT_FALSE(media_channel1_->ready_to_send());
1856 }
1857
skvladdc1c62c2016-03-16 19:07:43 -07001858 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1859 typename T::Content content;
1860 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1861 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001862 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001863 }
1864
deadbeefe702b302017-02-04 12:09:01 -08001865 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001866 webrtc::RtpParameters parameters;
1867 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001868 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001869 parameters.encodings.push_back(encoding);
1870 return parameters;
1871 }
1872
1873 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001874 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001875 EXPECT_EQ(1UL, parameters.encodings.size());
1876 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1877 }
1878
1879 void DefaultMaxBitrateIsUnlimited() {
1880 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001881 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1882 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001883 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001884 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001885 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001886 }
1887
Steve Anton8a63f782017-10-23 13:08:53 -07001888 // Test that when a channel gets new transports with a call to
1889 // |SetTransports|, the socket options from the old transports are merged with
1890 // the options on the new transport.
1891 // For example, audio and video may use separate socket options, but initially
1892 // be unbundled, then later become bundled. When this happens, their preferred
1893 // socket options should be merged to the underlying transport they share.
1894 void SocketOptionsMergedOnSetTransport() {
1895 constexpr int kSndBufSize = 4000;
1896 constexpr int kRcvBufSize = 8000;
1897
1898 CreateChannels(0, 0);
1899
1900 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1901 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1902 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1903 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1904
1905 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1906 channel2_->rtcp_dtls_transport());
1907
1908 int option_val;
1909 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1910 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1911 EXPECT_EQ(kSndBufSize, option_val);
1912 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1913 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1914 EXPECT_EQ(kRcvBufSize, option_val);
1915 }
1916
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1919 static void ProcessThreadQueue(rtc::Thread* thread) {
1920 RTC_DCHECK(thread->IsCurrent());
1921 while (!thread->empty()) {
1922 thread->ProcessMessages(0);
1923 }
1924 }
1925 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1926 // |threads| and current thread post packets to network thread.
1927 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001928 thread->Invoke<void>(RTC_FROM_HERE,
1929 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930 }
1931 ProcessThreadQueue(rtc::Thread::Current());
1932 // Network thread move them around and post back to worker = current thread.
1933 if (!network_thread_->IsCurrent()) {
1934 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001935 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001936 }
1937 // Worker thread = current Thread process received messages.
1938 ProcessThreadQueue(rtc::Thread::Current());
1939 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001940 // TODO(pbos): Remove playout from all media channels and let renderers mute
1941 // themselves.
1942 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1944 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001945 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1946 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1947 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1948 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1949 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1950 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1951 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1952 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953 cricket::FakeMediaEngine media_engine_;
1954 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001955 typename T::MediaChannel* media_channel1_ = nullptr;
1956 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001957 std::unique_ptr<typename T::Channel> channel1_;
1958 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 typename T::Content local_media_content1_;
1960 typename T::Content local_media_content2_;
1961 typename T::Content remote_media_content1_;
1962 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001964 rtc::Buffer rtp_packet_;
1965 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001966 int media_info_callbacks1_ = 0;
1967 int media_info_callbacks2_ = 0;
1968 int rtcp_mux_activated_callbacks1_ = 0;
1969 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001970 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971};
1972
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973template<>
1974void ChannelTest<VoiceTraits>::CreateContent(
1975 int flags,
1976 const cricket::AudioCodec& audio_codec,
1977 const cricket::VideoCodec& video_codec,
1978 cricket::AudioContentDescription* audio) {
1979 audio->AddCodec(audio_codec);
1980 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001981 if ((flags & SECURE) && !(flags & DTLS)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001983 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1984 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 }
1986}
1987
1988template<>
1989void ChannelTest<VoiceTraits>::CopyContent(
1990 const cricket::AudioContentDescription& source,
1991 cricket::AudioContentDescription* audio) {
1992 *audio = source;
1993}
1994
1995template<>
1996bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1997 const cricket::AudioCodec& c2) {
1998 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1999 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2000}
2001
Peter Boström0c4e06b2015-10-07 12:23:21 +02002002template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002004 uint32_t ssrc,
2005 int flags,
2006 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 audio->AddLegacyStream(ssrc);
2008}
2009
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002010class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 public:
solenberg1dd98f32015-09-10 01:57:14 -07002012 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002013 VoiceChannelSingleThreadTest()
2014 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2015};
2016
2017class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2018 public:
2019 typedef ChannelTest<VoiceTraits> Base;
2020 VoiceChannelDoubleThreadTest()
2021 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022};
2023
jbauch5869f502017-06-29 12:31:36 -07002024class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2025 : public ChannelTest<VoiceTraits> {
2026 public:
2027 typedef ChannelTest<VoiceTraits> Base;
2028 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2029 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2030 NetworkIsWorker::Yes) {}
2031};
2032
2033class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2034 : public ChannelTest<VoiceTraits> {
2035 public:
2036 typedef ChannelTest<VoiceTraits> Base;
2037 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2038 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2039 NetworkIsWorker::No) {}
2040};
2041
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002042// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002043template <>
Steve Anton8699a322017-11-06 15:53:33 -08002044std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002045 rtc::Thread* worker_thread,
2046 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002047 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002048 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002049 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2050 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002051 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2052 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002053 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002054 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002055 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2056 worker_thread, network_thread, signaling_thread, std::move(ch),
2057 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2058 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002059 if (!channel->NeedsRtcpTransport()) {
2060 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002061 }
Steve Anton8699a322017-11-06 15:53:33 -08002062 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2063 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 return channel;
2065}
2066
2067// override to add 0 parameter
2068template<>
2069bool ChannelTest<VideoTraits>::AddStream1(int id) {
2070 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2071}
2072
2073template<>
2074void ChannelTest<VideoTraits>::CreateContent(
2075 int flags,
2076 const cricket::AudioCodec& audio_codec,
2077 const cricket::VideoCodec& video_codec,
2078 cricket::VideoContentDescription* video) {
2079 video->AddCodec(video_codec);
2080 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2081 if (flags & SECURE) {
2082 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002083 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2084 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002085 }
2086}
2087
2088template<>
2089void ChannelTest<VideoTraits>::CopyContent(
2090 const cricket::VideoContentDescription& source,
2091 cricket::VideoContentDescription* video) {
2092 *video = source;
2093}
2094
2095template<>
2096bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2097 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002098 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002099}
2100
Peter Boström0c4e06b2015-10-07 12:23:21 +02002101template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002103 uint32_t ssrc,
2104 int flags,
2105 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106 video->AddLegacyStream(ssrc);
2107}
2108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110 public:
solenberg1dd98f32015-09-10 01:57:14 -07002111 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002112 VideoChannelSingleThreadTest()
2113 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114};
2115
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002116class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2117 public:
2118 typedef ChannelTest<VideoTraits> Base;
2119 VideoChannelDoubleThreadTest()
2120 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2121};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002123TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124 Base::TestInit();
2125 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2126 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2127}
2128
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002129TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2130 Base::TestDeinit();
2131}
2132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002133TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 Base::TestSetContents();
2135}
2136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002137TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002138 Base::TestSetContentsNullOffer();
2139}
2140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002141TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 Base::TestSetContentsRtcpMux();
2143}
2144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002145TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146 Base::TestSetContentsRtcpMux();
2147}
2148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 Base::TestStreams();
2151}
2152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002153TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002154 Base::TestChangeStreamParamsInContent();
2155}
2156
jbauch5869f502017-06-29 12:31:36 -07002157TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2158 TestChangeEncryptedHeaderExtensionsDtls) {
2159 int flags = DTLS;
2160 Base::TestChangeEncryptedHeaderExtensions(flags);
2161}
2162
2163TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2164 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2165 int flags = DTLS;
2166 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2167}
2168
2169TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2170 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2171 int flags = DTLS;
2172 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2173}
2174
2175TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2176 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2177 int flags = DTLS | GCM_CIPHER;
2178 Base::TestChangeEncryptedHeaderExtensions(flags);
2179}
2180
2181TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2182 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2183 int flags = DTLS | GCM_CIPHER;
2184 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2185}
2186
2187TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2188 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2189 int flags = DTLS | GCM_CIPHER;
2190 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2191}
2192
2193TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2194 TestChangeEncryptedHeaderExtensionsSDES) {
2195 int flags = 0;
2196 Base::TestChangeEncryptedHeaderExtensions(flags);
2197}
2198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002199TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 Base::TestPlayoutAndSendingStates();
2201}
2202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002204 CreateChannels(0, 0);
2205 // Test that we can Mute the default channel even though the sending SSRC
2206 // is unknown.
2207 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002208 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002209 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2210 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002211 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2212
2213 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002214 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002215
2216 SendInitiate();
2217 // After the local session description has been set, we can mute a stream
2218 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002219 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002220 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2221 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002222 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002223}
2224
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002225TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226 Base::TestMediaContentDirection();
2227}
2228
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002229TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002230 Base::TestNetworkRouteChanges();
2231}
2232
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002233TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002234 Base::TestCallSetup();
2235}
2236
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002237TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238 Base::TestCallTeardownRtcpMux();
2239}
2240
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242 Base::SendRtpToRtp();
2243}
2244
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 Base::SendRtcpToRtcp();
2247}
2248
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002249TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 Base::SendRtcpMuxToRtcp();
2251}
2252
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002253TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254 Base::SendRtcpMuxToRtcpMux();
2255}
2256
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002257TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002258 Base::SendRequireRtcpMuxToRtcpMux();
2259}
2260
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002262 Base::SendRtcpMuxToRequireRtcpMux();
2263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002266 Base::SendRequireRtcpMuxToRequireRtcpMux();
2267}
2268
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002270 Base::SendRequireRtcpMuxToNoRtcpMux();
2271}
2272
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002274 Base::SendEarlyRtcpMuxToRtcp();
2275}
2276
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002277TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 Base::SendEarlyRtcpMuxToRtcpMux();
2279}
2280
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002281TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286 Base::SendSrtpToSrtp();
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2291}
2292
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002293TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002294 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295}
2296
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 Base::SendSrtpToSrtp(DTLS, DTLS);
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2303}
2304
deadbeeff5346592017-01-24 21:51:21 -08002305// Test using the channel with a raw packet interface, as opposed to a DTLS
2306// transport interface.
2307TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2308 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2309}
2310
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002311TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2313}
2314
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002315TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 Base::SendRtpToRtpOnThread();
2317}
2318
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002319TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320 Base::SendSrtpToSrtpOnThread();
2321}
2322
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324 Base::SendWithWritabilityLoss();
2325}
2326
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002328 Base::TestMediaMonitor();
2329}
2330
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002331TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332 Base::TestSetContentFailure();
2333}
2334
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002335TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 Base::TestSendTwoOffers();
2337}
2338
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002339TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 Base::TestReceiveTwoOffers();
2341}
2342
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002343TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 Base::TestSendPrAnswer();
2345}
2346
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002347TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348 Base::TestReceivePrAnswer();
2349}
2350
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002351TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 Base::TestFlushRtcp();
2353}
2354
zstein56162b92017-04-24 16:54:35 -07002355TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2356 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357}
2358
zstein56162b92017-04-24 16:54:35 -07002359TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2360 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361}
2362
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002363TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002364 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365}
2366
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002367TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002368 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002369}
2370
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002371TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002372 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002373}
2374
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002376 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377}
2378
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002379TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002380 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002381}
2382
Steve Anton8a63f782017-10-23 13:08:53 -07002383TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2384 Base::SocketOptionsMergedOnSetTransport();
2385}
2386
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002387// VoiceChannelDoubleThreadTest
2388TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002390 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2391 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392}
2393
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002394TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2395 Base::TestDeinit();
2396}
2397
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002398TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399 Base::TestSetContents();
2400}
2401
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002402TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403 Base::TestSetContentsNullOffer();
2404}
2405
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002406TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407 Base::TestSetContentsRtcpMux();
2408}
2409
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002410TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 Base::TestSetContentsRtcpMux();
2412}
2413
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002414TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415 Base::TestStreams();
2416}
2417
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002418TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419 Base::TestChangeStreamParamsInContent();
2420}
2421
jbauch5869f502017-06-29 12:31:36 -07002422TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2423 TestChangeEncryptedHeaderExtensionsDtls) {
2424 int flags = DTLS;
2425 Base::TestChangeEncryptedHeaderExtensions(flags);
2426}
2427
2428TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2429 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2430 int flags = DTLS;
2431 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2432}
2433
2434TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2435 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2436 int flags = DTLS;
2437 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2438}
2439
2440TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2441 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2442 int flags = DTLS | GCM_CIPHER;
2443 Base::TestChangeEncryptedHeaderExtensions(flags);
2444}
2445
2446TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2447 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2448 int flags = DTLS | GCM_CIPHER;
2449 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2450}
2451
2452TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2453 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2454 int flags = DTLS | GCM_CIPHER;
2455 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2456}
2457
2458TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2459 TestChangeEncryptedHeaderExtensionsSDES) {
2460 int flags = 0;
2461 Base::TestChangeEncryptedHeaderExtensions(flags);
2462}
2463
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002464TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 Base::TestPlayoutAndSendingStates();
2466}
2467
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002468TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2469 CreateChannels(0, 0);
2470 // Test that we can Mute the default channel even though the sending SSRC
2471 // is unknown.
2472 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2473 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2474 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2475 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2476 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2477
2478 // Test that we can not mute an unknown SSRC.
2479 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2480
2481 SendInitiate();
2482 // After the local session description has been set, we can mute a stream
2483 // with its SSRC.
2484 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2485 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2486 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2487 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2488}
2489
2490TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2491 Base::TestMediaContentDirection();
2492}
2493
2494TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2495 Base::TestNetworkRouteChanges();
2496}
2497
2498TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2499 Base::TestCallSetup();
2500}
2501
2502TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2503 Base::TestCallTeardownRtcpMux();
2504}
2505
2506TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2507 Base::SendRtpToRtp();
2508}
2509
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002510TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2511 Base::SendRtcpToRtcp();
2512}
2513
2514TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2515 Base::SendRtcpMuxToRtcp();
2516}
2517
2518TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2519 Base::SendRtcpMuxToRtcpMux();
2520}
2521
2522TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2523 Base::SendRequireRtcpMuxToRtcpMux();
2524}
2525
2526TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2527 Base::SendRtcpMuxToRequireRtcpMux();
2528}
2529
2530TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2531 Base::SendRequireRtcpMuxToRequireRtcpMux();
2532}
2533
2534TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2535 Base::SendRequireRtcpMuxToNoRtcpMux();
2536}
2537
2538TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2539 Base::SendEarlyRtcpMuxToRtcp();
2540}
2541
2542TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2543 Base::SendEarlyRtcpMuxToRtcpMux();
2544}
2545
2546TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2547 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2548}
2549
2550TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2551 Base::SendSrtpToSrtp();
2552}
2553
2554TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2555 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2556}
2557
2558TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002559 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002560}
2561
2562TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002563 Base::SendSrtpToSrtp(DTLS, DTLS);
2564}
2565
2566TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002567 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2568}
2569
deadbeeff5346592017-01-24 21:51:21 -08002570// Test using the channel with a raw packet interface, as opposed to a DTLS
2571// transport interface.
2572TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2573 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2574}
2575
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002576TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2577 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2578}
2579
2580TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2581 Base::SendRtpToRtpOnThread();
2582}
2583
2584TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2585 Base::SendSrtpToSrtpOnThread();
2586}
2587
2588TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2589 Base::SendWithWritabilityLoss();
2590}
2591
2592TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2593 Base::TestMediaMonitor();
2594}
2595
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002596TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2597 Base::TestSetContentFailure();
2598}
2599
2600TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2601 Base::TestSendTwoOffers();
2602}
2603
2604TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2605 Base::TestReceiveTwoOffers();
2606}
2607
2608TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2609 Base::TestSendPrAnswer();
2610}
2611
2612TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2613 Base::TestReceivePrAnswer();
2614}
2615
2616TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2617 Base::TestFlushRtcp();
2618}
2619
zstein56162b92017-04-24 16:54:35 -07002620TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2621 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002622}
2623
zstein56162b92017-04-24 16:54:35 -07002624TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2625 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002626}
2627
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002628TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2629 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2630}
2631
2632TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2633 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2634}
2635
2636TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2637 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2638}
2639
2640TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2641 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2642}
2643
2644TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2645 Base::DefaultMaxBitrateIsUnlimited();
2646}
2647
Steve Anton8a63f782017-10-23 13:08:53 -07002648TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2649 Base::SocketOptionsMergedOnSetTransport();
2650}
2651
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002652// VideoChannelSingleThreadTest
2653TEST_F(VideoChannelSingleThreadTest, TestInit) {
2654 Base::TestInit();
2655}
2656
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002657TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2658 Base::TestDeinit();
2659}
2660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002661TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2662 Base::TestSetContents();
2663}
2664
2665TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2666 Base::TestSetContentsNullOffer();
2667}
2668
2669TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2670 Base::TestSetContentsRtcpMux();
2671}
2672
2673TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2674 Base::TestSetContentsRtcpMux();
2675}
2676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002677TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2678 Base::TestStreams();
2679}
2680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002681TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2682 Base::TestChangeStreamParamsInContent();
2683}
2684
2685TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2686 Base::TestPlayoutAndSendingStates();
2687}
2688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002689TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 Base::TestMediaContentDirection();
2691}
2692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002693TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002694 Base::TestNetworkRouteChanges();
2695}
2696
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002697TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698 Base::TestCallSetup();
2699}
2700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002701TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 Base::TestCallTeardownRtcpMux();
2703}
2704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002705TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 Base::SendRtpToRtp();
2707}
2708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002709TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710 Base::SendRtcpToRtcp();
2711}
2712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002713TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 Base::SendRtcpMuxToRtcp();
2715}
2716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002717TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 Base::SendRtcpMuxToRtcpMux();
2719}
2720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002721TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002722 Base::SendRequireRtcpMuxToRtcpMux();
2723}
2724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002725TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002726 Base::SendRtcpMuxToRequireRtcpMux();
2727}
2728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002729TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002730 Base::SendRequireRtcpMuxToRequireRtcpMux();
2731}
2732
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002733TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002734 Base::SendRequireRtcpMuxToNoRtcpMux();
2735}
2736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002737TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002738 Base::SendEarlyRtcpMuxToRtcp();
2739}
2740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002741TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742 Base::SendEarlyRtcpMuxToRtcpMux();
2743}
2744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002745TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 Base::SendSrtpToSrtp();
2747}
2748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002749TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002750 Base::SendSrtpToSrtp();
2751}
2752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002753TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002754 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755}
2756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002757TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 Base::SendSrtpToSrtp(DTLS, DTLS);
2759}
2760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002761TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2763}
2764
deadbeeff5346592017-01-24 21:51:21 -08002765// Test using the channel with a raw packet interface, as opposed to a DTLS
2766// transport interface.
2767TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2768 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2769}
2770
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002771TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002772 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2773}
2774
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002775TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2777}
2778
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002779TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 Base::SendRtpToRtpOnThread();
2781}
2782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002783TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002784 Base::SendSrtpToSrtpOnThread();
2785}
2786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002787TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 Base::SendWithWritabilityLoss();
2789}
2790
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002791TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002792 Base::TestMediaMonitor();
2793}
2794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002795TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 Base::TestSetContentFailure();
2797}
2798
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002799TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 Base::TestSendTwoOffers();
2801}
2802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002803TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804 Base::TestReceiveTwoOffers();
2805}
2806
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002807TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 Base::TestSendPrAnswer();
2809}
2810
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002811TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 Base::TestReceivePrAnswer();
2813}
2814
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002815TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 Base::TestFlushRtcp();
2817}
2818
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002819TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002820 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821}
2822
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002823TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002824 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002825}
2826
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002827TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002828 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002829}
2830
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002831TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002832 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833}
2834
zstein56162b92017-04-24 16:54:35 -07002835TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2836 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837}
2838
zstein56162b92017-04-24 16:54:35 -07002839TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2840 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841}
2842
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002843TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002844 Base::DefaultMaxBitrateIsUnlimited();
2845}
2846
Steve Anton8a63f782017-10-23 13:08:53 -07002847TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2848 Base::SocketOptionsMergedOnSetTransport();
2849}
2850
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002851// VideoChannelDoubleThreadTest
2852TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2853 Base::TestInit();
2854}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002856TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2857 Base::TestDeinit();
2858}
2859
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002860TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2861 Base::TestSetContents();
2862}
2863
2864TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2865 Base::TestSetContentsNullOffer();
2866}
2867
2868TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2869 Base::TestSetContentsRtcpMux();
2870}
2871
2872TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2873 Base::TestSetContentsRtcpMux();
2874}
2875
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002876TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2877 Base::TestStreams();
2878}
2879
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002880TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2881 Base::TestChangeStreamParamsInContent();
2882}
2883
2884TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2885 Base::TestPlayoutAndSendingStates();
2886}
2887
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002888TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2889 Base::TestMediaContentDirection();
2890}
2891
2892TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2893 Base::TestNetworkRouteChanges();
2894}
2895
2896TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2897 Base::TestCallSetup();
2898}
2899
2900TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2901 Base::TestCallTeardownRtcpMux();
2902}
2903
2904TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2905 Base::SendRtpToRtp();
2906}
2907
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002908TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2909 Base::SendRtcpToRtcp();
2910}
2911
2912TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2913 Base::SendRtcpMuxToRtcp();
2914}
2915
2916TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2917 Base::SendRtcpMuxToRtcpMux();
2918}
2919
2920TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2921 Base::SendRequireRtcpMuxToRtcpMux();
2922}
2923
2924TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2925 Base::SendRtcpMuxToRequireRtcpMux();
2926}
2927
2928TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2929 Base::SendRequireRtcpMuxToRequireRtcpMux();
2930}
2931
2932TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2933 Base::SendRequireRtcpMuxToNoRtcpMux();
2934}
2935
2936TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2937 Base::SendEarlyRtcpMuxToRtcp();
2938}
2939
2940TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2941 Base::SendEarlyRtcpMuxToRtcpMux();
2942}
2943
2944TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
2945 Base::SendSrtpToSrtp();
2946}
2947
2948TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
2949 Base::SendSrtpToSrtp();
2950}
2951
2952TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002953 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002954}
2955
2956TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002957 Base::SendSrtpToSrtp(DTLS, DTLS);
2958}
2959
2960TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002961 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2962}
2963
deadbeeff5346592017-01-24 21:51:21 -08002964// Test using the channel with a raw packet interface, as opposed to a DTLS
2965// transport interface.
2966TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2967 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2968}
2969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002970TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
2971 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2972}
2973
2974TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2975 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2976}
2977
2978TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2979 Base::SendRtpToRtpOnThread();
2980}
2981
2982TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2983 Base::SendSrtpToSrtpOnThread();
2984}
2985
2986TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2987 Base::SendWithWritabilityLoss();
2988}
2989
2990TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
2991 Base::TestMediaMonitor();
2992}
2993
2994TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2995 Base::TestSetContentFailure();
2996}
2997
2998TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2999 Base::TestSendTwoOffers();
3000}
3001
3002TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3003 Base::TestReceiveTwoOffers();
3004}
3005
3006TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3007 Base::TestSendPrAnswer();
3008}
3009
3010TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3011 Base::TestReceivePrAnswer();
3012}
3013
3014TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3015 Base::TestFlushRtcp();
3016}
3017
3018TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3019 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3020}
3021
3022TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3023 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3024}
3025
3026TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3027 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3028}
3029
3030TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3031 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3032}
3033
zstein56162b92017-04-24 16:54:35 -07003034TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3035 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003036}
3037
zstein56162b92017-04-24 16:54:35 -07003038TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3039 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003040}
3041
3042TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3043 Base::DefaultMaxBitrateIsUnlimited();
3044}
3045
Steve Anton8a63f782017-10-23 13:08:53 -07003046TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3047 Base::SocketOptionsMergedOnSetTransport();
3048}
3049
deadbeef953c2ce2017-01-09 14:53:41 -08003050// RtpDataChannelSingleThreadTest
3051class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003052 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003053 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003054 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003055 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3056};
3057
deadbeef953c2ce2017-01-09 14:53:41 -08003058// RtpDataChannelDoubleThreadTest
3059class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003060 public:
3061 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003062 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003063 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003064};
3065
3066// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003067template <>
Steve Anton8699a322017-11-06 15:53:33 -08003068std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003069 rtc::Thread* worker_thread,
3070 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003071 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003072 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003073 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3074 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003075 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3076 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003077 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003078 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003079 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3080 worker_thread, network_thread, signaling_thread, std::move(ch),
3081 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3082 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003083 if (!channel->NeedsRtcpTransport()) {
3084 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003085 }
Steve Anton8699a322017-11-06 15:53:33 -08003086 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3087 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003088 return channel;
3089}
3090
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003091template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003092void ChannelTest<DataTraits>::CreateContent(
3093 int flags,
3094 const cricket::AudioCodec& audio_codec,
3095 const cricket::VideoCodec& video_codec,
3096 cricket::DataContentDescription* data) {
3097 data->AddCodec(kGoogleDataCodec);
3098 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3099 if (flags & SECURE) {
3100 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003101 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3102 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103 }
3104}
3105
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003106template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003107void ChannelTest<DataTraits>::CopyContent(
3108 const cricket::DataContentDescription& source,
3109 cricket::DataContentDescription* data) {
3110 *data = source;
3111}
3112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003113template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3115 const cricket::DataCodec& c2) {
3116 return c1.name == c2.name;
3117}
3118
Peter Boström0c4e06b2015-10-07 12:23:21 +02003119template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003121 uint32_t ssrc,
3122 int flags,
3123 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124 data->AddLegacyStream(ssrc);
3125}
3126
deadbeef953c2ce2017-01-09 14:53:41 -08003127TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128 Base::TestInit();
3129 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3130}
3131
deadbeef953c2ce2017-01-09 14:53:41 -08003132TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003133 Base::TestDeinit();
3134}
3135
deadbeef953c2ce2017-01-09 14:53:41 -08003136TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003137 Base::TestSetContents();
3138}
3139
deadbeef953c2ce2017-01-09 14:53:41 -08003140TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141 Base::TestSetContentsNullOffer();
3142}
3143
deadbeef953c2ce2017-01-09 14:53:41 -08003144TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003145 Base::TestSetContentsRtcpMux();
3146}
3147
deadbeef953c2ce2017-01-09 14:53:41 -08003148TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003149 Base::TestStreams();
3150}
3151
deadbeef953c2ce2017-01-09 14:53:41 -08003152TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153 Base::TestChangeStreamParamsInContent();
3154}
3155
deadbeef953c2ce2017-01-09 14:53:41 -08003156TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003157 Base::TestPlayoutAndSendingStates();
3158}
3159
deadbeef953c2ce2017-01-09 14:53:41 -08003160TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003161 Base::TestMediaContentDirection();
3162}
3163
deadbeef953c2ce2017-01-09 14:53:41 -08003164TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003165 Base::TestCallSetup();
3166}
3167
deadbeef953c2ce2017-01-09 14:53:41 -08003168TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003169 Base::TestCallTeardownRtcpMux();
3170}
3171
zstein56162b92017-04-24 16:54:35 -07003172TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3173 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174}
3175
zstein56162b92017-04-24 16:54:35 -07003176TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3177 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178}
3179
deadbeef953c2ce2017-01-09 14:53:41 -08003180TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003181 Base::SendRtpToRtp();
3182}
3183
deadbeef953c2ce2017-01-09 14:53:41 -08003184TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003185 Base::SendRtcpToRtcp();
3186}
3187
deadbeef953c2ce2017-01-09 14:53:41 -08003188TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003189 Base::SendRtcpMuxToRtcp();
3190}
3191
deadbeef953c2ce2017-01-09 14:53:41 -08003192TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003193 Base::SendRtcpMuxToRtcpMux();
3194}
3195
deadbeef953c2ce2017-01-09 14:53:41 -08003196TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003197 Base::SendEarlyRtcpMuxToRtcp();
3198}
3199
deadbeef953c2ce2017-01-09 14:53:41 -08003200TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003201 Base::SendEarlyRtcpMuxToRtcpMux();
3202}
3203
deadbeef953c2ce2017-01-09 14:53:41 -08003204TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003205 Base::SendSrtpToSrtp();
3206}
3207
deadbeef953c2ce2017-01-09 14:53:41 -08003208TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003209 Base::SendSrtpToSrtp();
3210}
3211
deadbeef953c2ce2017-01-09 14:53:41 -08003212TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003213 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3214}
3215
deadbeef953c2ce2017-01-09 14:53:41 -08003216TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003217 Base::SendRtpToRtpOnThread();
3218}
3219
deadbeef953c2ce2017-01-09 14:53:41 -08003220TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003221 Base::SendSrtpToSrtpOnThread();
3222}
3223
deadbeef953c2ce2017-01-09 14:53:41 -08003224TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003225 Base::SendWithWritabilityLoss();
3226}
3227
deadbeef953c2ce2017-01-09 14:53:41 -08003228TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003229 Base::TestMediaMonitor();
3230}
3231
Steve Anton8a63f782017-10-23 13:08:53 -07003232TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3233 Base::SocketOptionsMergedOnSetTransport();
3234}
3235
deadbeef953c2ce2017-01-09 14:53:41 -08003236TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003237 CreateChannels(0, 0);
3238 EXPECT_TRUE(SendInitiate());
3239 EXPECT_TRUE(SendAccept());
3240
3241 cricket::SendDataParams params;
3242 params.ssrc = 42;
3243 unsigned char data[] = {'f', 'o', 'o'};
3244 rtc::CopyOnWriteBuffer payload(data, 3);
3245 cricket::SendDataResult result;
3246 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3247 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3248 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3249}
3250
deadbeef953c2ce2017-01-09 14:53:41 -08003251TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003252 Base::TestInit();
3253 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3254}
3255
deadbeef953c2ce2017-01-09 14:53:41 -08003256TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003257 Base::TestDeinit();
3258}
3259
deadbeef953c2ce2017-01-09 14:53:41 -08003260TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003261 Base::TestSetContents();
3262}
3263
deadbeef953c2ce2017-01-09 14:53:41 -08003264TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003265 Base::TestSetContentsNullOffer();
3266}
3267
deadbeef953c2ce2017-01-09 14:53:41 -08003268TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003269 Base::TestSetContentsRtcpMux();
3270}
3271
deadbeef953c2ce2017-01-09 14:53:41 -08003272TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003273 Base::TestStreams();
3274}
3275
deadbeef953c2ce2017-01-09 14:53:41 -08003276TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003277 Base::TestChangeStreamParamsInContent();
3278}
3279
deadbeef953c2ce2017-01-09 14:53:41 -08003280TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003281 Base::TestPlayoutAndSendingStates();
3282}
3283
deadbeef953c2ce2017-01-09 14:53:41 -08003284TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003285 Base::TestMediaContentDirection();
3286}
3287
deadbeef953c2ce2017-01-09 14:53:41 -08003288TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003289 Base::TestCallSetup();
3290}
3291
deadbeef953c2ce2017-01-09 14:53:41 -08003292TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003293 Base::TestCallTeardownRtcpMux();
3294}
3295
zstein56162b92017-04-24 16:54:35 -07003296TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3297 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003298}
3299
zstein56162b92017-04-24 16:54:35 -07003300TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3301 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003302}
3303
deadbeef953c2ce2017-01-09 14:53:41 -08003304TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003305 Base::SendRtpToRtp();
3306}
3307
deadbeef953c2ce2017-01-09 14:53:41 -08003308TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003309 Base::SendRtcpToRtcp();
3310}
3311
deadbeef953c2ce2017-01-09 14:53:41 -08003312TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003313 Base::SendRtcpMuxToRtcp();
3314}
3315
deadbeef953c2ce2017-01-09 14:53:41 -08003316TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003317 Base::SendRtcpMuxToRtcpMux();
3318}
3319
deadbeef953c2ce2017-01-09 14:53:41 -08003320TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003321 Base::SendEarlyRtcpMuxToRtcp();
3322}
3323
deadbeef953c2ce2017-01-09 14:53:41 -08003324TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003325 Base::SendEarlyRtcpMuxToRtcpMux();
3326}
3327
deadbeef953c2ce2017-01-09 14:53:41 -08003328TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003329 Base::SendSrtpToSrtp();
3330}
3331
deadbeef953c2ce2017-01-09 14:53:41 -08003332TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003333 Base::SendSrtpToSrtp();
3334}
3335
deadbeef953c2ce2017-01-09 14:53:41 -08003336TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003337 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3338}
3339
deadbeef953c2ce2017-01-09 14:53:41 -08003340TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003341 Base::SendRtpToRtpOnThread();
3342}
3343
deadbeef953c2ce2017-01-09 14:53:41 -08003344TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003345 Base::SendSrtpToSrtpOnThread();
3346}
3347
deadbeef953c2ce2017-01-09 14:53:41 -08003348TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003349 Base::SendWithWritabilityLoss();
3350}
3351
deadbeef953c2ce2017-01-09 14:53:41 -08003352TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003353 Base::TestMediaMonitor();
3354}
3355
Steve Anton8a63f782017-10-23 13:08:53 -07003356TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3357 Base::SocketOptionsMergedOnSetTransport();
3358}
3359
deadbeef953c2ce2017-01-09 14:53:41 -08003360TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003361 CreateChannels(0, 0);
3362 EXPECT_TRUE(SendInitiate());
3363 EXPECT_TRUE(SendAccept());
3364
3365 cricket::SendDataParams params;
3366 params.ssrc = 42;
3367 unsigned char data[] = {
3368 'f', 'o', 'o'
3369 };
jbaucheec21bd2016-03-20 06:15:43 -07003370 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003371 cricket::SendDataResult result;
3372 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3373 EXPECT_EQ(params.ssrc,
3374 media_channel1_->last_sent_data_params().ssrc);
3375 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3376}
3377
deadbeefbad5dad2017-01-17 18:32:35 -08003378#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3379
3380// Verifies some DCHECKs are in place.
3381// Uses VoiceChannel, but any BaseChannel subclass would work.
3382class BaseChannelDeathTest : public testing::Test {
3383 public:
3384 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003385 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3386 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3387 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003388 voice_channel_(rtc::Thread::Current(),
3389 rtc::Thread::Current(),
3390 rtc::Thread::Current(),
3391 &fake_media_engine_,
3392 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3393 nullptr,
3394 cricket::AudioOptions()),
3395 cricket::CN_AUDIO,
3396 false,
3397 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003398
3399 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003400 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003401 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3402 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003403 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003404};
3405
deadbeeff5346592017-01-24 21:51:21 -08003406TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003407 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3408 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003409 cricket::FakeDtlsTransport new_rtcp_transport(
3410 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3411 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003412}
3413
deadbeeff5346592017-01-24 21:51:21 -08003414TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003415 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3416 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003417 cricket::FakeDtlsTransport new_rtp_transport(
3418 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3419 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003420}
3421
deadbeeff5346592017-01-24 21:51:21 -08003422TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003423 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3424 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003425 // Activate RTCP muxing, simulating offer/answer negotiation.
3426 cricket::AudioContentDescription content;
3427 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08003428 ASSERT_TRUE(
3429 voice_channel_.SetLocalContent(&content, SdpType::kOffer, nullptr));
3430 ASSERT_TRUE(
3431 voice_channel_.SetRemoteContent(&content, SdpType::kAnswer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003432 cricket::FakeDtlsTransport new_rtp_transport(
3433 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3434 cricket::FakeDtlsTransport new_rtcp_transport(
3435 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003436 // After muxing is enabled, no RTCP transport should be passed in here.
3437 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003438 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3439 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003440}
3441
3442// This test will probably go away if/when we move the transport name out of
3443// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003444TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003445 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3446 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003447 cricket::FakeDtlsTransport new_rtp_transport(
3448 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3449 cricket::FakeDtlsTransport new_rtcp_transport(
3450 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003451 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003452 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3453 "");
3454}
3455
3456// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003457// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003458TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003459 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3460 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003461 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003462 voice_channel_.SetTransports(
3463 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3464 static_cast<rtc::PacketTransportInternal*>(
3465 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003466 "");
3467}
3468
deadbeef5bd5ca32017-02-10 11:31:50 -08003469// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003470// DtlsTransportInternal.
3471TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003472 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3473 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003474 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3475 &fake_rtp_dtls_transport_),
3476 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003477}
3478
3479#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3480
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003481// TODO(pthatcher): TestSetReceiver?