blob: 92d3b24450b4e96525594bbfcbe0ad03697bec46 [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;
Zhi Huangcf6e24a2018-02-21 10:40:07 -08001033 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001034
Zhi Huangcf6e24a2018-02-21 10:40:07 -08001035 CreateChannels(DTLS, DTLS);
1036 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -07001037
Honghai Zhangcc411c02016-03-29 17:27:21 -07001038 typename T::MediaChannel* media_channel1 =
1039 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001040 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001041
Zhi Huang942bc2e2017-11-13 13:26:07 -08001042 // Need to wait for the threads before calling
1043 // |set_num_network_route_changes| because the network route would be set
1044 // when creating the channel.
1045 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001046 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001047 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001048 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001049 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001050 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1051
1052 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001053 });
1054 WaitForThreads();
1055 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001056 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001057 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001058
eladalon05b07bb2017-08-24 07:40:16 -07001059 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001060 rtc::NetworkRoute network_route;
1061 network_route.connected = true;
1062 network_route.local_network_id = kLocalNetId;
1063 network_route.remote_network_id = kRemoteNetId;
1064 network_route.last_sent_packet_id = kLastPacketId;
1065 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001066 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001067 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1068
1069 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001070 });
1071 WaitForThreads();
1072 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001073 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001074 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001075 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001076 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001077 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -08001078 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -08001079 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001080 }
1081
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 // Test setting up a call.
1083 void TestCallSetup() {
1084 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001085 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001087 if (verify_playout_) {
1088 EXPECT_TRUE(media_channel1_->playout());
1089 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 EXPECT_FALSE(media_channel1_->sending());
1091 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001092 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 EXPECT_TRUE(media_channel1_->sending());
1094 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001095 if (verify_playout_) {
1096 EXPECT_TRUE(media_channel2_->playout());
1097 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(media_channel2_->sending());
1099 EXPECT_EQ(1U, media_channel2_->codecs().size());
1100 }
1101
1102 // Test that we don't crash if packets are sent during call teardown
1103 // when RTCP mux is enabled. This is a regression test against a specific
1104 // race condition that would only occur when a RTCP packet was sent during
1105 // teardown of a channel on which RTCP mux was enabled.
1106 void TestCallTeardownRtcpMux() {
1107 class LastWordMediaChannel : public T::MediaChannel {
1108 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001111 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1112 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1114 }
1115 };
Steve Anton8699a322017-11-06 15:53:33 -08001116 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1117 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_TRUE(SendInitiate());
1119 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001120 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 }
1122
1123 // Send voice RTP data to the other side and ensure it gets there.
1124 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001125 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(SendInitiate());
1127 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001128 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1129 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001130 SendRtp1();
1131 SendRtp2();
1132 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 EXPECT_TRUE(CheckRtp1());
1134 EXPECT_TRUE(CheckRtp2());
1135 EXPECT_TRUE(CheckNoRtp1());
1136 EXPECT_TRUE(CheckNoRtp2());
1137 }
1138
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001139 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001140 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001141 EXPECT_TRUE(SendInitiate());
1142 EXPECT_TRUE(SendAccept());
1143 SendRtp1();
1144 SendRtp2();
1145 SendRtcp1();
1146 SendRtcp2();
1147 // Do not wait, destroy channels.
1148 channel1_.reset(nullptr);
1149 channel2_.reset(nullptr);
1150 }
1151
deadbeefac22f702017-01-12 21:59:29 -08001152 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001154 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_TRUE(SendInitiate());
1156 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001157 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1158 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001159 SendRtcp1();
1160 SendRtcp2();
1161 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(CheckRtcp1());
1163 EXPECT_TRUE(CheckRtcp2());
1164 EXPECT_TRUE(CheckNoRtcp1());
1165 EXPECT_TRUE(CheckNoRtcp2());
1166 }
1167
1168 // Check that RTCP is transmitted if only the initiator supports mux.
1169 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001170 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 EXPECT_TRUE(SendInitiate());
1172 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001173 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1174 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001175 SendRtcp1();
1176 SendRtcp2();
1177 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 EXPECT_TRUE(CheckRtcp1());
1179 EXPECT_TRUE(CheckRtcp2());
1180 EXPECT_TRUE(CheckNoRtcp1());
1181 EXPECT_TRUE(CheckNoRtcp2());
1182 }
1183
1184 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1185 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001186 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001188 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1189 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1190 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001192 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1193 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001194 SendRtp1();
1195 SendRtp2();
1196 SendRtcp1();
1197 SendRtcp2();
1198 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(CheckRtp1());
1200 EXPECT_TRUE(CheckRtp2());
1201 EXPECT_TRUE(CheckNoRtp1());
1202 EXPECT_TRUE(CheckNoRtp2());
1203 EXPECT_TRUE(CheckRtcp1());
1204 EXPECT_TRUE(CheckRtcp2());
1205 EXPECT_TRUE(CheckNoRtcp1());
1206 EXPECT_TRUE(CheckNoRtcp2());
1207 }
1208
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001209 // Check that RTP and RTCP are transmitted ok when both sides
1210 // support mux and one the offerer requires mux.
1211 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001212 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001213 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001214 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1215 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001216 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001217 SendRtp1();
1218 SendRtp2();
1219 SendRtcp1();
1220 SendRtcp2();
1221 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001222 EXPECT_TRUE(CheckRtp1());
1223 EXPECT_TRUE(CheckRtp2());
1224 EXPECT_TRUE(CheckNoRtp1());
1225 EXPECT_TRUE(CheckNoRtp2());
1226 EXPECT_TRUE(CheckRtcp1());
1227 EXPECT_TRUE(CheckRtcp2());
1228 EXPECT_TRUE(CheckNoRtcp1());
1229 EXPECT_TRUE(CheckNoRtcp2());
1230 }
1231
1232 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001233 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001234 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001235 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001236 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001237 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1238 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1239 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001240 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001241 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1242 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001243 SendRtp1();
1244 SendRtp2();
1245 SendRtcp1();
1246 SendRtcp2();
1247 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001248 EXPECT_TRUE(CheckRtp1());
1249 EXPECT_TRUE(CheckRtp2());
1250 EXPECT_TRUE(CheckNoRtp1());
1251 EXPECT_TRUE(CheckNoRtp2());
1252 EXPECT_TRUE(CheckRtcp1());
1253 EXPECT_TRUE(CheckRtcp2());
1254 EXPECT_TRUE(CheckNoRtcp1());
1255 EXPECT_TRUE(CheckNoRtcp2());
1256 }
1257
1258 // Check that RTP and RTCP are transmitted ok when both sides
1259 // require mux.
1260 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001261 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001262 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001263 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1264 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001265 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001266 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001267 SendRtp1();
1268 SendRtp2();
1269 SendRtcp1();
1270 SendRtcp2();
1271 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001272 EXPECT_TRUE(CheckRtp1());
1273 EXPECT_TRUE(CheckRtp2());
1274 EXPECT_TRUE(CheckNoRtp1());
1275 EXPECT_TRUE(CheckNoRtp2());
1276 EXPECT_TRUE(CheckRtcp1());
1277 EXPECT_TRUE(CheckRtcp2());
1278 EXPECT_TRUE(CheckNoRtcp1());
1279 EXPECT_TRUE(CheckNoRtcp2());
1280 }
1281
1282 // Check that SendAccept fails if the answerer doesn't support mux
1283 // and the offerer requires it.
1284 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001285 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001286 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001287 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1288 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001289 EXPECT_FALSE(SendAccept());
1290 }
1291
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 // Check that RTCP data sent by the initiator before the accept is not muxed.
1293 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001294 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001295 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001296 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1297 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298
1299 // RTCP can be sent before the call is accepted, if the transport is ready.
1300 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001301 SendRtcp1();
1302 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001303 EXPECT_TRUE(CheckNoRtp2());
1304 EXPECT_TRUE(CheckRtcp2());
1305
1306 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001307 SendRtcp2();
1308 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_TRUE(CheckNoRtp1());
1310 EXPECT_TRUE(CheckRtcp1());
1311
1312 // Complete call setup and ensure everything is still OK.
1313 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001314 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001315 SendRtcp1();
1316 SendRtcp2();
1317 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001319 EXPECT_TRUE(CheckRtcp1());
1320 }
1321
1322
1323 // Check that RTCP data is not muxed until both sides have enabled muxing,
1324 // but that we properly demux before we get the accept message, since there
1325 // is a race between RTP data and the jingle accept.
1326 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001327 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001328 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001329 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1330 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331
1332 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1333 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001334 SendRtcp1();
1335 WaitForThreads();
1336 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337
1338 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001339 SendRtcp2();
1340 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001341 EXPECT_TRUE(CheckNoRtp1());
1342 EXPECT_TRUE(CheckRtcp1());
1343
1344 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001345 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001347 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1348 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001349 SendRtcp1();
1350 SendRtcp2();
1351 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353 EXPECT_TRUE(CheckRtcp1());
1354 }
1355
1356 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001357 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001359 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1360 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361
deadbeefac22f702017-01-12 21:59:29 -08001362 int flags1 = SECURE | flags1_in;
1363 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 bool dtls1 = !!(flags1_in & DTLS);
1365 bool dtls2 = !!(flags2_in & DTLS);
1366 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001367 EXPECT_FALSE(channel1_->srtp_active());
1368 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001370 WaitForThreads();
1371 EXPECT_TRUE(channel1_->writable());
1372 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001374 EXPECT_TRUE(channel1_->srtp_active());
1375 EXPECT_TRUE(channel2_->srtp_active());
1376 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1377 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001378 SendRtp1();
1379 SendRtp2();
1380 SendRtcp1();
1381 SendRtcp2();
1382 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001383 EXPECT_TRUE(CheckRtp1());
1384 EXPECT_TRUE(CheckRtp2());
1385 EXPECT_TRUE(CheckNoRtp1());
1386 EXPECT_TRUE(CheckNoRtp2());
1387 EXPECT_TRUE(CheckRtcp1());
1388 EXPECT_TRUE(CheckRtcp2());
1389 EXPECT_TRUE(CheckNoRtcp1());
1390 EXPECT_TRUE(CheckNoRtcp2());
1391 }
1392
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001393 // Test that the DTLS to SDES fallback is not supported and the negotiation
1394 // between DTLS to SDES end points will fail.
1395 void SendDtlsToSdesNotSupported() {
1396 int flags1 = SECURE | DTLS;
1397 int flags2 = SECURE;
1398 CreateChannels(flags1, flags2);
1399 EXPECT_FALSE(channel1_->srtp_active());
1400 EXPECT_FALSE(channel2_->srtp_active());
1401 EXPECT_FALSE(SendInitiate());
1402 }
1403
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 // Test that we properly handling SRTP negotiating down to RTP.
1405 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001406 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001407 EXPECT_FALSE(channel1_->srtp_active());
1408 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409 EXPECT_TRUE(SendInitiate());
1410 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001411 EXPECT_FALSE(channel1_->srtp_active());
1412 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001413 SendRtp1();
1414 SendRtp2();
1415 SendRtcp1();
1416 SendRtcp2();
1417 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001418 EXPECT_TRUE(CheckRtp1());
1419 EXPECT_TRUE(CheckRtp2());
1420 EXPECT_TRUE(CheckNoRtp1());
1421 EXPECT_TRUE(CheckNoRtp2());
1422 EXPECT_TRUE(CheckRtcp1());
1423 EXPECT_TRUE(CheckRtcp2());
1424 EXPECT_TRUE(CheckNoRtcp1());
1425 EXPECT_TRUE(CheckNoRtcp2());
1426 }
1427
1428 // Test that we can send and receive early media when a provisional answer is
1429 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1430 void SendEarlyMediaUsingRtcpMuxSrtp() {
1431 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1432
deadbeefac22f702017-01-12 21:59:29 -08001433 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1434 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001435 EXPECT_TRUE(SendOffer());
1436 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001437 EXPECT_TRUE(channel1_->srtp_active());
1438 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001439 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1440 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001441 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1442 SendCustomRtcp1(kSsrc1);
1443 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1444 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1447
1448 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001449 SendCustomRtcp2(kSsrc2);
1450 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1451 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001453 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1454
1455 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001456 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1457 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001459 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1460 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1461 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1462 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001463 EXPECT_TRUE(channel1_->srtp_active());
1464 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001465 SendCustomRtcp1(kSsrc1);
1466 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1467 SendCustomRtcp2(kSsrc2);
1468 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1469 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001472 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001473 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1474 }
1475
1476 // Test that we properly send RTP without SRTP from a thread.
1477 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001478 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001479 EXPECT_TRUE(SendInitiate());
1480 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001481 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1482 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1483 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1484 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1485 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1486 send_rtcp1.thread(),
1487 send_rtcp2.thread()};
1488 WaitForThreads(involved_threads);
1489 EXPECT_TRUE(CheckRtp1());
1490 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(CheckNoRtp1());
1492 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 EXPECT_TRUE(CheckRtcp1());
1494 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 EXPECT_TRUE(CheckNoRtcp1());
1496 EXPECT_TRUE(CheckNoRtcp2());
1497 }
1498
1499 // Test that we properly send SRTP with RTCP from a thread.
1500 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001501 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502 EXPECT_TRUE(SendInitiate());
1503 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1505 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1506 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1507 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1508 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1509 send_rtcp1.thread(),
1510 send_rtcp2.thread()};
1511 WaitForThreads(involved_threads);
1512 EXPECT_TRUE(CheckRtp1());
1513 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_TRUE(CheckNoRtp1());
1515 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001516 EXPECT_TRUE(CheckRtcp1());
1517 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 EXPECT_TRUE(CheckNoRtcp1());
1519 EXPECT_TRUE(CheckNoRtcp2());
1520 }
1521
1522 // Test that the mediachannel retains its sending state after the transport
1523 // becomes non-writable.
1524 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001525 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 EXPECT_TRUE(SendInitiate());
1527 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001528 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1529 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001530 SendRtp1();
1531 SendRtp2();
1532 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 EXPECT_TRUE(CheckRtp1());
1534 EXPECT_TRUE(CheckRtp2());
1535 EXPECT_TRUE(CheckNoRtp1());
1536 EXPECT_TRUE(CheckNoRtp2());
1537
wu@webrtc.org97077a32013-10-25 21:18:33 +00001538 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001539 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1540 fake_rtp_dtls_transport1_->SetWritable(false);
1541 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542 SendRtp1();
1543 SendRtp2();
1544 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545 EXPECT_TRUE(CheckRtp1());
1546 EXPECT_TRUE(CheckNoRtp2());
1547
1548 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001549 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1550 fake_rtp_dtls_transport1_->SetWritable(true);
1551 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001553 SendRtp1();
1554 SendRtp2();
1555 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 EXPECT_TRUE(CheckRtp1());
1557 EXPECT_TRUE(CheckRtp2());
1558 EXPECT_TRUE(CheckNoRtp1());
1559 EXPECT_TRUE(CheckNoRtp2());
1560
1561 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001562 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1563 bool asymmetric = true;
1564 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1565 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566 EXPECT_TRUE(media_channel1_->sending());
1567
wu@webrtc.org97077a32013-10-25 21:18:33 +00001568 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001569 SendRtp1();
1570 SendRtp2();
1571 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572 EXPECT_TRUE(CheckRtp1());
1573 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001574 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575
1576 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001577 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001578 bool asymmetric = true;
1579 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1580 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001581 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001583 SendRtp1();
1584 SendRtp2();
1585 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586 EXPECT_TRUE(CheckRtp1());
1587 EXPECT_TRUE(CheckRtp2());
1588 EXPECT_TRUE(CheckNoRtp1());
1589 EXPECT_TRUE(CheckNoRtp2());
1590 }
1591
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001592 void SendBundleToBundle(
1593 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1594 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001596 // Only pl_type1 was added to the bundle filter for both |channel1_|
1597 // and |channel2_|.
1598 int pl_type1 = pl_types[0];
1599 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001600 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001601 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001602 if (rtcp_mux) {
1603 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001604 }
1605 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001607 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1608 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001610 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1611 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001612 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1613 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1614 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1615 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001616
1617 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1619 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1620 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001621 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001622 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1623 EXPECT_TRUE(CheckNoRtp1());
1624 EXPECT_TRUE(CheckNoRtp2());
1625
1626 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1628 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1629 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001630 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001631 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633 SendCustomRtcp1(kSsrc1);
1634 SendCustomRtcp2(kSsrc2);
1635 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1637 EXPECT_TRUE(CheckNoRtcp1());
1638 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1639 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641 SendCustomRtcp1(kSsrc2);
1642 SendCustomRtcp2(kSsrc1);
1643 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001644 // Bundle filter shouldn't filter out any RTCP.
1645 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1646 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 }
1648
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649 void TestSetContentFailure() {
1650 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651
Peter Thatchera6d24442015-07-09 21:26:36 -07001652 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001653 std::unique_ptr<typename T::Content> content(
1654 CreateMediaContentWithStream(1));
1655
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001657 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001658 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001659 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001660 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001663 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001664 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001665
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001667 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001668 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 }
1670
1671 void TestSendTwoOffers() {
1672 CreateChannels(0, 0);
1673
Peter Thatchera6d24442015-07-09 21:26:36 -07001674 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001675 std::unique_ptr<typename T::Content> content1(
1676 CreateMediaContentWithStream(1));
1677 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001678 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1680
Steve Anton18ee1d52017-09-11 11:32:35 -07001681 std::unique_ptr<typename T::Content> content2(
1682 CreateMediaContentWithStream(2));
1683 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001684 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1686 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1687 }
1688
1689 void TestReceiveTwoOffers() {
1690 CreateChannels(0, 0);
1691
Peter Thatchera6d24442015-07-09 21:26:36 -07001692 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001693 std::unique_ptr<typename T::Content> content1(
1694 CreateMediaContentWithStream(1));
1695 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001696 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001697 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1698
Steve Anton18ee1d52017-09-11 11:32:35 -07001699 std::unique_ptr<typename T::Content> content2(
1700 CreateMediaContentWithStream(2));
1701 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001702 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1704 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1705 }
1706
1707 void TestSendPrAnswer() {
1708 CreateChannels(0, 0);
1709
Peter Thatchera6d24442015-07-09 21:26:36 -07001710 std::string err;
1711 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001712 std::unique_ptr<typename T::Content> content1(
1713 CreateMediaContentWithStream(1));
1714 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001715 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1717
Peter Thatchera6d24442015-07-09 21:26:36 -07001718 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001719 std::unique_ptr<typename T::Content> content2(
1720 CreateMediaContentWithStream(2));
1721 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001722 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1724 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1725
Peter Thatchera6d24442015-07-09 21:26:36 -07001726 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001727 std::unique_ptr<typename T::Content> content3(
1728 CreateMediaContentWithStream(3));
1729 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001730 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1732 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1733 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1734 }
1735
1736 void TestReceivePrAnswer() {
1737 CreateChannels(0, 0);
1738
Peter Thatchera6d24442015-07-09 21:26:36 -07001739 std::string err;
1740 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001741 std::unique_ptr<typename T::Content> content1(
1742 CreateMediaContentWithStream(1));
1743 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001744 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1746
Peter Thatchera6d24442015-07-09 21:26:36 -07001747 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001748 std::unique_ptr<typename T::Content> content2(
1749 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001750 EXPECT_TRUE(
1751 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1753 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1754
Peter Thatchera6d24442015-07-09 21:26:36 -07001755 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001756 std::unique_ptr<typename T::Content> content3(
1757 CreateMediaContentWithStream(3));
1758 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001759 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1761 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1762 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1763 }
1764
1765 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001766 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 EXPECT_TRUE(SendInitiate());
1768 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001769 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1770 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771
1772 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 // The sending message is only posted. channel2_ should be empty.
1775 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1777 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001778
1779 // When channel1_ is deleted, the RTCP packet should be sent out to
1780 // channel2_.
1781 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 EXPECT_TRUE(CheckRtcp2());
1784 }
1785
zstein56162b92017-04-24 16:54:35 -07001786 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001787 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789
zstein56162b92017-04-24 16:54:35 -07001790 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001791 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 EXPECT_TRUE(media_channel1_->ready_to_send());
1793
zstein56162b92017-04-24 16:54:35 -07001794 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001795 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 }
1798
zstein56162b92017-04-24 16:54:35 -07001799 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001800 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801 typename T::Content content;
1802 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001803 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08001805 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001806 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -08001807 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001808 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1809 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 EXPECT_FALSE(media_channel1_->ready_to_send());
1811 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1812 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001813 network_thread_->Invoke<void>(RTC_FROM_HERE,
1814 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001815 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001817
zstein56162b92017-04-24 16:54:35 -07001818 // TODO(zstein): Find a way to test this without making
1819 // OnTransportReadyToSend public.
1820 network_thread_->Invoke<void>(
1821 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001822 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823 EXPECT_FALSE(media_channel1_->ready_to_send());
1824 }
1825
skvladdc1c62c2016-03-16 19:07:43 -07001826 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1827 typename T::Content content;
1828 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1829 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001830 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001831 }
1832
deadbeefe702b302017-02-04 12:09:01 -08001833 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001834 webrtc::RtpParameters parameters;
1835 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001836 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001837 parameters.encodings.push_back(encoding);
1838 return parameters;
1839 }
1840
1841 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001842 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001843 EXPECT_EQ(1UL, parameters.encodings.size());
1844 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1845 }
1846
1847 void DefaultMaxBitrateIsUnlimited() {
1848 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001849 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1850 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001851 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001852 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001853 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001854 }
1855
Steve Anton8a63f782017-10-23 13:08:53 -07001856 // Test that when a channel gets new transports with a call to
1857 // |SetTransports|, the socket options from the old transports are merged with
1858 // the options on the new transport.
1859 // For example, audio and video may use separate socket options, but initially
1860 // be unbundled, then later become bundled. When this happens, their preferred
1861 // socket options should be merged to the underlying transport they share.
1862 void SocketOptionsMergedOnSetTransport() {
1863 constexpr int kSndBufSize = 4000;
1864 constexpr int kRcvBufSize = 8000;
1865
1866 CreateChannels(0, 0);
1867
1868 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1869 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1870 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1871 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1872
1873 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1874 channel2_->rtcp_dtls_transport());
1875
1876 int option_val;
1877 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1878 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1879 EXPECT_EQ(kSndBufSize, option_val);
1880 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1881 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1882 EXPECT_EQ(kRcvBufSize, option_val);
1883 }
1884
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001886 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1887 static void ProcessThreadQueue(rtc::Thread* thread) {
1888 RTC_DCHECK(thread->IsCurrent());
1889 while (!thread->empty()) {
1890 thread->ProcessMessages(0);
1891 }
1892 }
1893 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1894 // |threads| and current thread post packets to network thread.
1895 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001896 thread->Invoke<void>(RTC_FROM_HERE,
1897 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898 }
1899 ProcessThreadQueue(rtc::Thread::Current());
1900 // Network thread move them around and post back to worker = current thread.
1901 if (!network_thread_->IsCurrent()) {
1902 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001903 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001904 }
1905 // Worker thread = current Thread process received messages.
1906 ProcessThreadQueue(rtc::Thread::Current());
1907 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001908 // TODO(pbos): Remove playout from all media channels and let renderers mute
1909 // themselves.
1910 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1912 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001913 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1914 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1915 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1916 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1917 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1918 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1919 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1920 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 cricket::FakeMediaEngine media_engine_;
1922 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001923 typename T::MediaChannel* media_channel1_ = nullptr;
1924 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001925 std::unique_ptr<typename T::Channel> channel1_;
1926 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 typename T::Content local_media_content1_;
1928 typename T::Content local_media_content2_;
1929 typename T::Content remote_media_content1_;
1930 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001932 rtc::Buffer rtp_packet_;
1933 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001934 int rtcp_mux_activated_callbacks1_ = 0;
1935 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001936 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937};
1938
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939template<>
1940void ChannelTest<VoiceTraits>::CreateContent(
1941 int flags,
1942 const cricket::AudioCodec& audio_codec,
1943 const cricket::VideoCodec& video_codec,
1944 cricket::AudioContentDescription* audio) {
1945 audio->AddCodec(audio_codec);
1946 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001947 if ((flags & SECURE) && !(flags & DTLS)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001949 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1950 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 }
1952}
1953
1954template<>
1955void ChannelTest<VoiceTraits>::CopyContent(
1956 const cricket::AudioContentDescription& source,
1957 cricket::AudioContentDescription* audio) {
1958 *audio = source;
1959}
1960
1961template<>
1962bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1963 const cricket::AudioCodec& c2) {
1964 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1965 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
1966}
1967
Peter Boström0c4e06b2015-10-07 12:23:21 +02001968template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001970 uint32_t ssrc,
1971 int flags,
1972 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 audio->AddLegacyStream(ssrc);
1974}
1975
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001976class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977 public:
solenberg1dd98f32015-09-10 01:57:14 -07001978 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979 VoiceChannelSingleThreadTest()
1980 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1981};
1982
1983class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1984 public:
1985 typedef ChannelTest<VoiceTraits> Base;
1986 VoiceChannelDoubleThreadTest()
1987 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988};
1989
jbauch5869f502017-06-29 12:31:36 -07001990class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
1991 : public ChannelTest<VoiceTraits> {
1992 public:
1993 typedef ChannelTest<VoiceTraits> Base;
1994 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
1995 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1996 NetworkIsWorker::Yes) {}
1997};
1998
1999class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2000 : public ChannelTest<VoiceTraits> {
2001 public:
2002 typedef ChannelTest<VoiceTraits> Base;
2003 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2004 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2005 NetworkIsWorker::No) {}
2006};
2007
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002008// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002009template <>
Steve Anton8699a322017-11-06 15:53:33 -08002010std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002011 rtc::Thread* worker_thread,
2012 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002013 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002014 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002015 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2016 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002017 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2018 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002019 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002020 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002021 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2022 worker_thread, network_thread, signaling_thread, std::move(ch),
2023 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2024 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002025 if (!channel->NeedsRtcpTransport()) {
2026 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002027 }
Steve Anton8699a322017-11-06 15:53:33 -08002028 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2029 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 return channel;
2031}
2032
2033// override to add 0 parameter
2034template<>
2035bool ChannelTest<VideoTraits>::AddStream1(int id) {
2036 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2037}
2038
2039template<>
2040void ChannelTest<VideoTraits>::CreateContent(
2041 int flags,
2042 const cricket::AudioCodec& audio_codec,
2043 const cricket::VideoCodec& video_codec,
2044 cricket::VideoContentDescription* video) {
2045 video->AddCodec(video_codec);
2046 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2047 if (flags & SECURE) {
2048 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002049 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2050 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 }
2052}
2053
2054template<>
2055void ChannelTest<VideoTraits>::CopyContent(
2056 const cricket::VideoContentDescription& source,
2057 cricket::VideoContentDescription* video) {
2058 *video = source;
2059}
2060
2061template<>
2062bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2063 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002064 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002065}
2066
Peter Boström0c4e06b2015-10-07 12:23:21 +02002067template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002068void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002069 uint32_t ssrc,
2070 int flags,
2071 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002072 video->AddLegacyStream(ssrc);
2073}
2074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002075class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076 public:
solenberg1dd98f32015-09-10 01:57:14 -07002077 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002078 VideoChannelSingleThreadTest()
2079 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002080};
2081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2083 public:
2084 typedef ChannelTest<VideoTraits> Base;
2085 VideoChannelDoubleThreadTest()
2086 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2087};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002089TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 Base::TestInit();
2091 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2092 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2093}
2094
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002095TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2096 Base::TestDeinit();
2097}
2098
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002099TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 Base::TestSetContents();
2101}
2102
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002103TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 Base::TestSetContentsNullOffer();
2105}
2106
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002107TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108 Base::TestSetContentsRtcpMux();
2109}
2110
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002111TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112 Base::TestSetContentsRtcpMux();
2113}
2114
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002115TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116 Base::TestStreams();
2117}
2118
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002119TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120 Base::TestChangeStreamParamsInContent();
2121}
2122
jbauch5869f502017-06-29 12:31:36 -07002123TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2124 TestChangeEncryptedHeaderExtensionsDtls) {
2125 int flags = DTLS;
2126 Base::TestChangeEncryptedHeaderExtensions(flags);
2127}
2128
2129TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2130 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2131 int flags = DTLS;
2132 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2133}
2134
2135TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2136 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2137 int flags = DTLS;
2138 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2139}
2140
2141TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2142 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2143 int flags = DTLS | GCM_CIPHER;
2144 Base::TestChangeEncryptedHeaderExtensions(flags);
2145}
2146
2147TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2148 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2149 int flags = DTLS | GCM_CIPHER;
2150 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2151}
2152
2153TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2154 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2155 int flags = DTLS | GCM_CIPHER;
2156 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2157}
2158
2159TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2160 TestChangeEncryptedHeaderExtensionsSDES) {
2161 int flags = 0;
2162 Base::TestChangeEncryptedHeaderExtensions(flags);
2163}
2164
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002165TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166 Base::TestPlayoutAndSendingStates();
2167}
2168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002169TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002170 CreateChannels(0, 0);
2171 // Test that we can Mute the default channel even though the sending SSRC
2172 // is unknown.
2173 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002174 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002175 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2176 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002177 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2178
2179 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002180 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002181
2182 SendInitiate();
2183 // After the local session description has been set, we can mute a stream
2184 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002185 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002186 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2187 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002188 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189}
2190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002191TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192 Base::TestMediaContentDirection();
2193}
2194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002195TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002196 Base::TestNetworkRouteChanges();
2197}
2198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002199TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 Base::TestCallSetup();
2201}
2202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204 Base::TestCallTeardownRtcpMux();
2205}
2206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208 Base::SendRtpToRtp();
2209}
2210
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002211TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 Base::SendRtcpToRtcp();
2213}
2214
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002215TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216 Base::SendRtcpMuxToRtcp();
2217}
2218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002219TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 Base::SendRtcpMuxToRtcpMux();
2221}
2222
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002223TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002224 Base::SendRequireRtcpMuxToRtcpMux();
2225}
2226
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002227TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002228 Base::SendRtcpMuxToRequireRtcpMux();
2229}
2230
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002232 Base::SendRequireRtcpMuxToRequireRtcpMux();
2233}
2234
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002235TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002236 Base::SendRequireRtcpMuxToNoRtcpMux();
2237}
2238
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002239TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 Base::SendEarlyRtcpMuxToRtcp();
2241}
2242
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002243TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244 Base::SendEarlyRtcpMuxToRtcpMux();
2245}
2246
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002247TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2249}
2250
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252 Base::SendSrtpToSrtp();
2253}
2254
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002255TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2257}
2258
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002259TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002260 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261}
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264 Base::SendSrtpToSrtp(DTLS, DTLS);
2265}
2266
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002267TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2269}
2270
deadbeeff5346592017-01-24 21:51:21 -08002271// Test using the channel with a raw packet interface, as opposed to a DTLS
2272// transport interface.
2273TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2274 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2275}
2276
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002277TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2279}
2280
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002281TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282 Base::SendRtpToRtpOnThread();
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286 Base::SendSrtpToSrtpOnThread();
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290 Base::SendWithWritabilityLoss();
2291}
2292
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002293TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294 Base::TestSetContentFailure();
2295}
2296
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 Base::TestSendTwoOffers();
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::TestReceiveTwoOffers();
2303}
2304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::TestSendPrAnswer();
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 Base::TestReceivePrAnswer();
2311}
2312
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002313TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 Base::TestFlushRtcp();
2315}
2316
zstein56162b92017-04-24 16:54:35 -07002317TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2318 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319}
2320
zstein56162b92017-04-24 16:54:35 -07002321TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2322 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323}
2324
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002326 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002330 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002331}
2332
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002333TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002334 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002335}
2336
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002337TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002338 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339}
2340
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002341TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002342 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002343}
2344
Steve Anton8a63f782017-10-23 13:08:53 -07002345TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2346 Base::SocketOptionsMergedOnSetTransport();
2347}
2348
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002349// VoiceChannelDoubleThreadTest
2350TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002352 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2353 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354}
2355
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002356TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2357 Base::TestDeinit();
2358}
2359
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002360TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361 Base::TestSetContents();
2362}
2363
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002364TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::TestSetContentsNullOffer();
2366}
2367
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002368TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::TestSetContentsRtcpMux();
2370}
2371
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002372TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::TestSetContentsRtcpMux();
2374}
2375
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002376TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 Base::TestStreams();
2378}
2379
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002380TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381 Base::TestChangeStreamParamsInContent();
2382}
2383
jbauch5869f502017-06-29 12:31:36 -07002384TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2385 TestChangeEncryptedHeaderExtensionsDtls) {
2386 int flags = DTLS;
2387 Base::TestChangeEncryptedHeaderExtensions(flags);
2388}
2389
2390TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2391 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2392 int flags = DTLS;
2393 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2394}
2395
2396TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2397 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2398 int flags = DTLS;
2399 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2400}
2401
2402TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2403 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2404 int flags = DTLS | GCM_CIPHER;
2405 Base::TestChangeEncryptedHeaderExtensions(flags);
2406}
2407
2408TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2409 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2410 int flags = DTLS | GCM_CIPHER;
2411 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2412}
2413
2414TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2415 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2416 int flags = DTLS | GCM_CIPHER;
2417 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2418}
2419
2420TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2421 TestChangeEncryptedHeaderExtensionsSDES) {
2422 int flags = 0;
2423 Base::TestChangeEncryptedHeaderExtensions(flags);
2424}
2425
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002426TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 Base::TestPlayoutAndSendingStates();
2428}
2429
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002430TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2431 CreateChannels(0, 0);
2432 // Test that we can Mute the default channel even though the sending SSRC
2433 // is unknown.
2434 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2435 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2436 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2437 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2438 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2439
2440 // Test that we can not mute an unknown SSRC.
2441 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2442
2443 SendInitiate();
2444 // After the local session description has been set, we can mute a stream
2445 // with its SSRC.
2446 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2447 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2448 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2449 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2450}
2451
2452TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2453 Base::TestMediaContentDirection();
2454}
2455
2456TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2457 Base::TestNetworkRouteChanges();
2458}
2459
2460TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2461 Base::TestCallSetup();
2462}
2463
2464TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2465 Base::TestCallTeardownRtcpMux();
2466}
2467
2468TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2469 Base::SendRtpToRtp();
2470}
2471
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002472TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2473 Base::SendRtcpToRtcp();
2474}
2475
2476TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2477 Base::SendRtcpMuxToRtcp();
2478}
2479
2480TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2481 Base::SendRtcpMuxToRtcpMux();
2482}
2483
2484TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2485 Base::SendRequireRtcpMuxToRtcpMux();
2486}
2487
2488TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2489 Base::SendRtcpMuxToRequireRtcpMux();
2490}
2491
2492TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2493 Base::SendRequireRtcpMuxToRequireRtcpMux();
2494}
2495
2496TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2497 Base::SendRequireRtcpMuxToNoRtcpMux();
2498}
2499
2500TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2501 Base::SendEarlyRtcpMuxToRtcp();
2502}
2503
2504TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2505 Base::SendEarlyRtcpMuxToRtcpMux();
2506}
2507
2508TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2509 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2510}
2511
2512TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2513 Base::SendSrtpToSrtp();
2514}
2515
2516TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2517 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2518}
2519
2520TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002521 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002522}
2523
2524TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002525 Base::SendSrtpToSrtp(DTLS, DTLS);
2526}
2527
2528TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002529 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2530}
2531
deadbeeff5346592017-01-24 21:51:21 -08002532// Test using the channel with a raw packet interface, as opposed to a DTLS
2533// transport interface.
2534TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2535 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2536}
2537
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002538TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2539 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2540}
2541
2542TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2543 Base::SendRtpToRtpOnThread();
2544}
2545
2546TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2547 Base::SendSrtpToSrtpOnThread();
2548}
2549
2550TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2551 Base::SendWithWritabilityLoss();
2552}
2553
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002554TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2555 Base::TestSetContentFailure();
2556}
2557
2558TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2559 Base::TestSendTwoOffers();
2560}
2561
2562TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2563 Base::TestReceiveTwoOffers();
2564}
2565
2566TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2567 Base::TestSendPrAnswer();
2568}
2569
2570TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2571 Base::TestReceivePrAnswer();
2572}
2573
2574TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2575 Base::TestFlushRtcp();
2576}
2577
zstein56162b92017-04-24 16:54:35 -07002578TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2579 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002580}
2581
zstein56162b92017-04-24 16:54:35 -07002582TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2583 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002584}
2585
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002586TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2587 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2588}
2589
2590TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2591 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2592}
2593
2594TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2595 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2596}
2597
2598TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2599 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2600}
2601
2602TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2603 Base::DefaultMaxBitrateIsUnlimited();
2604}
2605
Steve Anton8a63f782017-10-23 13:08:53 -07002606TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2607 Base::SocketOptionsMergedOnSetTransport();
2608}
2609
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002610// VideoChannelSingleThreadTest
2611TEST_F(VideoChannelSingleThreadTest, TestInit) {
2612 Base::TestInit();
2613}
2614
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002615TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2616 Base::TestDeinit();
2617}
2618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002619TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2620 Base::TestSetContents();
2621}
2622
2623TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2624 Base::TestSetContentsNullOffer();
2625}
2626
2627TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2628 Base::TestSetContentsRtcpMux();
2629}
2630
2631TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2632 Base::TestSetContentsRtcpMux();
2633}
2634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002635TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2636 Base::TestStreams();
2637}
2638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002639TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2640 Base::TestChangeStreamParamsInContent();
2641}
2642
2643TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2644 Base::TestPlayoutAndSendingStates();
2645}
2646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002647TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 Base::TestMediaContentDirection();
2649}
2650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002651TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002652 Base::TestNetworkRouteChanges();
2653}
2654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002655TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656 Base::TestCallSetup();
2657}
2658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002659TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 Base::TestCallTeardownRtcpMux();
2661}
2662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002663TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002664 Base::SendRtpToRtp();
2665}
2666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002667TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668 Base::SendRtcpToRtcp();
2669}
2670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002671TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 Base::SendRtcpMuxToRtcp();
2673}
2674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002675TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 Base::SendRtcpMuxToRtcpMux();
2677}
2678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002679TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002680 Base::SendRequireRtcpMuxToRtcpMux();
2681}
2682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002683TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002684 Base::SendRtcpMuxToRequireRtcpMux();
2685}
2686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002687TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002688 Base::SendRequireRtcpMuxToRequireRtcpMux();
2689}
2690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002691TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002692 Base::SendRequireRtcpMuxToNoRtcpMux();
2693}
2694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002695TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 Base::SendEarlyRtcpMuxToRtcp();
2697}
2698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002699TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002700 Base::SendEarlyRtcpMuxToRtcpMux();
2701}
2702
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002703TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 Base::SendSrtpToSrtp();
2705}
2706
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002707TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708 Base::SendSrtpToSrtp();
2709}
2710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002711TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002712 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002713}
2714
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002715TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 Base::SendSrtpToSrtp(DTLS, DTLS);
2717}
2718
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002719TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2721}
2722
deadbeeff5346592017-01-24 21:51:21 -08002723// Test using the channel with a raw packet interface, as opposed to a DTLS
2724// transport interface.
2725TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2726 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2727}
2728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002729TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2731}
2732
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002733TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2735}
2736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002737TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002738 Base::SendRtpToRtpOnThread();
2739}
2740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002741TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742 Base::SendSrtpToSrtpOnThread();
2743}
2744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002745TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 Base::SendWithWritabilityLoss();
2747}
2748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002749TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002750 Base::TestSetContentFailure();
2751}
2752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002753TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 Base::TestSendTwoOffers();
2755}
2756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002757TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 Base::TestReceiveTwoOffers();
2759}
2760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002761TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 Base::TestSendPrAnswer();
2763}
2764
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002765TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 Base::TestReceivePrAnswer();
2767}
2768
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002769TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002770 Base::TestFlushRtcp();
2771}
2772
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002773TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002774 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775}
2776
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002777TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002778 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002779}
2780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002781TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002782 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002783}
2784
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002785TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002786 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787}
2788
zstein56162b92017-04-24 16:54:35 -07002789TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2790 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002791}
2792
zstein56162b92017-04-24 16:54:35 -07002793TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2794 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002795}
2796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002797TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002798 Base::DefaultMaxBitrateIsUnlimited();
2799}
2800
Steve Anton8a63f782017-10-23 13:08:53 -07002801TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2802 Base::SocketOptionsMergedOnSetTransport();
2803}
2804
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002805// VideoChannelDoubleThreadTest
2806TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2807 Base::TestInit();
2808}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002810TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2811 Base::TestDeinit();
2812}
2813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002814TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2815 Base::TestSetContents();
2816}
2817
2818TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2819 Base::TestSetContentsNullOffer();
2820}
2821
2822TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2823 Base::TestSetContentsRtcpMux();
2824}
2825
2826TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2827 Base::TestSetContentsRtcpMux();
2828}
2829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002830TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2831 Base::TestStreams();
2832}
2833
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002834TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2835 Base::TestChangeStreamParamsInContent();
2836}
2837
2838TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2839 Base::TestPlayoutAndSendingStates();
2840}
2841
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002842TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2843 Base::TestMediaContentDirection();
2844}
2845
2846TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2847 Base::TestNetworkRouteChanges();
2848}
2849
2850TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2851 Base::TestCallSetup();
2852}
2853
2854TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2855 Base::TestCallTeardownRtcpMux();
2856}
2857
2858TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2859 Base::SendRtpToRtp();
2860}
2861
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002862TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2863 Base::SendRtcpToRtcp();
2864}
2865
2866TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2867 Base::SendRtcpMuxToRtcp();
2868}
2869
2870TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2871 Base::SendRtcpMuxToRtcpMux();
2872}
2873
2874TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2875 Base::SendRequireRtcpMuxToRtcpMux();
2876}
2877
2878TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2879 Base::SendRtcpMuxToRequireRtcpMux();
2880}
2881
2882TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2883 Base::SendRequireRtcpMuxToRequireRtcpMux();
2884}
2885
2886TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2887 Base::SendRequireRtcpMuxToNoRtcpMux();
2888}
2889
2890TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2891 Base::SendEarlyRtcpMuxToRtcp();
2892}
2893
2894TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2895 Base::SendEarlyRtcpMuxToRtcpMux();
2896}
2897
2898TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
2899 Base::SendSrtpToSrtp();
2900}
2901
2902TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
2903 Base::SendSrtpToSrtp();
2904}
2905
2906TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002907 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002908}
2909
2910TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002911 Base::SendSrtpToSrtp(DTLS, DTLS);
2912}
2913
2914TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002915 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2916}
2917
deadbeeff5346592017-01-24 21:51:21 -08002918// Test using the channel with a raw packet interface, as opposed to a DTLS
2919// transport interface.
2920TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2921 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2922}
2923
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002924TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
2925 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2926}
2927
2928TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2929 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2930}
2931
2932TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2933 Base::SendRtpToRtpOnThread();
2934}
2935
2936TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2937 Base::SendSrtpToSrtpOnThread();
2938}
2939
2940TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2941 Base::SendWithWritabilityLoss();
2942}
2943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002944TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2945 Base::TestSetContentFailure();
2946}
2947
2948TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2949 Base::TestSendTwoOffers();
2950}
2951
2952TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2953 Base::TestReceiveTwoOffers();
2954}
2955
2956TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2957 Base::TestSendPrAnswer();
2958}
2959
2960TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2961 Base::TestReceivePrAnswer();
2962}
2963
2964TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2965 Base::TestFlushRtcp();
2966}
2967
2968TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2969 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2970}
2971
2972TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2973 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2974}
2975
2976TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2977 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2978}
2979
2980TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2981 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2982}
2983
zstein56162b92017-04-24 16:54:35 -07002984TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2985 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002986}
2987
zstein56162b92017-04-24 16:54:35 -07002988TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2989 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002990}
2991
2992TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2993 Base::DefaultMaxBitrateIsUnlimited();
2994}
2995
Steve Anton8a63f782017-10-23 13:08:53 -07002996TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2997 Base::SocketOptionsMergedOnSetTransport();
2998}
2999
deadbeef953c2ce2017-01-09 14:53:41 -08003000// RtpDataChannelSingleThreadTest
3001class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003003 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003004 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003005 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3006};
3007
deadbeef953c2ce2017-01-09 14:53:41 -08003008// RtpDataChannelDoubleThreadTest
3009class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003010 public:
3011 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003012 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003013 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014};
3015
3016// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003017template <>
Steve Anton8699a322017-11-06 15:53:33 -08003018std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003019 rtc::Thread* worker_thread,
3020 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003021 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003022 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003023 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3024 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003025 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3026 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003027 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003028 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003029 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3030 worker_thread, network_thread, signaling_thread, std::move(ch),
3031 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3032 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003033 if (!channel->NeedsRtcpTransport()) {
3034 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003035 }
Steve Anton8699a322017-11-06 15:53:33 -08003036 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3037 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003038 return channel;
3039}
3040
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003041template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042void ChannelTest<DataTraits>::CreateContent(
3043 int flags,
3044 const cricket::AudioCodec& audio_codec,
3045 const cricket::VideoCodec& video_codec,
3046 cricket::DataContentDescription* data) {
3047 data->AddCodec(kGoogleDataCodec);
3048 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3049 if (flags & SECURE) {
3050 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003051 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3052 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003053 }
3054}
3055
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003056template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003057void ChannelTest<DataTraits>::CopyContent(
3058 const cricket::DataContentDescription& source,
3059 cricket::DataContentDescription* data) {
3060 *data = source;
3061}
3062
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003063template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003064bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3065 const cricket::DataCodec& c2) {
3066 return c1.name == c2.name;
3067}
3068
Peter Boström0c4e06b2015-10-07 12:23:21 +02003069template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003071 uint32_t ssrc,
3072 int flags,
3073 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003074 data->AddLegacyStream(ssrc);
3075}
3076
deadbeef953c2ce2017-01-09 14:53:41 -08003077TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078 Base::TestInit();
3079 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3080}
3081
deadbeef953c2ce2017-01-09 14:53:41 -08003082TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003083 Base::TestDeinit();
3084}
3085
deadbeef953c2ce2017-01-09 14:53:41 -08003086TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003087 Base::TestSetContents();
3088}
3089
deadbeef953c2ce2017-01-09 14:53:41 -08003090TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003091 Base::TestSetContentsNullOffer();
3092}
3093
deadbeef953c2ce2017-01-09 14:53:41 -08003094TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003095 Base::TestSetContentsRtcpMux();
3096}
3097
deadbeef953c2ce2017-01-09 14:53:41 -08003098TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099 Base::TestStreams();
3100}
3101
deadbeef953c2ce2017-01-09 14:53:41 -08003102TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103 Base::TestChangeStreamParamsInContent();
3104}
3105
deadbeef953c2ce2017-01-09 14:53:41 -08003106TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003107 Base::TestPlayoutAndSendingStates();
3108}
3109
deadbeef953c2ce2017-01-09 14:53:41 -08003110TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003111 Base::TestMediaContentDirection();
3112}
3113
deadbeef953c2ce2017-01-09 14:53:41 -08003114TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003115 Base::TestCallSetup();
3116}
3117
deadbeef953c2ce2017-01-09 14:53:41 -08003118TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003119 Base::TestCallTeardownRtcpMux();
3120}
3121
zstein56162b92017-04-24 16:54:35 -07003122TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3123 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124}
3125
zstein56162b92017-04-24 16:54:35 -07003126TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3127 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128}
3129
deadbeef953c2ce2017-01-09 14:53:41 -08003130TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003131 Base::SendRtpToRtp();
3132}
3133
deadbeef953c2ce2017-01-09 14:53:41 -08003134TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003135 Base::SendRtcpToRtcp();
3136}
3137
deadbeef953c2ce2017-01-09 14:53:41 -08003138TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003139 Base::SendRtcpMuxToRtcp();
3140}
3141
deadbeef953c2ce2017-01-09 14:53:41 -08003142TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003143 Base::SendRtcpMuxToRtcpMux();
3144}
3145
deadbeef953c2ce2017-01-09 14:53:41 -08003146TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003147 Base::SendEarlyRtcpMuxToRtcp();
3148}
3149
deadbeef953c2ce2017-01-09 14:53:41 -08003150TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003151 Base::SendEarlyRtcpMuxToRtcpMux();
3152}
3153
deadbeef953c2ce2017-01-09 14:53:41 -08003154TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003155 Base::SendSrtpToSrtp();
3156}
3157
deadbeef953c2ce2017-01-09 14:53:41 -08003158TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003159 Base::SendSrtpToSrtp();
3160}
3161
deadbeef953c2ce2017-01-09 14:53:41 -08003162TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003163 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3164}
3165
deadbeef953c2ce2017-01-09 14:53:41 -08003166TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003167 Base::SendRtpToRtpOnThread();
3168}
3169
deadbeef953c2ce2017-01-09 14:53:41 -08003170TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003171 Base::SendSrtpToSrtpOnThread();
3172}
3173
deadbeef953c2ce2017-01-09 14:53:41 -08003174TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003175 Base::SendWithWritabilityLoss();
3176}
3177
Steve Anton8a63f782017-10-23 13:08:53 -07003178TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3179 Base::SocketOptionsMergedOnSetTransport();
3180}
3181
deadbeef953c2ce2017-01-09 14:53:41 -08003182TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003183 CreateChannels(0, 0);
3184 EXPECT_TRUE(SendInitiate());
3185 EXPECT_TRUE(SendAccept());
3186
3187 cricket::SendDataParams params;
3188 params.ssrc = 42;
3189 unsigned char data[] = {'f', 'o', 'o'};
3190 rtc::CopyOnWriteBuffer payload(data, 3);
3191 cricket::SendDataResult result;
3192 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3193 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3194 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3195}
3196
deadbeef953c2ce2017-01-09 14:53:41 -08003197TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003198 Base::TestInit();
3199 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3200}
3201
deadbeef953c2ce2017-01-09 14:53:41 -08003202TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003203 Base::TestDeinit();
3204}
3205
deadbeef953c2ce2017-01-09 14:53:41 -08003206TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003207 Base::TestSetContents();
3208}
3209
deadbeef953c2ce2017-01-09 14:53:41 -08003210TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003211 Base::TestSetContentsNullOffer();
3212}
3213
deadbeef953c2ce2017-01-09 14:53:41 -08003214TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003215 Base::TestSetContentsRtcpMux();
3216}
3217
deadbeef953c2ce2017-01-09 14:53:41 -08003218TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003219 Base::TestStreams();
3220}
3221
deadbeef953c2ce2017-01-09 14:53:41 -08003222TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003223 Base::TestChangeStreamParamsInContent();
3224}
3225
deadbeef953c2ce2017-01-09 14:53:41 -08003226TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003227 Base::TestPlayoutAndSendingStates();
3228}
3229
deadbeef953c2ce2017-01-09 14:53:41 -08003230TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003231 Base::TestMediaContentDirection();
3232}
3233
deadbeef953c2ce2017-01-09 14:53:41 -08003234TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003235 Base::TestCallSetup();
3236}
3237
deadbeef953c2ce2017-01-09 14:53:41 -08003238TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003239 Base::TestCallTeardownRtcpMux();
3240}
3241
zstein56162b92017-04-24 16:54:35 -07003242TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3243 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003244}
3245
zstein56162b92017-04-24 16:54:35 -07003246TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3247 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003248}
3249
deadbeef953c2ce2017-01-09 14:53:41 -08003250TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003251 Base::SendRtpToRtp();
3252}
3253
deadbeef953c2ce2017-01-09 14:53:41 -08003254TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003255 Base::SendRtcpToRtcp();
3256}
3257
deadbeef953c2ce2017-01-09 14:53:41 -08003258TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003259 Base::SendRtcpMuxToRtcp();
3260}
3261
deadbeef953c2ce2017-01-09 14:53:41 -08003262TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003263 Base::SendRtcpMuxToRtcpMux();
3264}
3265
deadbeef953c2ce2017-01-09 14:53:41 -08003266TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003267 Base::SendEarlyRtcpMuxToRtcp();
3268}
3269
deadbeef953c2ce2017-01-09 14:53:41 -08003270TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003271 Base::SendEarlyRtcpMuxToRtcpMux();
3272}
3273
deadbeef953c2ce2017-01-09 14:53:41 -08003274TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003275 Base::SendSrtpToSrtp();
3276}
3277
deadbeef953c2ce2017-01-09 14:53:41 -08003278TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003279 Base::SendSrtpToSrtp();
3280}
3281
deadbeef953c2ce2017-01-09 14:53:41 -08003282TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003283 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3284}
3285
deadbeef953c2ce2017-01-09 14:53:41 -08003286TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003287 Base::SendRtpToRtpOnThread();
3288}
3289
deadbeef953c2ce2017-01-09 14:53:41 -08003290TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003291 Base::SendSrtpToSrtpOnThread();
3292}
3293
deadbeef953c2ce2017-01-09 14:53:41 -08003294TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003295 Base::SendWithWritabilityLoss();
3296}
3297
Steve Anton8a63f782017-10-23 13:08:53 -07003298TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3299 Base::SocketOptionsMergedOnSetTransport();
3300}
3301
deadbeef953c2ce2017-01-09 14:53:41 -08003302TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003303 CreateChannels(0, 0);
3304 EXPECT_TRUE(SendInitiate());
3305 EXPECT_TRUE(SendAccept());
3306
3307 cricket::SendDataParams params;
3308 params.ssrc = 42;
3309 unsigned char data[] = {
3310 'f', 'o', 'o'
3311 };
jbaucheec21bd2016-03-20 06:15:43 -07003312 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003313 cricket::SendDataResult result;
3314 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3315 EXPECT_EQ(params.ssrc,
3316 media_channel1_->last_sent_data_params().ssrc);
3317 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3318}
3319
deadbeefbad5dad2017-01-17 18:32:35 -08003320#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3321
3322// Verifies some DCHECKs are in place.
3323// Uses VoiceChannel, but any BaseChannel subclass would work.
3324class BaseChannelDeathTest : public testing::Test {
3325 public:
3326 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003327 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3328 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3329 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003330 voice_channel_(rtc::Thread::Current(),
3331 rtc::Thread::Current(),
3332 rtc::Thread::Current(),
3333 &fake_media_engine_,
3334 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3335 nullptr,
3336 cricket::AudioOptions()),
3337 cricket::CN_AUDIO,
3338 false,
3339 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003340
3341 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003342 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003343 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3344 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003345 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003346};
3347
deadbeeff5346592017-01-24 21:51:21 -08003348TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003349 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3350 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003351 cricket::FakeDtlsTransport new_rtcp_transport(
3352 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3353 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003354}
3355
deadbeeff5346592017-01-24 21:51:21 -08003356TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003357 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3358 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003359 cricket::FakeDtlsTransport new_rtp_transport(
3360 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3361 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003362}
3363
deadbeeff5346592017-01-24 21:51:21 -08003364TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003365 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3366 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003367 // Activate RTCP muxing, simulating offer/answer negotiation.
3368 cricket::AudioContentDescription content;
3369 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08003370 ASSERT_TRUE(
3371 voice_channel_.SetLocalContent(&content, SdpType::kOffer, nullptr));
3372 ASSERT_TRUE(
3373 voice_channel_.SetRemoteContent(&content, SdpType::kAnswer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003374 cricket::FakeDtlsTransport new_rtp_transport(
3375 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3376 cricket::FakeDtlsTransport new_rtcp_transport(
3377 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003378 // After muxing is enabled, no RTCP transport should be passed in here.
3379 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003380 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3381 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003382}
3383
3384// This test will probably go away if/when we move the transport name out of
3385// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003386TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003387 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3388 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003389 cricket::FakeDtlsTransport new_rtp_transport(
3390 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3391 cricket::FakeDtlsTransport new_rtcp_transport(
3392 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003393 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003394 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3395 "");
3396}
3397
3398// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003399// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003400TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003401 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3402 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003403 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003404 voice_channel_.SetTransports(
3405 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3406 static_cast<rtc::PacketTransportInternal*>(
3407 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003408 "");
3409}
3410
deadbeef5bd5ca32017-02-10 11:31:50 -08003411// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003412// DtlsTransportInternal.
3413TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003414 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3415 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003416 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3417 &fake_rtp_dtls_transport_),
3418 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003419}
3420
3421#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3422
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003423// TODO(pthatcher): TestSetReceiver?