blob: e7a50dcf9a2d881ebc7142ee017184fe8fa7ab2d [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 };
Niels Möller02284852018-01-17 10:22:47 +010048
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);
deadbeefac22f702017-01-12 21:59:29 -0800251 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800252 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800253 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800254 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000255 if ((flags1 & DTLS) && (flags2 & DTLS)) {
256 flags1 = (flags1 & ~SECURE);
257 flags2 = (flags2 & ~SECURE);
258 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259 CreateContent(flags1, kPcmuCodec, kH264Codec,
260 &local_media_content1_);
261 CreateContent(flags2, kPcmuCodec, kH264Codec,
262 &local_media_content2_);
263 CopyContent(local_media_content1_, &remote_media_content1_);
264 CopyContent(local_media_content2_, &remote_media_content2_);
265
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000266 // Add stream information (SSRC) to the local content but not to the remote
267 // content. This means that we per default know the SSRC of what we send but
268 // not what we receive.
269 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
270 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
271
272 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
273 if (flags1 & SSRC_MUX) {
274 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
275 }
276 if (flags2 & SSRC_MUX) {
277 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
278 }
279 }
Steve Anton8699a322017-11-06 15:53:33 -0800280 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200281 rtc::Thread* worker_thread,
282 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700283 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800284 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800285 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
286 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800287 rtc::PacketTransportInternal* fake_rtp_packet_transport,
288 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700289 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800290 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800291 auto channel = rtc::MakeUnique<typename T::Channel>(
292 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800293 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
294 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800295 if (!channel->NeedsRtcpTransport()) {
296 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800297 }
Steve Anton8699a322017-11-06 15:53:33 -0800298 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
299 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000300 return channel;
301 }
302
deadbeeff5346592017-01-24 21:51:21 -0800303 void ConnectFakeTransports() {
304 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
305 bool asymmetric = false;
306 // Depending on test flags, could be using DTLS or raw packet transport.
307 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
308 fake_rtp_dtls_transport1_->SetDestination(
309 fake_rtp_dtls_transport2_.get(), asymmetric);
310 }
311 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
312 fake_rtcp_dtls_transport1_->SetDestination(
313 fake_rtcp_dtls_transport2_.get(), asymmetric);
314 }
315 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
316 fake_rtp_packet_transport1_->SetDestination(
317 fake_rtp_packet_transport2_.get(), asymmetric);
318 }
319 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
320 fake_rtcp_packet_transport1_->SetDestination(
321 fake_rtcp_packet_transport2_.get(), asymmetric);
322 }
323 });
324 }
325
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000326 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000327 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800328 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 if (result) {
330 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000331 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800332 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800334 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800336 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 }
338 }
339 return result;
340 }
341
342 bool SendAccept() {
343 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347
348 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800350 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 if (result) {
352 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356 return result;
357 }
358
359 bool SendProvisionalAnswer() {
360 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800361 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 if (result) {
363 channel2_->Enable(true);
364 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800365 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800366 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 }
368 return result;
369 }
370
371 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000372 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800373 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000374 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000375 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800376 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377 return result;
378 }
379
deadbeeff5346592017-01-24 21:51:21 -0800380 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 channel1_.reset();
382 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800383 fake_rtp_dtls_transport1_.reset();
384 fake_rtcp_dtls_transport1_.reset();
385 fake_rtp_dtls_transport2_.reset();
386 fake_rtcp_dtls_transport2_.reset();
387 fake_rtp_packet_transport1_.reset();
388 fake_rtcp_packet_transport1_.reset();
389 fake_rtp_packet_transport2_.reset();
390 fake_rtcp_packet_transport2_.reset();
391 if (network_thread_keeper_) {
392 network_thread_keeper_.reset();
393 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 return true;
395 }
396
397 bool AddStream1(int id) {
398 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
399 }
400 bool RemoveStream1(int id) {
401 return channel1_->RemoveRecvStream(id);
402 }
403
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200404 void SendRtp1() {
405 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
406 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp2() {
409 media_channel2_->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 SendRtcp1() {
413 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendRtcp2() {
416 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
418 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 media_channel2_->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 SendCustomRtcp1(uint32_t ssrc) {
428 rtc::Buffer data = CreateRtcpData(ssrc);
429 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtcp2(uint32_t ssrc) {
432 rtc::Buffer data = CreateRtcpData(ssrc);
433 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
439 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
442 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200449 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
451 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200453 bool CheckCustomRtp2(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_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtcpData(ssrc);
459 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtcpData(ssrc);
463 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
466 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::SetBE32(data.data() + 8, ssrc);
469 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000470 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000472 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 return data;
474 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
476 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200478 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
481
482 bool CheckNoRtp1() {
483 return media_channel1_->CheckNoRtp();
484 }
485 bool CheckNoRtp2() {
486 return media_channel2_->CheckNoRtp();
487 }
488 bool CheckNoRtcp1() {
489 return media_channel1_->CheckNoRtcp();
490 }
491 bool CheckNoRtcp2() {
492 return media_channel2_->CheckNoRtcp();
493 }
494
495 void CreateContent(int flags,
496 const cricket::AudioCodec& audio_codec,
497 const cricket::VideoCodec& video_codec,
498 typename T::Content* content) {
499 // overridden in specialized classes
500 }
501 void CopyContent(const typename T::Content& source,
502 typename T::Content* content) {
503 // overridden in specialized classes
504 }
505
Steve Anton18ee1d52017-09-11 11:32:35 -0700506 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700508 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
509 typename T::Content* content = new typename T::Content();
510 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
511 AddLegacyStreamInContent(ssrc, 0, content);
512 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 }
514
ossu292d6582016-03-17 02:31:13 -0700515 // Will manage the lifetime of a CallThread, making sure it's
516 // destroyed before this object goes out of scope.
517 class ScopedCallThread {
518 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200519 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700520 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200521 : thread_(rtc::Thread::Create()),
522 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700523 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700524 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700525 }
526
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700528
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200529 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700530
531 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200532 std::unique_ptr<rtc::Thread> thread_;
533 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700534 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
537 return false; // overridden in specialized classes
538 }
539
deadbeeff5346592017-01-24 21:51:21 -0800540 void OnRtcpMuxFullyActive1(const std::string&) {
541 rtcp_mux_activated_callbacks1_++;
542 }
543 void OnRtcpMuxFullyActive2(const std::string&) {
544 rtcp_mux_activated_callbacks2_++;
545 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546
Honghai Zhangcc411c02016-03-29 17:27:21 -0700547 cricket::CandidatePairInterface* last_selected_candidate_pair() {
548 return last_selected_candidate_pair_;
549 }
550
Peter Boström0c4e06b2015-10-07 12:23:21 +0200551 void AddLegacyStreamInContent(uint32_t ssrc,
552 int flags,
553 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 // Base implementation.
555 }
556
557 // Tests that can be used by derived classes.
558
559 // Basic sanity check.
560 void TestInit() {
561 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700562 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200564 if (verify_playout_) {
565 EXPECT_FALSE(media_channel1_->playout());
566 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_TRUE(media_channel1_->codecs().empty());
568 EXPECT_TRUE(media_channel1_->recv_streams().empty());
569 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
570 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
571 }
572
573 // Test that SetLocalContent and SetRemoteContent properly configure
574 // the codecs.
575 void TestSetContents() {
576 CreateChannels(0, 0);
577 typename T::Content content;
578 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800579 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800581 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 ASSERT_EQ(1U, media_channel1_->codecs().size());
583 EXPECT_TRUE(CodecMatches(content.codecs()[0],
584 media_channel1_->codecs()[0]));
585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly deals
588 // with an empty offer.
589 void TestSetContentsNullOffer() {
590 CreateChannels(0, 0);
591 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800592 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 CreateContent(0, kPcmuCodec, kH264Codec, &content);
594 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 set RTCP
602 // mux.
603 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800604 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 typename T::Content content;
606 CreateContent(0, kPcmuCodec, kH264Codec, &content);
607 // Both sides agree on mux. Should no longer be a separate RTCP channel.
608 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
610 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800612 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800614 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 }
616
617 // Test that SetLocalContent and SetRemoteContent properly set RTCP
618 // mux when a provisional answer is received.
619 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800620 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 typename T::Content content;
622 CreateContent(0, kPcmuCodec, kH264Codec, &content);
623 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800624 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
625 EXPECT_TRUE(
626 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800627 // Both sides agree on mux. Should signal RTCP mux as fully activated.
628 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800629 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800630 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800632 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800634 EXPECT_TRUE(
635 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
636 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800637 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 }
639
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 // Test that Add/RemoveStream properly forward to the media channel.
641 void TestStreams() {
642 CreateChannels(0, 0);
643 EXPECT_TRUE(AddStream1(1));
644 EXPECT_TRUE(AddStream1(2));
645 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
646 EXPECT_TRUE(RemoveStream1(2));
647 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
648 EXPECT_TRUE(RemoveStream1(1));
649 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
650 }
651
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 // Test that SetLocalContent and SetRemoteContent properly
653 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800654 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 void TestChangeStreamParamsInContent() {
656 cricket::StreamParams stream1;
657 stream1.groupid = "group1";
658 stream1.id = "stream1";
659 stream1.ssrcs.push_back(kSsrc1);
660 stream1.cname = "stream1_cname";
661
662 cricket::StreamParams stream2;
663 stream2.groupid = "group1";
664 stream2.id = "stream2";
665 stream2.ssrcs.push_back(kSsrc2);
666 stream2.cname = "stream2_cname";
667
668 // Setup a call where channel 1 send |stream1| to channel 2.
669 CreateChannels(0, 0);
670 typename T::Content content1;
671 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
672 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800673 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 EXPECT_TRUE(channel1_->Enable(true));
675 EXPECT_EQ(1u, media_channel1_->send_streams().size());
676
Steve Anton3828c062017-12-06 10:34:51 -0800677 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800679 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680
681 // Channel 2 do not send anything.
682 typename T::Content content2;
683 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800684 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800686 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_TRUE(channel2_->Enable(true));
688 EXPECT_EQ(0u, media_channel2_->send_streams().size());
689
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200690 SendCustomRtp1(kSsrc1, 0);
691 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
693
694 // Let channel 2 update the content by sending |stream2| and enable SRTP.
695 typename T::Content content3;
696 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
697 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800698 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 ASSERT_EQ(1u, media_channel2_->send_streams().size());
700 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
701
Steve Anton3828c062017-12-06 10:34:51 -0800702 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
704 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
705
706 // Channel 1 replies but stop sending stream1.
707 typename T::Content content4;
708 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800709 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_EQ(0u, media_channel1_->send_streams().size());
711
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
714
Zhi Huangcf990f52017-09-22 12:12:30 -0700715 EXPECT_TRUE(channel1_->srtp_active());
716 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200717 SendCustomRtp2(kSsrc2, 0);
718 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
720 }
721
jbauch5869f502017-06-29 12:31:36 -0700722 enum EncryptedHeaderTestScenario {
723 // Offer/Answer are processed before DTLS completes.
724 DEFAULT,
725 // DTLS completes before any Offer/Answer have been sent.
726 DTLS_BEFORE_OFFER_ANSWER,
727 // DTLS completes after channel 2 has processed (remote) Offer and (local)
728 // Answer.
729 DTLS_AFTER_CHANNEL2_READY,
730 };
731
732 // Test that encrypted header extensions are working and can be changed when
733 // sending a new OFFER/ANSWER.
734 void TestChangeEncryptedHeaderExtensions(int flags,
735 EncryptedHeaderTestScenario scenario = DEFAULT) {
736 RTC_CHECK(scenario == 0 || (flags & DTLS));
737 struct PacketListener : public sigslot::has_slots<> {
738 PacketListener() {}
739 void OnReadPacket(rtc::PacketTransportInternal* transport,
740 const char* data, size_t size, const rtc::PacketTime& time,
741 int flags) {
742 CompareHeaderExtensions(
743 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
744 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
745 false);
746 }
747 std::vector<int> encrypted_headers;
748 } packet_listener1, packet_listener2;
749
750 cricket::StreamParams stream1;
751 stream1.groupid = "group1";
752 stream1.id = "stream1";
753 stream1.ssrcs.push_back(kSsrc1);
754 stream1.cname = "stream1_cname";
755
756 cricket::StreamParams stream2;
757 stream2.groupid = "group1";
758 stream2.id = "stream2";
759 stream2.ssrcs.push_back(kSsrc2);
760 stream2.cname = "stream2_cname";
761
762 // Use SRTP when testing encrypted extensions.
763 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
764 // Enable SDES if channel is not using DTLS.
765 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
766
767 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
768 // Make sure to use URIs that are supported for encryption.
769 cricket::RtpHeaderExtensions extensions1;
770 extensions1.push_back(
771 RtpExtension(RtpExtension::kAudioLevelUri, 10));
772 extensions1.push_back(
773 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
774
775 cricket::RtpHeaderExtensions extensions2;
776 extensions2.push_back(
777 RtpExtension(RtpExtension::kAudioLevelUri, 10));
778 extensions2.push_back(
779 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
780 extensions2.push_back(
781 RtpExtension(RtpExtension::kVideoRotationUri, 3));
782 extensions2.push_back(
783 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
784
785 // Setup a call where channel 1 send |stream1| to channel 2.
786 CreateChannels(channel_flags, channel_flags);
787 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
788 &packet_listener1, &PacketListener::OnReadPacket);
789 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
790 &packet_listener2, &PacketListener::OnReadPacket);
791
792 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
793 ConnectFakeTransports();
794 WaitForThreads();
795 }
796
797 typename T::Content content1;
798 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
799 content1.AddStream(stream1);
800 content1.set_rtp_header_extensions(extensions1);
Steve Anton3828c062017-12-06 10:34:51 -0800801 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700802 EXPECT_TRUE(channel1_->Enable(true));
803 EXPECT_EQ(1u, media_channel1_->send_streams().size());
804 packet_listener1.encrypted_headers.push_back(1);
805
Steve Anton3828c062017-12-06 10:34:51 -0800806 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700807 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
808
809 // Channel 2 sends back |stream2|.
810 typename T::Content content2;
811 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
812 content2.AddStream(stream2);
813 content2.set_rtp_header_extensions(extensions1);
Steve Anton3828c062017-12-06 10:34:51 -0800814 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700815 EXPECT_TRUE(channel2_->Enable(true));
816 EXPECT_EQ(1u, media_channel2_->send_streams().size());
817 packet_listener2.encrypted_headers.push_back(1);
818
819 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
820 ConnectFakeTransports();
821 WaitForThreads();
822 }
823
824 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
825 scenario == DTLS_AFTER_CHANNEL2_READY) {
826 // In both scenarios with partially completed Offer/Answer, sending
827 // packets from Channel 2 to Channel 1 should work.
828 SendCustomRtp2(kSsrc2, 0);
829 WaitForThreads();
830 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
831 }
832
Steve Anton3828c062017-12-06 10:34:51 -0800833 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700834 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
835
836 if (scenario == DEFAULT) {
837 ConnectFakeTransports();
838 WaitForThreads();
839 }
840
841 SendCustomRtp1(kSsrc1, 0);
842 SendCustomRtp2(kSsrc2, 0);
843 WaitForThreads();
844 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
845 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
846
847 // Let channel 2 update the encrypted header extensions.
848 typename T::Content content3;
849 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
850 content3.AddStream(stream2);
851 content3.set_rtp_header_extensions(extensions2);
Steve Anton3828c062017-12-06 10:34:51 -0800852 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700853 ASSERT_EQ(1u, media_channel2_->send_streams().size());
854 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
855 packet_listener2.encrypted_headers.clear();
856 packet_listener2.encrypted_headers.push_back(2);
857 packet_listener2.encrypted_headers.push_back(4);
858
Steve Anton3828c062017-12-06 10:34:51 -0800859 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700860 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
861 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
862
863 // Channel 1 is already sending the new encrypted extensions. These
864 // can be decrypted by channel 2. Channel 2 is still sending the old
865 // encrypted extensions (which can be decrypted by channel 1).
866
867 if (flags & DTLS) {
868 // DTLS supports updating the encrypted extensions with only the OFFER
869 // being processed. For SDES both the OFFER and ANSWER must have been
870 // processed to update encrypted extensions, so we can't check this case.
871 SendCustomRtp1(kSsrc1, 0);
872 SendCustomRtp2(kSsrc2, 0);
873 WaitForThreads();
874 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
875 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
876 }
877
878 // Channel 1 replies with the same extensions.
879 typename T::Content content4;
880 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
881 content4.AddStream(stream1);
882 content4.set_rtp_header_extensions(extensions2);
Steve Anton3828c062017-12-06 10:34:51 -0800883 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700884 EXPECT_EQ(1u, media_channel1_->send_streams().size());
885 packet_listener1.encrypted_headers.clear();
886 packet_listener1.encrypted_headers.push_back(2);
887 packet_listener1.encrypted_headers.push_back(4);
888
Steve Anton3828c062017-12-06 10:34:51 -0800889 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700890 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
891
892 SendCustomRtp1(kSsrc1, 0);
893 SendCustomRtp2(kSsrc2, 0);
894 WaitForThreads();
895 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
896 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
897 }
898
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 // Test that we only start playout and sending at the right times.
900 void TestPlayoutAndSendingStates() {
901 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200902 if (verify_playout_) {
903 EXPECT_FALSE(media_channel1_->playout());
904 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200906 if (verify_playout_) {
907 EXPECT_FALSE(media_channel2_->playout());
908 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_FALSE(media_channel2_->sending());
910 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200911 if (verify_playout_) {
912 EXPECT_FALSE(media_channel1_->playout());
913 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000915 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800916 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200917 if (verify_playout_) {
918 EXPECT_TRUE(media_channel1_->playout());
919 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000921 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800922 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200923 if (verify_playout_) {
924 EXPECT_FALSE(media_channel2_->playout());
925 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000927 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800928 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200929 if (verify_playout_) {
930 EXPECT_FALSE(media_channel2_->playout());
931 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800933 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200934 if (verify_playout_) {
935 EXPECT_TRUE(media_channel1_->playout());
936 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200938 if (verify_playout_) {
939 EXPECT_FALSE(media_channel2_->playout());
940 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000941 EXPECT_FALSE(media_channel2_->sending());
942 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200943 if (verify_playout_) {
944 EXPECT_TRUE(media_channel2_->playout());
945 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000947 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800948 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200949 if (verify_playout_) {
950 EXPECT_TRUE(media_channel1_->playout());
951 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 EXPECT_TRUE(media_channel1_->sending());
953 }
954
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 // Test that changing the MediaContentDirection in the local and remote
956 // session description start playout and sending at the right time.
957 void TestMediaContentDirection() {
958 CreateChannels(0, 0);
959 typename T::Content content1;
960 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
961 typename T::Content content2;
962 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
963 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800964 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965
966 EXPECT_TRUE(channel1_->Enable(true));
967 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200968 if (verify_playout_) {
969 EXPECT_FALSE(media_channel1_->playout());
970 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200972 if (verify_playout_) {
973 EXPECT_FALSE(media_channel2_->playout());
974 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 EXPECT_FALSE(media_channel2_->sending());
976
Steve Anton3828c062017-12-06 10:34:51 -0800977 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
978 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
979 EXPECT_TRUE(
980 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
981 EXPECT_TRUE(
982 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800983 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984
Peter Boström34fbfff2015-09-24 19:20:30 +0200985 if (verify_playout_) {
986 EXPECT_TRUE(media_channel1_->playout());
987 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200989 if (verify_playout_) {
990 EXPECT_FALSE(media_channel2_->playout()); // local InActive
991 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 EXPECT_FALSE(media_channel2_->sending()); // local InActive
993
994 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800995 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800996 EXPECT_TRUE(
997 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
998 EXPECT_TRUE(
999 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000
Peter Boström34fbfff2015-09-24 19:20:30 +02001001 if (verify_playout_) {
1002 EXPECT_TRUE(media_channel1_->playout());
1003 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001005 if (verify_playout_) {
1006 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1007 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1009
1010 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -08001011 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -08001012 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
1013 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, 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());
1021 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(media_channel2_->sending());
1023 }
1024
Honghai Zhangcc411c02016-03-29 17:27:21 -07001025 // Tests that when the transport channel signals a candidate pair change
1026 // event, the media channel will receive a call on the network route change.
1027 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001028 static constexpr uint16_t kLocalNetId = 1;
1029 static constexpr uint16_t kRemoteNetId = 2;
1030 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001031 // Ipv4(20) + UDP(8).
1032 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001033
Honghai Zhangcc411c02016-03-29 17:27:21 -07001034 CreateChannels(0, 0);
1035
Honghai Zhangcc411c02016-03-29 17:27:21 -07001036 typename T::MediaChannel* media_channel1 =
1037 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001038 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001039
Zhi Huang942bc2e2017-11-13 13:26:07 -08001040 // Need to wait for the threads before calling
1041 // |set_num_network_route_changes| because the network route would be set
1042 // when creating the channel.
1043 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001044 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001045 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001046 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001047 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001048 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1049
1050 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001051 });
1052 WaitForThreads();
1053 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001054 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001055 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001056
eladalon05b07bb2017-08-24 07:40:16 -07001057 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001058 rtc::NetworkRoute network_route;
1059 network_route.connected = true;
1060 network_route.local_network_id = kLocalNetId;
1061 network_route.remote_network_id = kRemoteNetId;
1062 network_route.last_sent_packet_id = kLastPacketId;
1063 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001064 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001065 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1066
1067 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001068 });
1069 WaitForThreads();
1070 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001071 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001072 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001073 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001074 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001075 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001076 EXPECT_EQ(kTransportOverheadPerPacket,
1077 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001078 }
1079
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 // Test setting up a call.
1081 void TestCallSetup() {
1082 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001083 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001085 if (verify_playout_) {
1086 EXPECT_TRUE(media_channel1_->playout());
1087 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 EXPECT_FALSE(media_channel1_->sending());
1089 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001090 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_TRUE(media_channel1_->sending());
1092 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001093 if (verify_playout_) {
1094 EXPECT_TRUE(media_channel2_->playout());
1095 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(media_channel2_->sending());
1097 EXPECT_EQ(1U, media_channel2_->codecs().size());
1098 }
1099
1100 // Test that we don't crash if packets are sent during call teardown
1101 // when RTCP mux is enabled. This is a regression test against a specific
1102 // race condition that would only occur when a RTCP packet was sent during
1103 // teardown of a channel on which RTCP mux was enabled.
1104 void TestCallTeardownRtcpMux() {
1105 class LastWordMediaChannel : public T::MediaChannel {
1106 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001109 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1110 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1112 }
1113 };
Steve Anton8699a322017-11-06 15:53:33 -08001114 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1115 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 EXPECT_TRUE(SendInitiate());
1117 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001118 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 }
1120
1121 // Send voice RTP data to the other side and ensure it gets there.
1122 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001123 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(SendInitiate());
1125 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001126 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1127 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001128 SendRtp1();
1129 SendRtp2();
1130 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 EXPECT_TRUE(CheckRtp1());
1132 EXPECT_TRUE(CheckRtp2());
1133 EXPECT_TRUE(CheckNoRtp1());
1134 EXPECT_TRUE(CheckNoRtp2());
1135 }
1136
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001137 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001138 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001139 EXPECT_TRUE(SendInitiate());
1140 EXPECT_TRUE(SendAccept());
1141 SendRtp1();
1142 SendRtp2();
1143 SendRtcp1();
1144 SendRtcp2();
1145 // Do not wait, destroy channels.
1146 channel1_.reset(nullptr);
1147 channel2_.reset(nullptr);
1148 }
1149
deadbeefac22f702017-01-12 21:59:29 -08001150 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001152 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_TRUE(SendInitiate());
1154 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001155 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1156 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001157 SendRtcp1();
1158 SendRtcp2();
1159 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 EXPECT_TRUE(CheckRtcp1());
1161 EXPECT_TRUE(CheckRtcp2());
1162 EXPECT_TRUE(CheckNoRtcp1());
1163 EXPECT_TRUE(CheckNoRtcp2());
1164 }
1165
1166 // Check that RTCP is transmitted if only the initiator supports mux.
1167 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001168 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(SendInitiate());
1170 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001171 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1172 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001173 SendRtcp1();
1174 SendRtcp2();
1175 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_TRUE(CheckRtcp1());
1177 EXPECT_TRUE(CheckRtcp2());
1178 EXPECT_TRUE(CheckNoRtcp1());
1179 EXPECT_TRUE(CheckNoRtcp2());
1180 }
1181
1182 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1183 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001184 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001186 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1187 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1188 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001190 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1191 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001192 SendRtp1();
1193 SendRtp2();
1194 SendRtcp1();
1195 SendRtcp2();
1196 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197 EXPECT_TRUE(CheckRtp1());
1198 EXPECT_TRUE(CheckRtp2());
1199 EXPECT_TRUE(CheckNoRtp1());
1200 EXPECT_TRUE(CheckNoRtp2());
1201 EXPECT_TRUE(CheckRtcp1());
1202 EXPECT_TRUE(CheckRtcp2());
1203 EXPECT_TRUE(CheckNoRtcp1());
1204 EXPECT_TRUE(CheckNoRtcp2());
1205 }
1206
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001207 // Check that RTP and RTCP are transmitted ok when both sides
1208 // support mux and one the offerer requires mux.
1209 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001210 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001211 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001212 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1213 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001214 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001215 SendRtp1();
1216 SendRtp2();
1217 SendRtcp1();
1218 SendRtcp2();
1219 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001220 EXPECT_TRUE(CheckRtp1());
1221 EXPECT_TRUE(CheckRtp2());
1222 EXPECT_TRUE(CheckNoRtp1());
1223 EXPECT_TRUE(CheckNoRtp2());
1224 EXPECT_TRUE(CheckRtcp1());
1225 EXPECT_TRUE(CheckRtcp2());
1226 EXPECT_TRUE(CheckNoRtcp1());
1227 EXPECT_TRUE(CheckNoRtcp2());
1228 }
1229
1230 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001231 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001232 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001233 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001234 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001235 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1236 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1237 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001238 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001239 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1240 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001241 SendRtp1();
1242 SendRtp2();
1243 SendRtcp1();
1244 SendRtcp2();
1245 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001246 EXPECT_TRUE(CheckRtp1());
1247 EXPECT_TRUE(CheckRtp2());
1248 EXPECT_TRUE(CheckNoRtp1());
1249 EXPECT_TRUE(CheckNoRtp2());
1250 EXPECT_TRUE(CheckRtcp1());
1251 EXPECT_TRUE(CheckRtcp2());
1252 EXPECT_TRUE(CheckNoRtcp1());
1253 EXPECT_TRUE(CheckNoRtcp2());
1254 }
1255
1256 // Check that RTP and RTCP are transmitted ok when both sides
1257 // require mux.
1258 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001259 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001260 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001261 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1262 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001263 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001264 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001265 SendRtp1();
1266 SendRtp2();
1267 SendRtcp1();
1268 SendRtcp2();
1269 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001270 EXPECT_TRUE(CheckRtp1());
1271 EXPECT_TRUE(CheckRtp2());
1272 EXPECT_TRUE(CheckNoRtp1());
1273 EXPECT_TRUE(CheckNoRtp2());
1274 EXPECT_TRUE(CheckRtcp1());
1275 EXPECT_TRUE(CheckRtcp2());
1276 EXPECT_TRUE(CheckNoRtcp1());
1277 EXPECT_TRUE(CheckNoRtcp2());
1278 }
1279
1280 // Check that SendAccept fails if the answerer doesn't support mux
1281 // and the offerer requires it.
1282 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001283 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001284 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001285 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1286 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001287 EXPECT_FALSE(SendAccept());
1288 }
1289
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 // Check that RTCP data sent by the initiator before the accept is not muxed.
1291 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001292 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001294 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1295 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296
1297 // RTCP can be sent before the call is accepted, if the transport is ready.
1298 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001299 SendRtcp1();
1300 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001301 EXPECT_TRUE(CheckNoRtp2());
1302 EXPECT_TRUE(CheckRtcp2());
1303
1304 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001305 SendRtcp2();
1306 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 EXPECT_TRUE(CheckNoRtp1());
1308 EXPECT_TRUE(CheckRtcp1());
1309
1310 // Complete call setup and ensure everything is still OK.
1311 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001312 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001313 SendRtcp1();
1314 SendRtcp2();
1315 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001317 EXPECT_TRUE(CheckRtcp1());
1318 }
1319
1320
1321 // Check that RTCP data is not muxed until both sides have enabled muxing,
1322 // but that we properly demux before we get the accept message, since there
1323 // is a race between RTP data and the jingle accept.
1324 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001325 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001327 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1328 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329
1330 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1331 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001332 SendRtcp1();
1333 WaitForThreads();
1334 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335
1336 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001337 SendRtcp2();
1338 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001339 EXPECT_TRUE(CheckNoRtp1());
1340 EXPECT_TRUE(CheckRtcp1());
1341
1342 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001343 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001345 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1346 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001347 SendRtcp1();
1348 SendRtcp2();
1349 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001350 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 EXPECT_TRUE(CheckRtcp1());
1352 }
1353
1354 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001355 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001357 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1358 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001359
deadbeefac22f702017-01-12 21:59:29 -08001360 int flags1 = SECURE | flags1_in;
1361 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001362 bool dtls1 = !!(flags1_in & DTLS);
1363 bool dtls2 = !!(flags2_in & DTLS);
1364 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001365 EXPECT_FALSE(channel1_->srtp_active());
1366 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001368 WaitForThreads();
1369 EXPECT_TRUE(channel1_->writable());
1370 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001372 EXPECT_TRUE(channel1_->srtp_active());
1373 EXPECT_TRUE(channel2_->srtp_active());
1374 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1375 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001376 SendRtp1();
1377 SendRtp2();
1378 SendRtcp1();
1379 SendRtcp2();
1380 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(CheckRtp1());
1382 EXPECT_TRUE(CheckRtp2());
1383 EXPECT_TRUE(CheckNoRtp1());
1384 EXPECT_TRUE(CheckNoRtp2());
1385 EXPECT_TRUE(CheckRtcp1());
1386 EXPECT_TRUE(CheckRtcp2());
1387 EXPECT_TRUE(CheckNoRtcp1());
1388 EXPECT_TRUE(CheckNoRtcp2());
1389 }
1390
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001391 // Test that the DTLS to SDES fallback is not supported and the negotiation
1392 // between DTLS to SDES end points will fail.
1393 void SendDtlsToSdesNotSupported() {
1394 int flags1 = SECURE | DTLS;
1395 int flags2 = SECURE;
1396 CreateChannels(flags1, flags2);
1397 EXPECT_FALSE(channel1_->srtp_active());
1398 EXPECT_FALSE(channel2_->srtp_active());
1399 EXPECT_FALSE(SendInitiate());
1400 }
1401
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001402 // Test that we properly handling SRTP negotiating down to RTP.
1403 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001404 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001405 EXPECT_FALSE(channel1_->srtp_active());
1406 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407 EXPECT_TRUE(SendInitiate());
1408 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001409 EXPECT_FALSE(channel1_->srtp_active());
1410 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001411 SendRtp1();
1412 SendRtp2();
1413 SendRtcp1();
1414 SendRtcp2();
1415 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416 EXPECT_TRUE(CheckRtp1());
1417 EXPECT_TRUE(CheckRtp2());
1418 EXPECT_TRUE(CheckNoRtp1());
1419 EXPECT_TRUE(CheckNoRtp2());
1420 EXPECT_TRUE(CheckRtcp1());
1421 EXPECT_TRUE(CheckRtcp2());
1422 EXPECT_TRUE(CheckNoRtcp1());
1423 EXPECT_TRUE(CheckNoRtcp2());
1424 }
1425
1426 // Test that we can send and receive early media when a provisional answer is
1427 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1428 void SendEarlyMediaUsingRtcpMuxSrtp() {
1429 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1430
deadbeefac22f702017-01-12 21:59:29 -08001431 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1432 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001433 EXPECT_TRUE(SendOffer());
1434 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001435 EXPECT_TRUE(channel1_->srtp_active());
1436 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001437 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1438 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001439 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1440 SendCustomRtcp1(kSsrc1);
1441 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1442 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001444 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1445
1446 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001447 SendCustomRtcp2(kSsrc2);
1448 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1449 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1452
1453 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001454 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1455 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001457 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1458 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1459 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1460 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001461 EXPECT_TRUE(channel1_->srtp_active());
1462 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001463 SendCustomRtcp1(kSsrc1);
1464 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1465 SendCustomRtcp2(kSsrc2);
1466 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1467 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1472 }
1473
1474 // Test that we properly send RTP without SRTP from a thread.
1475 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001476 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477 EXPECT_TRUE(SendInitiate());
1478 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001479 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1480 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1481 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1482 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1483 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1484 send_rtcp1.thread(),
1485 send_rtcp2.thread()};
1486 WaitForThreads(involved_threads);
1487 EXPECT_TRUE(CheckRtp1());
1488 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001489 EXPECT_TRUE(CheckNoRtp1());
1490 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001491 EXPECT_TRUE(CheckRtcp1());
1492 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493 EXPECT_TRUE(CheckNoRtcp1());
1494 EXPECT_TRUE(CheckNoRtcp2());
1495 }
1496
1497 // Test that we properly send SRTP with RTCP from a thread.
1498 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001499 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500 EXPECT_TRUE(SendInitiate());
1501 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001502 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1503 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1504 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1505 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1506 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1507 send_rtcp1.thread(),
1508 send_rtcp2.thread()};
1509 WaitForThreads(involved_threads);
1510 EXPECT_TRUE(CheckRtp1());
1511 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512 EXPECT_TRUE(CheckNoRtp1());
1513 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001514 EXPECT_TRUE(CheckRtcp1());
1515 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516 EXPECT_TRUE(CheckNoRtcp1());
1517 EXPECT_TRUE(CheckNoRtcp2());
1518 }
1519
1520 // Test that the mediachannel retains its sending state after the transport
1521 // becomes non-writable.
1522 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001523 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 EXPECT_TRUE(SendInitiate());
1525 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001526 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1527 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001528 SendRtp1();
1529 SendRtp2();
1530 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 EXPECT_TRUE(CheckRtp1());
1532 EXPECT_TRUE(CheckRtp2());
1533 EXPECT_TRUE(CheckNoRtp1());
1534 EXPECT_TRUE(CheckNoRtp2());
1535
wu@webrtc.org97077a32013-10-25 21:18:33 +00001536 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001537 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1538 fake_rtp_dtls_transport1_->SetWritable(false);
1539 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001540 SendRtp1();
1541 SendRtp2();
1542 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 EXPECT_TRUE(CheckRtp1());
1544 EXPECT_TRUE(CheckNoRtp2());
1545
1546 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001547 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1548 fake_rtp_dtls_transport1_->SetWritable(true);
1549 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001551 SendRtp1();
1552 SendRtp2();
1553 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_TRUE(CheckRtp1());
1555 EXPECT_TRUE(CheckRtp2());
1556 EXPECT_TRUE(CheckNoRtp1());
1557 EXPECT_TRUE(CheckNoRtp2());
1558
1559 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001560 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1561 bool asymmetric = true;
1562 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1563 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 EXPECT_TRUE(media_channel1_->sending());
1565
wu@webrtc.org97077a32013-10-25 21:18:33 +00001566 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001567 SendRtp1();
1568 SendRtp2();
1569 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570 EXPECT_TRUE(CheckRtp1());
1571 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001572 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573
1574 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001575 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001576 bool asymmetric = true;
1577 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1578 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001579 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 EXPECT_TRUE(media_channel1_->sending());
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(CheckRtp2());
1586 EXPECT_TRUE(CheckNoRtp1());
1587 EXPECT_TRUE(CheckNoRtp2());
1588 }
1589
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001590 void SendBundleToBundle(
1591 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1592 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001594 // Only pl_type1 was added to the bundle filter for both |channel1_|
1595 // and |channel2_|.
1596 int pl_type1 = pl_types[0];
1597 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001598 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001599 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001600 if (rtcp_mux) {
1601 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001602 }
1603 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001605 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1606 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001608 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1609 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001610 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1611 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1612 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1613 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001614
1615 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001616 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1617 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1618 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001619 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001620 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1621 EXPECT_TRUE(CheckNoRtp1());
1622 EXPECT_TRUE(CheckNoRtp2());
1623
1624 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1626 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1627 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001628 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001629 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631 SendCustomRtcp1(kSsrc1);
1632 SendCustomRtcp2(kSsrc2);
1633 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1635 EXPECT_TRUE(CheckNoRtcp1());
1636 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1637 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639 SendCustomRtcp1(kSsrc2);
1640 SendCustomRtcp2(kSsrc1);
1641 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001642 // Bundle filter shouldn't filter out any RTCP.
1643 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1644 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 }
1646
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 void TestSetContentFailure() {
1648 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649
Peter Thatchera6d24442015-07-09 21:26:36 -07001650 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001651 std::unique_ptr<typename T::Content> content(
1652 CreateMediaContentWithStream(1));
1653
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001655 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001656 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001657 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001658 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001661 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001662 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001663
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001665 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001666 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 }
1668
1669 void TestSendTwoOffers() {
1670 CreateChannels(0, 0);
1671
Peter Thatchera6d24442015-07-09 21:26:36 -07001672 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001673 std::unique_ptr<typename T::Content> content1(
1674 CreateMediaContentWithStream(1));
1675 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001676 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1678
Steve Anton18ee1d52017-09-11 11:32:35 -07001679 std::unique_ptr<typename T::Content> content2(
1680 CreateMediaContentWithStream(2));
1681 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001682 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1684 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1685 }
1686
1687 void TestReceiveTwoOffers() {
1688 CreateChannels(0, 0);
1689
Peter Thatchera6d24442015-07-09 21:26:36 -07001690 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001691 std::unique_ptr<typename T::Content> content1(
1692 CreateMediaContentWithStream(1));
1693 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001694 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1696
Steve Anton18ee1d52017-09-11 11:32:35 -07001697 std::unique_ptr<typename T::Content> content2(
1698 CreateMediaContentWithStream(2));
1699 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001700 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1702 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1703 }
1704
1705 void TestSendPrAnswer() {
1706 CreateChannels(0, 0);
1707
Peter Thatchera6d24442015-07-09 21:26:36 -07001708 std::string err;
1709 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001710 std::unique_ptr<typename T::Content> content1(
1711 CreateMediaContentWithStream(1));
1712 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001713 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1715
Peter Thatchera6d24442015-07-09 21:26:36 -07001716 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001717 std::unique_ptr<typename T::Content> content2(
1718 CreateMediaContentWithStream(2));
1719 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001720 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1722 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1723
Peter Thatchera6d24442015-07-09 21:26:36 -07001724 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001725 std::unique_ptr<typename T::Content> content3(
1726 CreateMediaContentWithStream(3));
1727 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001728 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1730 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1731 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1732 }
1733
1734 void TestReceivePrAnswer() {
1735 CreateChannels(0, 0);
1736
Peter Thatchera6d24442015-07-09 21:26:36 -07001737 std::string err;
1738 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001739 std::unique_ptr<typename T::Content> content1(
1740 CreateMediaContentWithStream(1));
1741 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001742 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1744
Peter Thatchera6d24442015-07-09 21:26:36 -07001745 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001746 std::unique_ptr<typename T::Content> content2(
1747 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001748 EXPECT_TRUE(
1749 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1751 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1752
Peter Thatchera6d24442015-07-09 21:26:36 -07001753 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001754 std::unique_ptr<typename T::Content> content3(
1755 CreateMediaContentWithStream(3));
1756 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001757 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1759 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1760 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1761 }
1762
1763 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001764 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 EXPECT_TRUE(SendInitiate());
1766 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001767 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1768 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769
1770 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001771 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 // The sending message is only posted. channel2_ should be empty.
1773 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1775 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776
1777 // When channel1_ is deleted, the RTCP packet should be sent out to
1778 // channel2_.
1779 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 EXPECT_TRUE(CheckRtcp2());
1782 }
1783
zstein56162b92017-04-24 16:54:35 -07001784 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001785 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787
zstein56162b92017-04-24 16:54:35 -07001788 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 EXPECT_TRUE(media_channel1_->ready_to_send());
1791
zstein56162b92017-04-24 16:54:35 -07001792 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001793 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 }
1796
zstein56162b92017-04-24 16:54:35 -07001797 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001798 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 typename T::Content content;
1800 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001801 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08001803 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001804 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -08001805 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001806 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1807 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_FALSE(media_channel1_->ready_to_send());
1809 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1810 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001811 network_thread_->Invoke<void>(RTC_FROM_HERE,
1812 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001813 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001815
zstein56162b92017-04-24 16:54:35 -07001816 // TODO(zstein): Find a way to test this without making
1817 // OnTransportReadyToSend public.
1818 network_thread_->Invoke<void>(
1819 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001820 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 EXPECT_FALSE(media_channel1_->ready_to_send());
1822 }
1823
skvladdc1c62c2016-03-16 19:07:43 -07001824 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1825 typename T::Content content;
1826 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1827 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001828 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001829 }
1830
deadbeefe702b302017-02-04 12:09:01 -08001831 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001832 webrtc::RtpParameters parameters;
1833 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001834 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001835 parameters.encodings.push_back(encoding);
1836 return parameters;
1837 }
1838
1839 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001840 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001841 EXPECT_EQ(1UL, parameters.encodings.size());
1842 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1843 }
1844
1845 void DefaultMaxBitrateIsUnlimited() {
1846 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001847 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1848 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001849 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001850 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001851 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001852 }
1853
Steve Anton8a63f782017-10-23 13:08:53 -07001854 // Test that when a channel gets new transports with a call to
1855 // |SetTransports|, the socket options from the old transports are merged with
1856 // the options on the new transport.
1857 // For example, audio and video may use separate socket options, but initially
1858 // be unbundled, then later become bundled. When this happens, their preferred
1859 // socket options should be merged to the underlying transport they share.
1860 void SocketOptionsMergedOnSetTransport() {
1861 constexpr int kSndBufSize = 4000;
1862 constexpr int kRcvBufSize = 8000;
1863
1864 CreateChannels(0, 0);
1865
1866 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1867 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1868 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1869 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1870
1871 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1872 channel2_->rtcp_dtls_transport());
1873
1874 int option_val;
1875 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1876 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1877 EXPECT_EQ(kSndBufSize, option_val);
1878 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1879 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1880 EXPECT_EQ(kRcvBufSize, option_val);
1881 }
1882
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001883 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001884 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1885 static void ProcessThreadQueue(rtc::Thread* thread) {
1886 RTC_DCHECK(thread->IsCurrent());
1887 while (!thread->empty()) {
1888 thread->ProcessMessages(0);
1889 }
1890 }
1891 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1892 // |threads| and current thread post packets to network thread.
1893 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001894 thread->Invoke<void>(RTC_FROM_HERE,
1895 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001896 }
1897 ProcessThreadQueue(rtc::Thread::Current());
1898 // Network thread move them around and post back to worker = current thread.
1899 if (!network_thread_->IsCurrent()) {
1900 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001901 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902 }
1903 // Worker thread = current Thread process received messages.
1904 ProcessThreadQueue(rtc::Thread::Current());
1905 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001906 // TODO(pbos): Remove playout from all media channels and let renderers mute
1907 // themselves.
1908 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001909 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1910 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001911 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1912 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1913 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1914 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1915 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1916 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1917 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1918 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 cricket::FakeMediaEngine media_engine_;
1920 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001921 typename T::MediaChannel* media_channel1_ = nullptr;
1922 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001923 std::unique_ptr<typename T::Channel> channel1_;
1924 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 typename T::Content local_media_content1_;
1926 typename T::Content local_media_content2_;
1927 typename T::Content remote_media_content1_;
1928 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930 rtc::Buffer rtp_packet_;
1931 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001932 int rtcp_mux_activated_callbacks1_ = 0;
1933 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001934 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935};
1936
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937template<>
1938void ChannelTest<VoiceTraits>::CreateContent(
1939 int flags,
1940 const cricket::AudioCodec& audio_codec,
1941 const cricket::VideoCodec& video_codec,
1942 cricket::AudioContentDescription* audio) {
1943 audio->AddCodec(audio_codec);
1944 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001945 if ((flags & SECURE) && !(flags & DTLS)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001947 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1948 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 }
1950}
1951
1952template<>
1953void ChannelTest<VoiceTraits>::CopyContent(
1954 const cricket::AudioContentDescription& source,
1955 cricket::AudioContentDescription* audio) {
1956 *audio = source;
1957}
1958
1959template<>
1960bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1961 const cricket::AudioCodec& c2) {
1962 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1963 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
1964}
1965
Peter Boström0c4e06b2015-10-07 12:23:21 +02001966template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001968 uint32_t ssrc,
1969 int flags,
1970 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 audio->AddLegacyStream(ssrc);
1972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 public:
solenberg1dd98f32015-09-10 01:57:14 -07001976 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001977 VoiceChannelSingleThreadTest()
1978 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1979};
1980
1981class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1982 public:
1983 typedef ChannelTest<VoiceTraits> Base;
1984 VoiceChannelDoubleThreadTest()
1985 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986};
1987
jbauch5869f502017-06-29 12:31:36 -07001988class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
1989 : public ChannelTest<VoiceTraits> {
1990 public:
1991 typedef ChannelTest<VoiceTraits> Base;
1992 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
1993 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1994 NetworkIsWorker::Yes) {}
1995};
1996
1997class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
1998 : public ChannelTest<VoiceTraits> {
1999 public:
2000 typedef ChannelTest<VoiceTraits> Base;
2001 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2002 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2003 NetworkIsWorker::No) {}
2004};
2005
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002007template <>
Steve Anton8699a322017-11-06 15:53:33 -08002008std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002009 rtc::Thread* worker_thread,
2010 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002011 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002012 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002013 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2014 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002015 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2016 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002017 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002018 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002019 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2020 worker_thread, network_thread, signaling_thread, std::move(ch),
2021 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2022 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002023 if (!channel->NeedsRtcpTransport()) {
2024 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002025 }
Steve Anton8699a322017-11-06 15:53:33 -08002026 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2027 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028 return channel;
2029}
2030
2031// override to add 0 parameter
2032template<>
2033bool ChannelTest<VideoTraits>::AddStream1(int id) {
2034 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2035}
2036
2037template<>
2038void ChannelTest<VideoTraits>::CreateContent(
2039 int flags,
2040 const cricket::AudioCodec& audio_codec,
2041 const cricket::VideoCodec& video_codec,
2042 cricket::VideoContentDescription* video) {
2043 video->AddCodec(video_codec);
2044 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2045 if (flags & SECURE) {
2046 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002047 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2048 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049 }
2050}
2051
2052template<>
2053void ChannelTest<VideoTraits>::CopyContent(
2054 const cricket::VideoContentDescription& source,
2055 cricket::VideoContentDescription* video) {
2056 *video = source;
2057}
2058
2059template<>
2060bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2061 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002062 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002063}
2064
Peter Boström0c4e06b2015-10-07 12:23:21 +02002065template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002067 uint32_t ssrc,
2068 int flags,
2069 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 video->AddLegacyStream(ssrc);
2071}
2072
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074 public:
solenberg1dd98f32015-09-10 01:57:14 -07002075 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002076 VideoChannelSingleThreadTest()
2077 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002078};
2079
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002080class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2081 public:
2082 typedef ChannelTest<VideoTraits> Base;
2083 VideoChannelDoubleThreadTest()
2084 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2085};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002087TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088 Base::TestInit();
2089 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2090 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2091}
2092
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002093TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2094 Base::TestDeinit();
2095}
2096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002097TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002098 Base::TestSetContents();
2099}
2100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 Base::TestSetContentsNullOffer();
2103}
2104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002105TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106 Base::TestSetContentsRtcpMux();
2107}
2108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110 Base::TestSetContentsRtcpMux();
2111}
2112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002113TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 Base::TestStreams();
2115}
2116
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002117TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118 Base::TestChangeStreamParamsInContent();
2119}
2120
jbauch5869f502017-06-29 12:31:36 -07002121TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2122 TestChangeEncryptedHeaderExtensionsDtls) {
2123 int flags = DTLS;
2124 Base::TestChangeEncryptedHeaderExtensions(flags);
2125}
2126
2127TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2128 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2129 int flags = DTLS;
2130 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2131}
2132
2133TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2134 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2135 int flags = DTLS;
2136 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2137}
2138
2139TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2140 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2141 int flags = DTLS | GCM_CIPHER;
2142 Base::TestChangeEncryptedHeaderExtensions(flags);
2143}
2144
2145TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2146 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2147 int flags = DTLS | GCM_CIPHER;
2148 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2149}
2150
2151TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2152 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2153 int flags = DTLS | GCM_CIPHER;
2154 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2155}
2156
2157TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2158 TestChangeEncryptedHeaderExtensionsSDES) {
2159 int flags = 0;
2160 Base::TestChangeEncryptedHeaderExtensions(flags);
2161}
2162
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002163TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002164 Base::TestPlayoutAndSendingStates();
2165}
2166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002167TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002168 CreateChannels(0, 0);
2169 // Test that we can Mute the default channel even though the sending SSRC
2170 // is unknown.
2171 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002172 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002173 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2174 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002175 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2176
2177 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002178 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002179
2180 SendInitiate();
2181 // After the local session description has been set, we can mute a stream
2182 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002183 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002184 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2185 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002186 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187}
2188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002189TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190 Base::TestMediaContentDirection();
2191}
2192
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002193TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002194 Base::TestNetworkRouteChanges();
2195}
2196
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002197TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002198 Base::TestCallSetup();
2199}
2200
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002201TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202 Base::TestCallTeardownRtcpMux();
2203}
2204
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002205TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206 Base::SendRtpToRtp();
2207}
2208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002210 Base::SendRtcpToRtcp();
2211}
2212
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002213TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214 Base::SendRtcpMuxToRtcp();
2215}
2216
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002217TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 Base::SendRtcpMuxToRtcpMux();
2219}
2220
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002221TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002222 Base::SendRequireRtcpMuxToRtcpMux();
2223}
2224
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002225TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002226 Base::SendRtcpMuxToRequireRtcpMux();
2227}
2228
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002229TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002230 Base::SendRequireRtcpMuxToRequireRtcpMux();
2231}
2232
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002233TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002234 Base::SendRequireRtcpMuxToNoRtcpMux();
2235}
2236
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002237TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238 Base::SendEarlyRtcpMuxToRtcp();
2239}
2240
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242 Base::SendEarlyRtcpMuxToRtcpMux();
2243}
2244
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2247}
2248
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002249TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 Base::SendSrtpToSrtp();
2251}
2252
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002253TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2255}
2256
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002257TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002258 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259}
2260
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002262 Base::SendSrtpToSrtp(DTLS, DTLS);
2263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2267}
2268
deadbeeff5346592017-01-24 21:51:21 -08002269// Test using the channel with a raw packet interface, as opposed to a DTLS
2270// transport interface.
2271TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2272 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2273}
2274
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002275TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002276 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2277}
2278
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002279TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280 Base::SendRtpToRtpOnThread();
2281}
2282
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284 Base::SendSrtpToSrtpOnThread();
2285}
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 Base::SendWithWritabilityLoss();
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292 Base::TestSetContentFailure();
2293}
2294
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296 Base::TestSendTwoOffers();
2297}
2298
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002299TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300 Base::TestReceiveTwoOffers();
2301}
2302
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002303TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304 Base::TestSendPrAnswer();
2305}
2306
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002307TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308 Base::TestReceivePrAnswer();
2309}
2310
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002311TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312 Base::TestFlushRtcp();
2313}
2314
zstein56162b92017-04-24 16:54:35 -07002315TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2316 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317}
2318
zstein56162b92017-04-24 16:54:35 -07002319TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2320 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321}
2322
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002324 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325}
2326
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002328 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002329}
2330
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002331TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002332 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002333}
2334
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002335TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002336 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337}
2338
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002339TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002340 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002341}
2342
Steve Anton8a63f782017-10-23 13:08:53 -07002343TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2344 Base::SocketOptionsMergedOnSetTransport();
2345}
2346
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002347// VoiceChannelDoubleThreadTest
2348TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002350 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2351 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352}
2353
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002354TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2355 Base::TestDeinit();
2356}
2357
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002358TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 Base::TestSetContents();
2360}
2361
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002362TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 Base::TestSetContentsNullOffer();
2364}
2365
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002366TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 Base::TestSetContentsRtcpMux();
2368}
2369
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002370TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 Base::TestSetContentsRtcpMux();
2372}
2373
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002374TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 Base::TestStreams();
2376}
2377
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002378TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379 Base::TestChangeStreamParamsInContent();
2380}
2381
jbauch5869f502017-06-29 12:31:36 -07002382TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2383 TestChangeEncryptedHeaderExtensionsDtls) {
2384 int flags = DTLS;
2385 Base::TestChangeEncryptedHeaderExtensions(flags);
2386}
2387
2388TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2389 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2390 int flags = DTLS;
2391 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2392}
2393
2394TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2395 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2396 int flags = DTLS;
2397 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2398}
2399
2400TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2401 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2402 int flags = DTLS | GCM_CIPHER;
2403 Base::TestChangeEncryptedHeaderExtensions(flags);
2404}
2405
2406TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2407 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2408 int flags = DTLS | GCM_CIPHER;
2409 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2410}
2411
2412TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2413 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2414 int flags = DTLS | GCM_CIPHER;
2415 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2416}
2417
2418TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2419 TestChangeEncryptedHeaderExtensionsSDES) {
2420 int flags = 0;
2421 Base::TestChangeEncryptedHeaderExtensions(flags);
2422}
2423
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002424TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 Base::TestPlayoutAndSendingStates();
2426}
2427
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002428TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2429 CreateChannels(0, 0);
2430 // Test that we can Mute the default channel even though the sending SSRC
2431 // is unknown.
2432 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2433 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2434 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2435 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2436 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2437
2438 // Test that we can not mute an unknown SSRC.
2439 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2440
2441 SendInitiate();
2442 // After the local session description has been set, we can mute a stream
2443 // with its SSRC.
2444 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2445 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2446 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2447 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2448}
2449
2450TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2451 Base::TestMediaContentDirection();
2452}
2453
2454TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2455 Base::TestNetworkRouteChanges();
2456}
2457
2458TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2459 Base::TestCallSetup();
2460}
2461
2462TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2463 Base::TestCallTeardownRtcpMux();
2464}
2465
2466TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2467 Base::SendRtpToRtp();
2468}
2469
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002470TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2471 Base::SendRtcpToRtcp();
2472}
2473
2474TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2475 Base::SendRtcpMuxToRtcp();
2476}
2477
2478TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2479 Base::SendRtcpMuxToRtcpMux();
2480}
2481
2482TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2483 Base::SendRequireRtcpMuxToRtcpMux();
2484}
2485
2486TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2487 Base::SendRtcpMuxToRequireRtcpMux();
2488}
2489
2490TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2491 Base::SendRequireRtcpMuxToRequireRtcpMux();
2492}
2493
2494TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2495 Base::SendRequireRtcpMuxToNoRtcpMux();
2496}
2497
2498TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2499 Base::SendEarlyRtcpMuxToRtcp();
2500}
2501
2502TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2503 Base::SendEarlyRtcpMuxToRtcpMux();
2504}
2505
2506TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2507 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2508}
2509
2510TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2511 Base::SendSrtpToSrtp();
2512}
2513
2514TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2515 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2516}
2517
2518TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002519 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002520}
2521
2522TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002523 Base::SendSrtpToSrtp(DTLS, DTLS);
2524}
2525
2526TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002527 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2528}
2529
deadbeeff5346592017-01-24 21:51:21 -08002530// Test using the channel with a raw packet interface, as opposed to a DTLS
2531// transport interface.
2532TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2533 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2534}
2535
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002536TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2537 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2538}
2539
2540TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2541 Base::SendRtpToRtpOnThread();
2542}
2543
2544TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2545 Base::SendSrtpToSrtpOnThread();
2546}
2547
2548TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2549 Base::SendWithWritabilityLoss();
2550}
2551
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002552TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2553 Base::TestSetContentFailure();
2554}
2555
2556TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2557 Base::TestSendTwoOffers();
2558}
2559
2560TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2561 Base::TestReceiveTwoOffers();
2562}
2563
2564TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2565 Base::TestSendPrAnswer();
2566}
2567
2568TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2569 Base::TestReceivePrAnswer();
2570}
2571
2572TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2573 Base::TestFlushRtcp();
2574}
2575
zstein56162b92017-04-24 16:54:35 -07002576TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2577 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002578}
2579
zstein56162b92017-04-24 16:54:35 -07002580TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2581 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002582}
2583
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002584TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2585 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2586}
2587
2588TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2589 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2590}
2591
2592TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2593 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2594}
2595
2596TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2597 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2598}
2599
2600TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2601 Base::DefaultMaxBitrateIsUnlimited();
2602}
2603
Steve Anton8a63f782017-10-23 13:08:53 -07002604TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2605 Base::SocketOptionsMergedOnSetTransport();
2606}
2607
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002608// VideoChannelSingleThreadTest
2609TEST_F(VideoChannelSingleThreadTest, TestInit) {
2610 Base::TestInit();
2611}
2612
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002613TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2614 Base::TestDeinit();
2615}
2616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002617TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2618 Base::TestSetContents();
2619}
2620
2621TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2622 Base::TestSetContentsNullOffer();
2623}
2624
2625TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2626 Base::TestSetContentsRtcpMux();
2627}
2628
2629TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2630 Base::TestSetContentsRtcpMux();
2631}
2632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002633TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2634 Base::TestStreams();
2635}
2636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002637TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2638 Base::TestChangeStreamParamsInContent();
2639}
2640
2641TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2642 Base::TestPlayoutAndSendingStates();
2643}
2644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002645TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646 Base::TestMediaContentDirection();
2647}
2648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002649TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002650 Base::TestNetworkRouteChanges();
2651}
2652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002653TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654 Base::TestCallSetup();
2655}
2656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002657TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 Base::TestCallTeardownRtcpMux();
2659}
2660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002661TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662 Base::SendRtpToRtp();
2663}
2664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002665TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666 Base::SendRtcpToRtcp();
2667}
2668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002669TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 Base::SendRtcpMuxToRtcp();
2671}
2672
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002673TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 Base::SendRtcpMuxToRtcpMux();
2675}
2676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002677TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002678 Base::SendRequireRtcpMuxToRtcpMux();
2679}
2680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002681TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002682 Base::SendRtcpMuxToRequireRtcpMux();
2683}
2684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002685TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002686 Base::SendRequireRtcpMuxToRequireRtcpMux();
2687}
2688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002689TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002690 Base::SendRequireRtcpMuxToNoRtcpMux();
2691}
2692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002693TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002694 Base::SendEarlyRtcpMuxToRtcp();
2695}
2696
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002697TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698 Base::SendEarlyRtcpMuxToRtcpMux();
2699}
2700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002701TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 Base::SendSrtpToSrtp();
2703}
2704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002705TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 Base::SendSrtpToSrtp();
2707}
2708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002709TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002710 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711}
2712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002713TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 Base::SendSrtpToSrtp(DTLS, DTLS);
2715}
2716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002717TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2719}
2720
deadbeeff5346592017-01-24 21:51:21 -08002721// Test using the channel with a raw packet interface, as opposed to a DTLS
2722// transport interface.
2723TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2724 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2725}
2726
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002727TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2729}
2730
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002731TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2733}
2734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002735TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 Base::SendRtpToRtpOnThread();
2737}
2738
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002739TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 Base::SendSrtpToSrtpOnThread();
2741}
2742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002743TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744 Base::SendWithWritabilityLoss();
2745}
2746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002747TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 Base::TestSetContentFailure();
2749}
2750
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002751TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752 Base::TestSendTwoOffers();
2753}
2754
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002755TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 Base::TestReceiveTwoOffers();
2757}
2758
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002759TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760 Base::TestSendPrAnswer();
2761}
2762
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002763TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 Base::TestReceivePrAnswer();
2765}
2766
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002767TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768 Base::TestFlushRtcp();
2769}
2770
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002771TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002772 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002773}
2774
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002775TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002776 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002777}
2778
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002779TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002780 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002781}
2782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002783TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002784 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785}
2786
zstein56162b92017-04-24 16:54:35 -07002787TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2788 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789}
2790
zstein56162b92017-04-24 16:54:35 -07002791TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2792 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793}
2794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002795TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002796 Base::DefaultMaxBitrateIsUnlimited();
2797}
2798
Steve Anton8a63f782017-10-23 13:08:53 -07002799TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2800 Base::SocketOptionsMergedOnSetTransport();
2801}
2802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002803// VideoChannelDoubleThreadTest
2804TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2805 Base::TestInit();
2806}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002808TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2809 Base::TestDeinit();
2810}
2811
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002812TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2813 Base::TestSetContents();
2814}
2815
2816TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2817 Base::TestSetContentsNullOffer();
2818}
2819
2820TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2821 Base::TestSetContentsRtcpMux();
2822}
2823
2824TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2825 Base::TestSetContentsRtcpMux();
2826}
2827
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002828TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2829 Base::TestStreams();
2830}
2831
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002832TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2833 Base::TestChangeStreamParamsInContent();
2834}
2835
2836TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2837 Base::TestPlayoutAndSendingStates();
2838}
2839
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002840TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2841 Base::TestMediaContentDirection();
2842}
2843
2844TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2845 Base::TestNetworkRouteChanges();
2846}
2847
2848TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2849 Base::TestCallSetup();
2850}
2851
2852TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2853 Base::TestCallTeardownRtcpMux();
2854}
2855
2856TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2857 Base::SendRtpToRtp();
2858}
2859
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002860TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2861 Base::SendRtcpToRtcp();
2862}
2863
2864TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2865 Base::SendRtcpMuxToRtcp();
2866}
2867
2868TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2869 Base::SendRtcpMuxToRtcpMux();
2870}
2871
2872TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2873 Base::SendRequireRtcpMuxToRtcpMux();
2874}
2875
2876TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2877 Base::SendRtcpMuxToRequireRtcpMux();
2878}
2879
2880TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2881 Base::SendRequireRtcpMuxToRequireRtcpMux();
2882}
2883
2884TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2885 Base::SendRequireRtcpMuxToNoRtcpMux();
2886}
2887
2888TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2889 Base::SendEarlyRtcpMuxToRtcp();
2890}
2891
2892TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2893 Base::SendEarlyRtcpMuxToRtcpMux();
2894}
2895
2896TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
2897 Base::SendSrtpToSrtp();
2898}
2899
2900TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
2901 Base::SendSrtpToSrtp();
2902}
2903
2904TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002905 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002906}
2907
2908TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002909 Base::SendSrtpToSrtp(DTLS, DTLS);
2910}
2911
2912TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002913 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2914}
2915
deadbeeff5346592017-01-24 21:51:21 -08002916// Test using the channel with a raw packet interface, as opposed to a DTLS
2917// transport interface.
2918TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2919 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2920}
2921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002922TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
2923 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2924}
2925
2926TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2927 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2928}
2929
2930TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2931 Base::SendRtpToRtpOnThread();
2932}
2933
2934TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2935 Base::SendSrtpToSrtpOnThread();
2936}
2937
2938TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2939 Base::SendWithWritabilityLoss();
2940}
2941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002942TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2943 Base::TestSetContentFailure();
2944}
2945
2946TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2947 Base::TestSendTwoOffers();
2948}
2949
2950TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2951 Base::TestReceiveTwoOffers();
2952}
2953
2954TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2955 Base::TestSendPrAnswer();
2956}
2957
2958TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2959 Base::TestReceivePrAnswer();
2960}
2961
2962TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2963 Base::TestFlushRtcp();
2964}
2965
2966TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2967 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2968}
2969
2970TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2971 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2972}
2973
2974TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2975 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2976}
2977
2978TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2979 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2980}
2981
zstein56162b92017-04-24 16:54:35 -07002982TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2983 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002984}
2985
zstein56162b92017-04-24 16:54:35 -07002986TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2987 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002988}
2989
2990TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2991 Base::DefaultMaxBitrateIsUnlimited();
2992}
2993
Steve Anton8a63f782017-10-23 13:08:53 -07002994TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2995 Base::SocketOptionsMergedOnSetTransport();
2996}
2997
deadbeef953c2ce2017-01-09 14:53:41 -08002998// RtpDataChannelSingleThreadTest
2999class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003001 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003002 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003003 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3004};
3005
deadbeef953c2ce2017-01-09 14:53:41 -08003006// RtpDataChannelDoubleThreadTest
3007class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003008 public:
3009 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003010 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003011 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003012};
3013
3014// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003015template <>
Steve Anton8699a322017-11-06 15:53:33 -08003016std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003017 rtc::Thread* worker_thread,
3018 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003019 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003020 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003021 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3022 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003023 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3024 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003025 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003026 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003027 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3028 worker_thread, network_thread, signaling_thread, std::move(ch),
3029 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3030 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003031 if (!channel->NeedsRtcpTransport()) {
3032 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003033 }
Steve Anton8699a322017-11-06 15:53:33 -08003034 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3035 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003036 return channel;
3037}
3038
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003039template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003040void ChannelTest<DataTraits>::CreateContent(
3041 int flags,
3042 const cricket::AudioCodec& audio_codec,
3043 const cricket::VideoCodec& video_codec,
3044 cricket::DataContentDescription* data) {
3045 data->AddCodec(kGoogleDataCodec);
3046 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3047 if (flags & SECURE) {
3048 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003049 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3050 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003051 }
3052}
3053
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003054template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055void ChannelTest<DataTraits>::CopyContent(
3056 const cricket::DataContentDescription& source,
3057 cricket::DataContentDescription* data) {
3058 *data = source;
3059}
3060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003061template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003062bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3063 const cricket::DataCodec& c2) {
3064 return c1.name == c2.name;
3065}
3066
Peter Boström0c4e06b2015-10-07 12:23:21 +02003067template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003068void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003069 uint32_t ssrc,
3070 int flags,
3071 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072 data->AddLegacyStream(ssrc);
3073}
3074
deadbeef953c2ce2017-01-09 14:53:41 -08003075TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076 Base::TestInit();
3077 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3078}
3079
deadbeef953c2ce2017-01-09 14:53:41 -08003080TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003081 Base::TestDeinit();
3082}
3083
deadbeef953c2ce2017-01-09 14:53:41 -08003084TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003085 Base::TestSetContents();
3086}
3087
deadbeef953c2ce2017-01-09 14:53:41 -08003088TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089 Base::TestSetContentsNullOffer();
3090}
3091
deadbeef953c2ce2017-01-09 14:53:41 -08003092TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003093 Base::TestSetContentsRtcpMux();
3094}
3095
deadbeef953c2ce2017-01-09 14:53:41 -08003096TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003097 Base::TestStreams();
3098}
3099
deadbeef953c2ce2017-01-09 14:53:41 -08003100TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101 Base::TestChangeStreamParamsInContent();
3102}
3103
deadbeef953c2ce2017-01-09 14:53:41 -08003104TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003105 Base::TestPlayoutAndSendingStates();
3106}
3107
deadbeef953c2ce2017-01-09 14:53:41 -08003108TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109 Base::TestMediaContentDirection();
3110}
3111
deadbeef953c2ce2017-01-09 14:53:41 -08003112TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003113 Base::TestCallSetup();
3114}
3115
deadbeef953c2ce2017-01-09 14:53:41 -08003116TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117 Base::TestCallTeardownRtcpMux();
3118}
3119
zstein56162b92017-04-24 16:54:35 -07003120TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3121 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003122}
3123
zstein56162b92017-04-24 16:54:35 -07003124TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3125 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126}
3127
deadbeef953c2ce2017-01-09 14:53:41 -08003128TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003129 Base::SendRtpToRtp();
3130}
3131
deadbeef953c2ce2017-01-09 14:53:41 -08003132TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003133 Base::SendRtcpToRtcp();
3134}
3135
deadbeef953c2ce2017-01-09 14:53:41 -08003136TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003137 Base::SendRtcpMuxToRtcp();
3138}
3139
deadbeef953c2ce2017-01-09 14:53:41 -08003140TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141 Base::SendRtcpMuxToRtcpMux();
3142}
3143
deadbeef953c2ce2017-01-09 14:53:41 -08003144TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003145 Base::SendEarlyRtcpMuxToRtcp();
3146}
3147
deadbeef953c2ce2017-01-09 14:53:41 -08003148TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003149 Base::SendEarlyRtcpMuxToRtcpMux();
3150}
3151
deadbeef953c2ce2017-01-09 14:53:41 -08003152TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153 Base::SendSrtpToSrtp();
3154}
3155
deadbeef953c2ce2017-01-09 14:53:41 -08003156TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003157 Base::SendSrtpToSrtp();
3158}
3159
deadbeef953c2ce2017-01-09 14:53:41 -08003160TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003161 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3162}
3163
deadbeef953c2ce2017-01-09 14:53:41 -08003164TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003165 Base::SendRtpToRtpOnThread();
3166}
3167
deadbeef953c2ce2017-01-09 14:53:41 -08003168TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003169 Base::SendSrtpToSrtpOnThread();
3170}
3171
deadbeef953c2ce2017-01-09 14:53:41 -08003172TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003173 Base::SendWithWritabilityLoss();
3174}
3175
Steve Anton8a63f782017-10-23 13:08:53 -07003176TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3177 Base::SocketOptionsMergedOnSetTransport();
3178}
3179
deadbeef953c2ce2017-01-09 14:53:41 -08003180TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003181 CreateChannels(0, 0);
3182 EXPECT_TRUE(SendInitiate());
3183 EXPECT_TRUE(SendAccept());
3184
3185 cricket::SendDataParams params;
3186 params.ssrc = 42;
3187 unsigned char data[] = {'f', 'o', 'o'};
3188 rtc::CopyOnWriteBuffer payload(data, 3);
3189 cricket::SendDataResult result;
3190 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3191 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3192 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3193}
3194
deadbeef953c2ce2017-01-09 14:53:41 -08003195TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003196 Base::TestInit();
3197 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3198}
3199
deadbeef953c2ce2017-01-09 14:53:41 -08003200TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003201 Base::TestDeinit();
3202}
3203
deadbeef953c2ce2017-01-09 14:53:41 -08003204TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003205 Base::TestSetContents();
3206}
3207
deadbeef953c2ce2017-01-09 14:53:41 -08003208TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003209 Base::TestSetContentsNullOffer();
3210}
3211
deadbeef953c2ce2017-01-09 14:53:41 -08003212TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003213 Base::TestSetContentsRtcpMux();
3214}
3215
deadbeef953c2ce2017-01-09 14:53:41 -08003216TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003217 Base::TestStreams();
3218}
3219
deadbeef953c2ce2017-01-09 14:53:41 -08003220TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003221 Base::TestChangeStreamParamsInContent();
3222}
3223
deadbeef953c2ce2017-01-09 14:53:41 -08003224TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003225 Base::TestPlayoutAndSendingStates();
3226}
3227
deadbeef953c2ce2017-01-09 14:53:41 -08003228TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003229 Base::TestMediaContentDirection();
3230}
3231
deadbeef953c2ce2017-01-09 14:53:41 -08003232TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003233 Base::TestCallSetup();
3234}
3235
deadbeef953c2ce2017-01-09 14:53:41 -08003236TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003237 Base::TestCallTeardownRtcpMux();
3238}
3239
zstein56162b92017-04-24 16:54:35 -07003240TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3241 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003242}
3243
zstein56162b92017-04-24 16:54:35 -07003244TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3245 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003246}
3247
deadbeef953c2ce2017-01-09 14:53:41 -08003248TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003249 Base::SendRtpToRtp();
3250}
3251
deadbeef953c2ce2017-01-09 14:53:41 -08003252TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003253 Base::SendRtcpToRtcp();
3254}
3255
deadbeef953c2ce2017-01-09 14:53:41 -08003256TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003257 Base::SendRtcpMuxToRtcp();
3258}
3259
deadbeef953c2ce2017-01-09 14:53:41 -08003260TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003261 Base::SendRtcpMuxToRtcpMux();
3262}
3263
deadbeef953c2ce2017-01-09 14:53:41 -08003264TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003265 Base::SendEarlyRtcpMuxToRtcp();
3266}
3267
deadbeef953c2ce2017-01-09 14:53:41 -08003268TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003269 Base::SendEarlyRtcpMuxToRtcpMux();
3270}
3271
deadbeef953c2ce2017-01-09 14:53:41 -08003272TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003273 Base::SendSrtpToSrtp();
3274}
3275
deadbeef953c2ce2017-01-09 14:53:41 -08003276TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003277 Base::SendSrtpToSrtp();
3278}
3279
deadbeef953c2ce2017-01-09 14:53:41 -08003280TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003281 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3282}
3283
deadbeef953c2ce2017-01-09 14:53:41 -08003284TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003285 Base::SendRtpToRtpOnThread();
3286}
3287
deadbeef953c2ce2017-01-09 14:53:41 -08003288TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003289 Base::SendSrtpToSrtpOnThread();
3290}
3291
deadbeef953c2ce2017-01-09 14:53:41 -08003292TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003293 Base::SendWithWritabilityLoss();
3294}
3295
Steve Anton8a63f782017-10-23 13:08:53 -07003296TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3297 Base::SocketOptionsMergedOnSetTransport();
3298}
3299
deadbeef953c2ce2017-01-09 14:53:41 -08003300TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003301 CreateChannels(0, 0);
3302 EXPECT_TRUE(SendInitiate());
3303 EXPECT_TRUE(SendAccept());
3304
3305 cricket::SendDataParams params;
3306 params.ssrc = 42;
3307 unsigned char data[] = {
3308 'f', 'o', 'o'
3309 };
jbaucheec21bd2016-03-20 06:15:43 -07003310 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003311 cricket::SendDataResult result;
3312 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3313 EXPECT_EQ(params.ssrc,
3314 media_channel1_->last_sent_data_params().ssrc);
3315 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3316}
3317
deadbeefbad5dad2017-01-17 18:32:35 -08003318#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3319
3320// Verifies some DCHECKs are in place.
3321// Uses VoiceChannel, but any BaseChannel subclass would work.
3322class BaseChannelDeathTest : public testing::Test {
3323 public:
3324 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003325 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3326 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3327 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003328 voice_channel_(rtc::Thread::Current(),
3329 rtc::Thread::Current(),
3330 rtc::Thread::Current(),
3331 &fake_media_engine_,
3332 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3333 nullptr,
3334 cricket::AudioOptions()),
3335 cricket::CN_AUDIO,
3336 false,
3337 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003338
3339 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003340 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003341 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3342 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003343 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003344};
3345
deadbeeff5346592017-01-24 21:51:21 -08003346TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003347 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3348 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003349 cricket::FakeDtlsTransport new_rtcp_transport(
3350 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3351 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003352}
3353
deadbeeff5346592017-01-24 21:51:21 -08003354TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003355 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3356 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003357 cricket::FakeDtlsTransport new_rtp_transport(
3358 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3359 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003360}
3361
deadbeeff5346592017-01-24 21:51:21 -08003362TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003363 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3364 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003365 // Activate RTCP muxing, simulating offer/answer negotiation.
3366 cricket::AudioContentDescription content;
3367 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08003368 ASSERT_TRUE(
3369 voice_channel_.SetLocalContent(&content, SdpType::kOffer, nullptr));
3370 ASSERT_TRUE(
3371 voice_channel_.SetRemoteContent(&content, SdpType::kAnswer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003372 cricket::FakeDtlsTransport new_rtp_transport(
3373 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3374 cricket::FakeDtlsTransport new_rtcp_transport(
3375 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003376 // After muxing is enabled, no RTCP transport should be passed in here.
3377 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003378 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3379 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003380}
3381
3382// This test will probably go away if/when we move the transport name out of
3383// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003384TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003385 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3386 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003387 cricket::FakeDtlsTransport new_rtp_transport(
3388 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3389 cricket::FakeDtlsTransport new_rtcp_transport(
3390 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003391 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003392 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3393 "");
3394}
3395
3396// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003397// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003398TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003399 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3400 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003401 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003402 voice_channel_.SetTransports(
3403 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3404 static_cast<rtc::PacketTransportInternal*>(
3405 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003406 "");
3407}
3408
deadbeef5bd5ca32017-02-10 11:31:50 -08003409// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003410// DtlsTransportInternal.
3411TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003412 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3413 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003414 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3415 &fake_rtp_dtls_transport_),
3416 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003417}
3418
3419#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3420
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003421// TODO(pthatcher): TestSetReceiver?