blob: 36a6b57d90f073c9d182fbf91179ee7ada12b6c7 [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
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030using cricket::CA_OFFER;
31using cricket::CA_PRANSWER;
32using cricket::CA_ANSWER;
zhihuangb2cdd932017-01-19 16:54:25 -080033using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035using cricket::StreamParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036
Danil Chapovalov33b01f22016-05-11 19:55:27 +020037namespace {
38const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
39const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
40const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070041const cricket::VideoCodec kH264Codec(97, "H264");
42const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020043const cricket::DataCodec kGoogleDataCodec(101, "google-data");
44const uint32_t kSsrc1 = 0x1111;
45const uint32_t kSsrc2 = 0x2222;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020046const int kAudioPts[] = {0, 8};
47const int kVideoPts[] = {97, 99};
48enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080049const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
deadbeefcbecd352015-09-23 11:50:27 -070052template <class ChannelT,
53 class MediaChannelT,
54 class ContentT,
55 class CodecT,
56 class MediaInfoT,
57 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class Traits {
59 public:
60 typedef ChannelT Channel;
61 typedef MediaChannelT MediaChannel;
62 typedef ContentT Content;
63 typedef CodecT Codec;
64 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020065 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066};
67
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068class VoiceTraits : public Traits<cricket::VoiceChannel,
69 cricket::FakeVoiceMediaChannel,
70 cricket::AudioContentDescription,
71 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020072 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070073 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
75class VideoTraits : public Traits<cricket::VideoChannel,
76 cricket::FakeVideoMediaChannel,
77 cricket::VideoContentDescription,
78 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070080 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081
deadbeef953c2ce2017-01-09 14:53:41 -080082class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 cricket::FakeDataMediaChannel,
84 cricket::DataContentDescription,
85 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
deadbeef953c2ce2017-01-09 14:53:41 -080089// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090template<class T>
91class ChannelTest : public testing::Test, public sigslot::has_slots<> {
92 public:
deadbeefac22f702017-01-12 21:59:29 -080093 enum Flags {
94 RTCP_MUX = 0x1,
95 RTCP_MUX_REQUIRED = 0x2,
96 SECURE = 0x4,
97 SSRC_MUX = 0x8,
98 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080099 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800100 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700101 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700102 GCM_CIPHER = 0x40,
103 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800104 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105
Peter Boström34fbfff2015-09-24 19:20:30 +0200106 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200107 rtc::ArrayView<const uint8_t> rtp_data,
108 rtc::ArrayView<const uint8_t> rtcp_data,
109 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200110 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200111 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800112 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200113 if (network_is_worker == NetworkIsWorker::Yes) {
114 network_thread_ = rtc::Thread::Current();
115 } else {
116 network_thread_keeper_ = rtc::Thread::Create();
117 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200118 network_thread_ = network_thread_keeper_.get();
119 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200120 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800123 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
124 nullptr, typename T::Options()),
125 rtc::MakeUnique<typename T::MediaChannel>(
126 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 }
Steve Anton8699a322017-11-06 15:53:33 -0800129 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
130 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200131 int flags1,
132 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800133 // Network thread is started in CreateChannels, to allow the test to
134 // configure a fake clock before any threads are spawned and attempt to
135 // access the time.
136 if (network_thread_keeper_) {
137 network_thread_keeper_->Start();
138 }
deadbeefac22f702017-01-12 21:59:29 -0800139 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800140 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
141 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
142 // Make sure if using raw packet transports, they're used for both
143 // channels.
144 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200145 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800146 media_channel1_ = ch1.get();
147 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800148 rtc::PacketTransportInternal* rtp1 = nullptr;
149 rtc::PacketTransportInternal* rtcp1 = nullptr;
150 rtc::PacketTransportInternal* rtp2 = nullptr;
151 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800152 // Based on flags, create fake DTLS or raw packet transports.
153 if (flags1 & RAW_PACKET_TRANSPORT) {
154 fake_rtp_packet_transport1_.reset(
155 new rtc::FakePacketTransport("channel1_rtp"));
156 rtp1 = fake_rtp_packet_transport1_.get();
157 if (!(flags1 & RTCP_MUX_REQUIRED)) {
158 fake_rtcp_packet_transport1_.reset(
159 new rtc::FakePacketTransport("channel1_rtcp"));
160 rtcp1 = fake_rtcp_packet_transport1_.get();
161 }
162 } else {
163 // Confirmed to work with KT_RSA and KT_ECDSA.
164 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
165 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
166 rtp1 = fake_rtp_dtls_transport1_.get();
167 if (!(flags1 & RTCP_MUX_REQUIRED)) {
168 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
169 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
170 rtcp1 = fake_rtcp_dtls_transport1_.get();
171 }
172 if (flags1 & DTLS) {
173 auto cert1 =
174 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
175 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
176 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
177 if (fake_rtcp_dtls_transport1_) {
178 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
179 }
180 }
jbauch5869f502017-06-29 12:31:36 -0700181 if (flags1 & ENCRYPTED_HEADERS) {
182 rtc::CryptoOptions crypto_options;
183 crypto_options.enable_encrypted_rtp_header_extensions = true;
184 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
185 if (fake_rtcp_dtls_transport1_) {
186 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
187 }
188 }
189 if (flags1 & GCM_CIPHER) {
190 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
191 rtc::SRTP_AEAD_AES_256_GCM);
192 if (fake_rtcp_dtls_transport1_) {
193 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
194 rtc::SRTP_AEAD_AES_256_GCM);
195 }
196 }
deadbeeff5346592017-01-24 21:51:21 -0800197 }
198 // Based on flags, create fake DTLS or raw packet transports.
199 if (flags2 & RAW_PACKET_TRANSPORT) {
200 fake_rtp_packet_transport2_.reset(
201 new rtc::FakePacketTransport("channel2_rtp"));
202 rtp2 = fake_rtp_packet_transport2_.get();
203 if (!(flags2 & RTCP_MUX_REQUIRED)) {
204 fake_rtcp_packet_transport2_.reset(
205 new rtc::FakePacketTransport("channel2_rtcp"));
206 rtcp2 = fake_rtcp_packet_transport2_.get();
207 }
208 } else {
209 // Confirmed to work with KT_RSA and KT_ECDSA.
210 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
211 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
212 rtp2 = fake_rtp_dtls_transport2_.get();
213 if (!(flags2 & RTCP_MUX_REQUIRED)) {
214 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
215 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
216 rtcp2 = fake_rtcp_dtls_transport2_.get();
217 }
218 if (flags2 & DTLS) {
219 auto cert2 =
220 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
221 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
222 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
223 if (fake_rtcp_dtls_transport2_) {
224 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
225 }
226 }
jbauch5869f502017-06-29 12:31:36 -0700227 if (flags2 & ENCRYPTED_HEADERS) {
228 rtc::CryptoOptions crypto_options;
229 crypto_options.enable_encrypted_rtp_header_extensions = true;
230 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
231 if (fake_rtcp_dtls_transport2_) {
232 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
233 }
234 }
235 if (flags2 & GCM_CIPHER) {
236 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
237 rtc::SRTP_AEAD_AES_256_GCM);
238 if (fake_rtcp_dtls_transport2_) {
239 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
240 rtc::SRTP_AEAD_AES_256_GCM);
241 }
242 }
deadbeeff5346592017-01-24 21:51:21 -0800243 }
Steve Anton8699a322017-11-06 15:53:33 -0800244 channel1_ =
245 CreateChannel(worker_thread, network_thread_, &media_engine_,
246 std::move(ch1), fake_rtp_dtls_transport1_.get(),
247 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
248 channel2_ =
249 CreateChannel(worker_thread, network_thread_, &media_engine_,
250 std::move(ch2), fake_rtp_dtls_transport2_.get(),
251 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200252 channel1_->SignalMediaMonitor.connect(this,
253 &ChannelTest<T>::OnMediaMonitor1);
254 channel2_->SignalMediaMonitor.connect(this,
255 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800256 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800257 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800258 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800259 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000260 if ((flags1 & DTLS) && (flags2 & DTLS)) {
261 flags1 = (flags1 & ~SECURE);
262 flags2 = (flags2 & ~SECURE);
263 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000264 CreateContent(flags1, kPcmuCodec, kH264Codec,
265 &local_media_content1_);
266 CreateContent(flags2, kPcmuCodec, kH264Codec,
267 &local_media_content2_);
268 CopyContent(local_media_content1_, &remote_media_content1_);
269 CopyContent(local_media_content2_, &remote_media_content2_);
270
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000271 // Add stream information (SSRC) to the local content but not to the remote
272 // content. This means that we per default know the SSRC of what we send but
273 // not what we receive.
274 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
275 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
276
277 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
278 if (flags1 & SSRC_MUX) {
279 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
280 }
281 if (flags2 & SSRC_MUX) {
282 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
283 }
284 }
Steve Anton8699a322017-11-06 15:53:33 -0800285 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200286 rtc::Thread* worker_thread,
287 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700288 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800289 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800290 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
291 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800292 rtc::PacketTransportInternal* fake_rtp_packet_transport,
293 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700294 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800295 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800296 auto channel = rtc::MakeUnique<typename T::Channel>(
297 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800298 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
299 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800300 if (!channel->NeedsRtcpTransport()) {
301 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800302 }
Steve Anton8699a322017-11-06 15:53:33 -0800303 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
304 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000305 return channel;
306 }
307
deadbeeff5346592017-01-24 21:51:21 -0800308 void ConnectFakeTransports() {
309 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
310 bool asymmetric = false;
311 // Depending on test flags, could be using DTLS or raw packet transport.
312 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
313 fake_rtp_dtls_transport1_->SetDestination(
314 fake_rtp_dtls_transport2_.get(), asymmetric);
315 }
316 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
317 fake_rtcp_dtls_transport1_->SetDestination(
318 fake_rtcp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
321 fake_rtp_packet_transport1_->SetDestination(
322 fake_rtp_packet_transport2_.get(), asymmetric);
323 }
324 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
325 fake_rtcp_packet_transport1_->SetDestination(
326 fake_rtcp_packet_transport2_.get(), asymmetric);
327 }
328 });
329 }
330
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000332 bool result = channel1_->SetLocalContent(&local_media_content1_,
333 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 if (result) {
335 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 result = channel2_->SetRemoteContent(&remote_media_content1_,
337 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800339 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetLocalContent(&local_media_content2_,
341 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 }
343 }
344 return result;
345 }
346
347 bool SendAccept() {
348 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 return channel1_->SetRemoteContent(&remote_media_content2_,
350 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 }
352
353 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000354 bool result = channel1_->SetLocalContent(&local_media_content1_,
355 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356 if (result) {
357 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 result = channel2_->SetRemoteContent(&remote_media_content1_,
359 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 }
361 return result;
362 }
363
364 bool SendProvisionalAnswer() {
365 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000366 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 if (result) {
368 channel2_->Enable(true);
369 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000370 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800371 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372 }
373 return result;
374 }
375
376 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000377 bool result = channel2_->SetLocalContent(&local_media_content2_,
378 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000380 result = channel1_->SetRemoteContent(&remote_media_content2_,
381 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000382 return result;
383 }
384
deadbeeff5346592017-01-24 21:51:21 -0800385 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 channel1_.reset();
387 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800388 fake_rtp_dtls_transport1_.reset();
389 fake_rtcp_dtls_transport1_.reset();
390 fake_rtp_dtls_transport2_.reset();
391 fake_rtcp_dtls_transport2_.reset();
392 fake_rtp_packet_transport1_.reset();
393 fake_rtcp_packet_transport1_.reset();
394 fake_rtp_packet_transport2_.reset();
395 fake_rtcp_packet_transport2_.reset();
396 if (network_thread_keeper_) {
397 network_thread_keeper_.reset();
398 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 return true;
400 }
401
402 bool AddStream1(int id) {
403 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
404 }
405 bool RemoveStream1(int id) {
406 return channel1_->RemoveRecvStream(id);
407 }
408
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200409 void SendRtp1() {
410 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
411 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendRtp2() {
414 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
415 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendRtcp1() {
418 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendRtcp2() {
421 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
423 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200424 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
425 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
426 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
429 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
430 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 void SendCustomRtcp1(uint32_t ssrc) {
433 rtc::Buffer data = CreateRtcpData(ssrc);
434 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 void SendCustomRtcp2(uint32_t ssrc) {
437 rtc::Buffer data = CreateRtcpData(ssrc);
438 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 }
444 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
447 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200454 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200455 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
456 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200458 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200459 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
460 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200462 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200463 rtc::Buffer data = CreateRtcpData(ssrc);
464 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200466 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200467 rtc::Buffer data = CreateRtcpData(ssrc);
468 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
471 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::SetBE32(data.data() + 8, ssrc);
474 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000475 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000477 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 return data;
479 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200480 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
481 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 return data;
485 }
486
487 bool CheckNoRtp1() {
488 return media_channel1_->CheckNoRtp();
489 }
490 bool CheckNoRtp2() {
491 return media_channel2_->CheckNoRtp();
492 }
493 bool CheckNoRtcp1() {
494 return media_channel1_->CheckNoRtcp();
495 }
496 bool CheckNoRtcp2() {
497 return media_channel2_->CheckNoRtcp();
498 }
499
500 void CreateContent(int flags,
501 const cricket::AudioCodec& audio_codec,
502 const cricket::VideoCodec& video_codec,
503 typename T::Content* content) {
504 // overridden in specialized classes
505 }
506 void CopyContent(const typename T::Content& source,
507 typename T::Content* content) {
508 // overridden in specialized classes
509 }
510
Steve Anton18ee1d52017-09-11 11:32:35 -0700511 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700513 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
514 typename T::Content* content = new typename T::Content();
515 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
516 AddLegacyStreamInContent(ssrc, 0, content);
517 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 }
519
ossu292d6582016-03-17 02:31:13 -0700520 // Will manage the lifetime of a CallThread, making sure it's
521 // destroyed before this object goes out of scope.
522 class ScopedCallThread {
523 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700525 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200526 : thread_(rtc::Thread::Create()),
527 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700528 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700529 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700530 }
531
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200532 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700533
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200534 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700535
536 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200537 std::unique_ptr<rtc::Thread> thread_;
538 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700539 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
542 return false; // overridden in specialized classes
543 }
544
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200545 void OnMediaMonitor1(typename T::Channel* channel,
546 const typename T::MediaInfo& info) {
547 RTC_DCHECK_EQ(channel, channel1_.get());
548 media_info_callbacks1_++;
549 }
550 void OnMediaMonitor2(typename T::Channel* channel,
551 const typename T::MediaInfo& info) {
552 RTC_DCHECK_EQ(channel, channel2_.get());
553 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 }
deadbeeff5346592017-01-24 21:51:21 -0800555 void OnRtcpMuxFullyActive1(const std::string&) {
556 rtcp_mux_activated_callbacks1_++;
557 }
558 void OnRtcpMuxFullyActive2(const std::string&) {
559 rtcp_mux_activated_callbacks2_++;
560 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561
Honghai Zhangcc411c02016-03-29 17:27:21 -0700562 cricket::CandidatePairInterface* last_selected_candidate_pair() {
563 return last_selected_candidate_pair_;
564 }
565
Peter Boström0c4e06b2015-10-07 12:23:21 +0200566 void AddLegacyStreamInContent(uint32_t ssrc,
567 int flags,
568 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569 // Base implementation.
570 }
571
572 // Tests that can be used by derived classes.
573
574 // Basic sanity check.
575 void TestInit() {
576 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700577 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200579 if (verify_playout_) {
580 EXPECT_FALSE(media_channel1_->playout());
581 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 EXPECT_TRUE(media_channel1_->codecs().empty());
583 EXPECT_TRUE(media_channel1_->recv_streams().empty());
584 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
585 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
586 }
587
588 // Test that SetLocalContent and SetRemoteContent properly configure
589 // the codecs.
590 void TestSetContents() {
591 CreateChannels(0, 0);
592 typename T::Content content;
593 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000594 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000596 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 ASSERT_EQ(1U, media_channel1_->codecs().size());
598 EXPECT_TRUE(CodecMatches(content.codecs()[0],
599 media_channel1_->codecs()[0]));
600 }
601
602 // Test that SetLocalContent and SetRemoteContent properly deals
603 // with an empty offer.
604 void TestSetContentsNullOffer() {
605 CreateChannels(0, 0);
606 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000607 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 CreateContent(0, kPcmuCodec, kH264Codec, &content);
609 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000610 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 ASSERT_EQ(1U, media_channel1_->codecs().size());
612 EXPECT_TRUE(CodecMatches(content.codecs()[0],
613 media_channel1_->codecs()[0]));
614 }
615
616 // Test that SetLocalContent and SetRemoteContent properly set RTCP
617 // mux.
618 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800619 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 typename T::Content content;
621 CreateContent(0, kPcmuCodec, kH264Codec, &content);
622 // Both sides agree on mux. Should no longer be a separate RTCP channel.
623 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000624 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
625 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000627 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000629 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 }
631
632 // Test that SetLocalContent and SetRemoteContent properly set RTCP
633 // mux when a provisional answer is received.
634 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800635 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 typename T::Content content;
637 CreateContent(0, kPcmuCodec, kH264Codec, &content);
638 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000639 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
640 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800641 // Both sides agree on mux. Should signal RTCP mux as fully activated.
642 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800644 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000646 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000648 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800650 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 }
652
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 // Test that Add/RemoveStream properly forward to the media channel.
654 void TestStreams() {
655 CreateChannels(0, 0);
656 EXPECT_TRUE(AddStream1(1));
657 EXPECT_TRUE(AddStream1(2));
658 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
659 EXPECT_TRUE(RemoveStream1(2));
660 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
661 EXPECT_TRUE(RemoveStream1(1));
662 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
663 }
664
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 // Test that SetLocalContent and SetRemoteContent properly
666 // handles adding and removing StreamParams when the action is a full
667 // CA_OFFER / CA_ANSWER.
668 void TestChangeStreamParamsInContent() {
669 cricket::StreamParams stream1;
670 stream1.groupid = "group1";
671 stream1.id = "stream1";
672 stream1.ssrcs.push_back(kSsrc1);
673 stream1.cname = "stream1_cname";
674
675 cricket::StreamParams stream2;
676 stream2.groupid = "group1";
677 stream2.id = "stream2";
678 stream2.ssrcs.push_back(kSsrc2);
679 stream2.cname = "stream2_cname";
680
681 // Setup a call where channel 1 send |stream1| to channel 2.
682 CreateChannels(0, 0);
683 typename T::Content content1;
684 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
685 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000686 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_TRUE(channel1_->Enable(true));
688 EXPECT_EQ(1u, media_channel1_->send_streams().size());
689
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800692 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693
694 // Channel 2 do not send anything.
695 typename T::Content content2;
696 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000697 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 EXPECT_TRUE(channel2_->Enable(true));
701 EXPECT_EQ(0u, media_channel2_->send_streams().size());
702
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200703 SendCustomRtp1(kSsrc1, 0);
704 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
706
707 // Let channel 2 update the content by sending |stream2| and enable SRTP.
708 typename T::Content content3;
709 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
710 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000711 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 ASSERT_EQ(1u, media_channel2_->send_streams().size());
713 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
714
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000715 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
717 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
718
719 // Channel 1 replies but stop sending stream1.
720 typename T::Content content4;
721 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000722 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 EXPECT_EQ(0u, media_channel1_->send_streams().size());
724
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000725 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
727
Zhi Huangcf990f52017-09-22 12:12:30 -0700728 EXPECT_TRUE(channel1_->srtp_active());
729 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200730 SendCustomRtp2(kSsrc2, 0);
731 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
733 }
734
jbauch5869f502017-06-29 12:31:36 -0700735 enum EncryptedHeaderTestScenario {
736 // Offer/Answer are processed before DTLS completes.
737 DEFAULT,
738 // DTLS completes before any Offer/Answer have been sent.
739 DTLS_BEFORE_OFFER_ANSWER,
740 // DTLS completes after channel 2 has processed (remote) Offer and (local)
741 // Answer.
742 DTLS_AFTER_CHANNEL2_READY,
743 };
744
745 // Test that encrypted header extensions are working and can be changed when
746 // sending a new OFFER/ANSWER.
747 void TestChangeEncryptedHeaderExtensions(int flags,
748 EncryptedHeaderTestScenario scenario = DEFAULT) {
749 RTC_CHECK(scenario == 0 || (flags & DTLS));
750 struct PacketListener : public sigslot::has_slots<> {
751 PacketListener() {}
752 void OnReadPacket(rtc::PacketTransportInternal* transport,
753 const char* data, size_t size, const rtc::PacketTime& time,
754 int flags) {
755 CompareHeaderExtensions(
756 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
757 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
758 false);
759 }
760 std::vector<int> encrypted_headers;
761 } packet_listener1, packet_listener2;
762
763 cricket::StreamParams stream1;
764 stream1.groupid = "group1";
765 stream1.id = "stream1";
766 stream1.ssrcs.push_back(kSsrc1);
767 stream1.cname = "stream1_cname";
768
769 cricket::StreamParams stream2;
770 stream2.groupid = "group1";
771 stream2.id = "stream2";
772 stream2.ssrcs.push_back(kSsrc2);
773 stream2.cname = "stream2_cname";
774
775 // Use SRTP when testing encrypted extensions.
776 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
777 // Enable SDES if channel is not using DTLS.
778 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
779
780 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
781 // Make sure to use URIs that are supported for encryption.
782 cricket::RtpHeaderExtensions extensions1;
783 extensions1.push_back(
784 RtpExtension(RtpExtension::kAudioLevelUri, 10));
785 extensions1.push_back(
786 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
787
788 cricket::RtpHeaderExtensions extensions2;
789 extensions2.push_back(
790 RtpExtension(RtpExtension::kAudioLevelUri, 10));
791 extensions2.push_back(
792 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
793 extensions2.push_back(
794 RtpExtension(RtpExtension::kVideoRotationUri, 3));
795 extensions2.push_back(
796 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
797
798 // Setup a call where channel 1 send |stream1| to channel 2.
799 CreateChannels(channel_flags, channel_flags);
800 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
801 &packet_listener1, &PacketListener::OnReadPacket);
802 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
803 &packet_listener2, &PacketListener::OnReadPacket);
804
805 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
806 ConnectFakeTransports();
807 WaitForThreads();
808 }
809
810 typename T::Content content1;
811 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
812 content1.AddStream(stream1);
813 content1.set_rtp_header_extensions(extensions1);
814 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
815 EXPECT_TRUE(channel1_->Enable(true));
816 EXPECT_EQ(1u, media_channel1_->send_streams().size());
817 packet_listener1.encrypted_headers.push_back(1);
818
819 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
820 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
821
822 // Channel 2 sends back |stream2|.
823 typename T::Content content2;
824 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
825 content2.AddStream(stream2);
826 content2.set_rtp_header_extensions(extensions1);
827 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
828 EXPECT_TRUE(channel2_->Enable(true));
829 EXPECT_EQ(1u, media_channel2_->send_streams().size());
830 packet_listener2.encrypted_headers.push_back(1);
831
832 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
833 ConnectFakeTransports();
834 WaitForThreads();
835 }
836
837 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
838 scenario == DTLS_AFTER_CHANNEL2_READY) {
839 // In both scenarios with partially completed Offer/Answer, sending
840 // packets from Channel 2 to Channel 1 should work.
841 SendCustomRtp2(kSsrc2, 0);
842 WaitForThreads();
843 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
844 }
845
846 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
847 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
848
849 if (scenario == DEFAULT) {
850 ConnectFakeTransports();
851 WaitForThreads();
852 }
853
854 SendCustomRtp1(kSsrc1, 0);
855 SendCustomRtp2(kSsrc2, 0);
856 WaitForThreads();
857 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
858 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
859
860 // Let channel 2 update the encrypted header extensions.
861 typename T::Content content3;
862 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
863 content3.AddStream(stream2);
864 content3.set_rtp_header_extensions(extensions2);
865 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
866 ASSERT_EQ(1u, media_channel2_->send_streams().size());
867 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
868 packet_listener2.encrypted_headers.clear();
869 packet_listener2.encrypted_headers.push_back(2);
870 packet_listener2.encrypted_headers.push_back(4);
871
872 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
873 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
874 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
875
876 // Channel 1 is already sending the new encrypted extensions. These
877 // can be decrypted by channel 2. Channel 2 is still sending the old
878 // encrypted extensions (which can be decrypted by channel 1).
879
880 if (flags & DTLS) {
881 // DTLS supports updating the encrypted extensions with only the OFFER
882 // being processed. For SDES both the OFFER and ANSWER must have been
883 // processed to update encrypted extensions, so we can't check this case.
884 SendCustomRtp1(kSsrc1, 0);
885 SendCustomRtp2(kSsrc2, 0);
886 WaitForThreads();
887 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
888 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
889 }
890
891 // Channel 1 replies with the same extensions.
892 typename T::Content content4;
893 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
894 content4.AddStream(stream1);
895 content4.set_rtp_header_extensions(extensions2);
896 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
897 EXPECT_EQ(1u, media_channel1_->send_streams().size());
898 packet_listener1.encrypted_headers.clear();
899 packet_listener1.encrypted_headers.push_back(2);
900 packet_listener1.encrypted_headers.push_back(4);
901
902 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
903 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
904
905 SendCustomRtp1(kSsrc1, 0);
906 SendCustomRtp2(kSsrc2, 0);
907 WaitForThreads();
908 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
909 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
910 }
911
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912 // Test that we only start playout and sending at the right times.
913 void TestPlayoutAndSendingStates() {
914 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200915 if (verify_playout_) {
916 EXPECT_FALSE(media_channel1_->playout());
917 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200919 if (verify_playout_) {
920 EXPECT_FALSE(media_channel2_->playout());
921 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922 EXPECT_FALSE(media_channel2_->sending());
923 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200924 if (verify_playout_) {
925 EXPECT_FALSE(media_channel1_->playout());
926 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000928 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
929 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200930 if (verify_playout_) {
931 EXPECT_TRUE(media_channel1_->playout());
932 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000934 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
935 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200936 if (verify_playout_) {
937 EXPECT_FALSE(media_channel2_->playout());
938 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000940 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
941 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200942 if (verify_playout_) {
943 EXPECT_FALSE(media_channel2_->playout());
944 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800946 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200947 if (verify_playout_) {
948 EXPECT_TRUE(media_channel1_->playout());
949 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200951 if (verify_playout_) {
952 EXPECT_FALSE(media_channel2_->playout());
953 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954 EXPECT_FALSE(media_channel2_->sending());
955 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200956 if (verify_playout_) {
957 EXPECT_TRUE(media_channel2_->playout());
958 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000960 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
961 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200962 if (verify_playout_) {
963 EXPECT_TRUE(media_channel1_->playout());
964 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 EXPECT_TRUE(media_channel1_->sending());
966 }
967
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 // Test that changing the MediaContentDirection in the local and remote
969 // session description start playout and sending at the right time.
970 void TestMediaContentDirection() {
971 CreateChannels(0, 0);
972 typename T::Content content1;
973 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
974 typename T::Content content2;
975 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
976 // Set |content2| to be InActive.
977 content2.set_direction(cricket::MD_INACTIVE);
978
979 EXPECT_TRUE(channel1_->Enable(true));
980 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200981 if (verify_playout_) {
982 EXPECT_FALSE(media_channel1_->playout());
983 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200985 if (verify_playout_) {
986 EXPECT_FALSE(media_channel2_->playout());
987 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 EXPECT_FALSE(media_channel2_->sending());
989
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000990 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
991 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
992 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
993 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800994 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995
Peter Boström34fbfff2015-09-24 19:20:30 +0200996 if (verify_playout_) {
997 EXPECT_TRUE(media_channel1_->playout());
998 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001000 if (verify_playout_) {
1001 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1002 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1004
1005 // Update |content2| to be RecvOnly.
1006 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001007 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1008 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009
Peter Boström34fbfff2015-09-24 19:20:30 +02001010 if (verify_playout_) {
1011 EXPECT_TRUE(media_channel1_->playout());
1012 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001014 if (verify_playout_) {
1015 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1016 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1018
1019 // Update |content2| to be SendRecv.
1020 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001021 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1022 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023
Peter Boström34fbfff2015-09-24 19:20:30 +02001024 if (verify_playout_) {
1025 EXPECT_TRUE(media_channel1_->playout());
1026 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001028 if (verify_playout_) {
1029 EXPECT_TRUE(media_channel2_->playout());
1030 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 EXPECT_TRUE(media_channel2_->sending());
1032 }
1033
Honghai Zhangcc411c02016-03-29 17:27:21 -07001034 // Tests that when the transport channel signals a candidate pair change
1035 // event, the media channel will receive a call on the network route change.
1036 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001037 static constexpr uint16_t kLocalNetId = 1;
1038 static constexpr uint16_t kRemoteNetId = 2;
1039 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001040 // Ipv4(20) + UDP(8).
1041 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001042
Honghai Zhangcc411c02016-03-29 17:27:21 -07001043 CreateChannels(0, 0);
1044
Honghai Zhangcc411c02016-03-29 17:27:21 -07001045 typename T::MediaChannel* media_channel1 =
1046 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001047 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001048
Zhi Huang942bc2e2017-11-13 13:26:07 -08001049 // Need to wait for the threads before calling
1050 // |set_num_network_route_changes| because the network route would be set
1051 // when creating the channel.
1052 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001053 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001054 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001055 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001056 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001057 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1058
1059 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001060 });
1061 WaitForThreads();
1062 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001063 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001064 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001065
eladalon05b07bb2017-08-24 07:40:16 -07001066 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001067 rtc::NetworkRoute network_route;
1068 network_route.connected = true;
1069 network_route.local_network_id = kLocalNetId;
1070 network_route.remote_network_id = kRemoteNetId;
1071 network_route.last_sent_packet_id = kLastPacketId;
1072 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001073 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001074 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1075
1076 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001077 });
1078 WaitForThreads();
1079 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001080 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001081 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001082 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001084 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001085 EXPECT_EQ(kTransportOverheadPerPacket,
1086 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001087 }
1088
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089 // Test setting up a call.
1090 void TestCallSetup() {
1091 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001092 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001094 if (verify_playout_) {
1095 EXPECT_TRUE(media_channel1_->playout());
1096 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_FALSE(media_channel1_->sending());
1098 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001099 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(media_channel1_->sending());
1101 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001102 if (verify_playout_) {
1103 EXPECT_TRUE(media_channel2_->playout());
1104 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_TRUE(media_channel2_->sending());
1106 EXPECT_EQ(1U, media_channel2_->codecs().size());
1107 }
1108
1109 // Test that we don't crash if packets are sent during call teardown
1110 // when RTCP mux is enabled. This is a regression test against a specific
1111 // race condition that would only occur when a RTCP packet was sent during
1112 // teardown of a channel on which RTCP mux was enabled.
1113 void TestCallTeardownRtcpMux() {
1114 class LastWordMediaChannel : public T::MediaChannel {
1115 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001116 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001118 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1119 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1121 }
1122 };
Steve Anton8699a322017-11-06 15:53:33 -08001123 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1124 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_TRUE(SendInitiate());
1126 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001127 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 }
1129
1130 // Send voice RTP data to the other side and ensure it gets there.
1131 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001132 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 EXPECT_TRUE(SendInitiate());
1134 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001135 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1136 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001137 SendRtp1();
1138 SendRtp2();
1139 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(CheckRtp1());
1141 EXPECT_TRUE(CheckRtp2());
1142 EXPECT_TRUE(CheckNoRtp1());
1143 EXPECT_TRUE(CheckNoRtp2());
1144 }
1145
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001146 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001147 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001148 EXPECT_TRUE(SendInitiate());
1149 EXPECT_TRUE(SendAccept());
1150 SendRtp1();
1151 SendRtp2();
1152 SendRtcp1();
1153 SendRtcp2();
1154 // Do not wait, destroy channels.
1155 channel1_.reset(nullptr);
1156 channel2_.reset(nullptr);
1157 }
1158
deadbeefac22f702017-01-12 21:59:29 -08001159 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001161 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(SendInitiate());
1163 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001164 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1165 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001166 SendRtcp1();
1167 SendRtcp2();
1168 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(CheckRtcp1());
1170 EXPECT_TRUE(CheckRtcp2());
1171 EXPECT_TRUE(CheckNoRtcp1());
1172 EXPECT_TRUE(CheckNoRtcp2());
1173 }
1174
1175 // Check that RTCP is transmitted if only the initiator supports mux.
1176 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001177 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 EXPECT_TRUE(SendInitiate());
1179 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001180 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1181 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001182 SendRtcp1();
1183 SendRtcp2();
1184 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 EXPECT_TRUE(CheckRtcp1());
1186 EXPECT_TRUE(CheckRtcp2());
1187 EXPECT_TRUE(CheckNoRtcp1());
1188 EXPECT_TRUE(CheckNoRtcp2());
1189 }
1190
1191 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1192 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001193 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001195 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1196 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1197 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001199 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1200 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001201 SendRtp1();
1202 SendRtp2();
1203 SendRtcp1();
1204 SendRtcp2();
1205 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206 EXPECT_TRUE(CheckRtp1());
1207 EXPECT_TRUE(CheckRtp2());
1208 EXPECT_TRUE(CheckNoRtp1());
1209 EXPECT_TRUE(CheckNoRtp2());
1210 EXPECT_TRUE(CheckRtcp1());
1211 EXPECT_TRUE(CheckRtcp2());
1212 EXPECT_TRUE(CheckNoRtcp1());
1213 EXPECT_TRUE(CheckNoRtcp2());
1214 }
1215
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001216 // Check that RTP and RTCP are transmitted ok when both sides
1217 // support mux and one the offerer requires mux.
1218 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001219 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001220 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001221 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1222 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001223 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001224 SendRtp1();
1225 SendRtp2();
1226 SendRtcp1();
1227 SendRtcp2();
1228 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001229 EXPECT_TRUE(CheckRtp1());
1230 EXPECT_TRUE(CheckRtp2());
1231 EXPECT_TRUE(CheckNoRtp1());
1232 EXPECT_TRUE(CheckNoRtp2());
1233 EXPECT_TRUE(CheckRtcp1());
1234 EXPECT_TRUE(CheckRtcp2());
1235 EXPECT_TRUE(CheckNoRtcp1());
1236 EXPECT_TRUE(CheckNoRtcp2());
1237 }
1238
1239 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001240 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001241 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001242 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001243 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001244 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1245 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1246 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001247 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001248 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1249 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001250 SendRtp1();
1251 SendRtp2();
1252 SendRtcp1();
1253 SendRtcp2();
1254 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001255 EXPECT_TRUE(CheckRtp1());
1256 EXPECT_TRUE(CheckRtp2());
1257 EXPECT_TRUE(CheckNoRtp1());
1258 EXPECT_TRUE(CheckNoRtp2());
1259 EXPECT_TRUE(CheckRtcp1());
1260 EXPECT_TRUE(CheckRtcp2());
1261 EXPECT_TRUE(CheckNoRtcp1());
1262 EXPECT_TRUE(CheckNoRtcp2());
1263 }
1264
1265 // Check that RTP and RTCP are transmitted ok when both sides
1266 // require mux.
1267 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001268 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001269 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001270 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1271 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001272 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001273 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001274 SendRtp1();
1275 SendRtp2();
1276 SendRtcp1();
1277 SendRtcp2();
1278 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001279 EXPECT_TRUE(CheckRtp1());
1280 EXPECT_TRUE(CheckRtp2());
1281 EXPECT_TRUE(CheckNoRtp1());
1282 EXPECT_TRUE(CheckNoRtp2());
1283 EXPECT_TRUE(CheckRtcp1());
1284 EXPECT_TRUE(CheckRtcp2());
1285 EXPECT_TRUE(CheckNoRtcp1());
1286 EXPECT_TRUE(CheckNoRtcp2());
1287 }
1288
1289 // Check that SendAccept fails if the answerer doesn't support mux
1290 // and the offerer requires it.
1291 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001292 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001293 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001294 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1295 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001296 EXPECT_FALSE(SendAccept());
1297 }
1298
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001299 // Check that RTCP data sent by the initiator before the accept is not muxed.
1300 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001301 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001303 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1304 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305
1306 // RTCP can be sent before the call is accepted, if the transport is ready.
1307 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001308 SendRtcp1();
1309 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001310 EXPECT_TRUE(CheckNoRtp2());
1311 EXPECT_TRUE(CheckRtcp2());
1312
1313 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001314 SendRtcp2();
1315 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 EXPECT_TRUE(CheckNoRtp1());
1317 EXPECT_TRUE(CheckRtcp1());
1318
1319 // Complete call setup and ensure everything is still OK.
1320 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001321 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001322 SendRtcp1();
1323 SendRtcp2();
1324 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(CheckRtcp1());
1327 }
1328
1329
1330 // Check that RTCP data is not muxed until both sides have enabled muxing,
1331 // but that we properly demux before we get the accept message, since there
1332 // is a race between RTP data and the jingle accept.
1333 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001334 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001336 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1337 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001338
1339 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1340 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001341 SendRtcp1();
1342 WaitForThreads();
1343 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344
1345 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 SendRtcp2();
1347 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001348 EXPECT_TRUE(CheckNoRtp1());
1349 EXPECT_TRUE(CheckRtcp1());
1350
1351 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001352 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001354 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1355 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001356 SendRtcp1();
1357 SendRtcp2();
1358 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001359 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(CheckRtcp1());
1361 }
1362
1363 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001364 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001366 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1367 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368
deadbeefac22f702017-01-12 21:59:29 -08001369 int flags1 = SECURE | flags1_in;
1370 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 bool dtls1 = !!(flags1_in & DTLS);
1372 bool dtls2 = !!(flags2_in & DTLS);
1373 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001374 EXPECT_FALSE(channel1_->srtp_active());
1375 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001377 WaitForThreads();
1378 EXPECT_TRUE(channel1_->writable());
1379 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001381 EXPECT_TRUE(channel1_->srtp_active());
1382 EXPECT_TRUE(channel2_->srtp_active());
1383 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1384 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001385 SendRtp1();
1386 SendRtp2();
1387 SendRtcp1();
1388 SendRtcp2();
1389 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001390 EXPECT_TRUE(CheckRtp1());
1391 EXPECT_TRUE(CheckRtp2());
1392 EXPECT_TRUE(CheckNoRtp1());
1393 EXPECT_TRUE(CheckNoRtp2());
1394 EXPECT_TRUE(CheckRtcp1());
1395 EXPECT_TRUE(CheckRtcp2());
1396 EXPECT_TRUE(CheckNoRtcp1());
1397 EXPECT_TRUE(CheckNoRtcp2());
1398 }
1399
1400 // Test that we properly handling SRTP negotiating down to RTP.
1401 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001402 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001403 EXPECT_FALSE(channel1_->srtp_active());
1404 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 EXPECT_TRUE(SendInitiate());
1406 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001407 EXPECT_FALSE(channel1_->srtp_active());
1408 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001409 SendRtp1();
1410 SendRtp2();
1411 SendRtcp1();
1412 SendRtcp2();
1413 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414 EXPECT_TRUE(CheckRtp1());
1415 EXPECT_TRUE(CheckRtp2());
1416 EXPECT_TRUE(CheckNoRtp1());
1417 EXPECT_TRUE(CheckNoRtp2());
1418 EXPECT_TRUE(CheckRtcp1());
1419 EXPECT_TRUE(CheckRtcp2());
1420 EXPECT_TRUE(CheckNoRtcp1());
1421 EXPECT_TRUE(CheckNoRtcp2());
1422 }
1423
1424 // Test that we can send and receive early media when a provisional answer is
1425 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1426 void SendEarlyMediaUsingRtcpMuxSrtp() {
1427 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1428
deadbeefac22f702017-01-12 21:59:29 -08001429 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1430 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431 EXPECT_TRUE(SendOffer());
1432 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001433 EXPECT_TRUE(channel1_->srtp_active());
1434 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001435 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1436 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001437 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1438 SendCustomRtcp1(kSsrc1);
1439 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1440 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1443
1444 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001445 SendCustomRtcp2(kSsrc2);
1446 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1447 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001448 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001449 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1450
1451 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001452 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1453 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001455 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1456 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1457 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1458 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001459 EXPECT_TRUE(channel1_->srtp_active());
1460 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001461 SendCustomRtcp1(kSsrc1);
1462 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1463 SendCustomRtcp2(kSsrc2);
1464 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1465 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1470 }
1471
1472 // Test that we properly send RTP without SRTP from a thread.
1473 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001474 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001475 EXPECT_TRUE(SendInitiate());
1476 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001477 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1478 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1479 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1480 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1481 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1482 send_rtcp1.thread(),
1483 send_rtcp2.thread()};
1484 WaitForThreads(involved_threads);
1485 EXPECT_TRUE(CheckRtp1());
1486 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487 EXPECT_TRUE(CheckNoRtp1());
1488 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001489 EXPECT_TRUE(CheckRtcp1());
1490 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(CheckNoRtcp1());
1492 EXPECT_TRUE(CheckNoRtcp2());
1493 }
1494
1495 // Test that we properly send SRTP with RTCP from a thread.
1496 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001497 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 EXPECT_TRUE(SendInitiate());
1499 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001500 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1501 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1502 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1503 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1504 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1505 send_rtcp1.thread(),
1506 send_rtcp2.thread()};
1507 WaitForThreads(involved_threads);
1508 EXPECT_TRUE(CheckRtp1());
1509 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001510 EXPECT_TRUE(CheckNoRtp1());
1511 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001512 EXPECT_TRUE(CheckRtcp1());
1513 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_TRUE(CheckNoRtcp1());
1515 EXPECT_TRUE(CheckNoRtcp2());
1516 }
1517
1518 // Test that the mediachannel retains its sending state after the transport
1519 // becomes non-writable.
1520 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001521 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 EXPECT_TRUE(SendInitiate());
1523 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001524 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1525 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001526 SendRtp1();
1527 SendRtp2();
1528 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 EXPECT_TRUE(CheckRtp1());
1530 EXPECT_TRUE(CheckRtp2());
1531 EXPECT_TRUE(CheckNoRtp1());
1532 EXPECT_TRUE(CheckNoRtp2());
1533
wu@webrtc.org97077a32013-10-25 21:18:33 +00001534 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001535 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1536 fake_rtp_dtls_transport1_->SetWritable(false);
1537 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001538 SendRtp1();
1539 SendRtp2();
1540 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 EXPECT_TRUE(CheckRtp1());
1542 EXPECT_TRUE(CheckNoRtp2());
1543
1544 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001545 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1546 fake_rtp_dtls_transport1_->SetWritable(true);
1547 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001549 SendRtp1();
1550 SendRtp2();
1551 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 EXPECT_TRUE(CheckRtp1());
1553 EXPECT_TRUE(CheckRtp2());
1554 EXPECT_TRUE(CheckNoRtp1());
1555 EXPECT_TRUE(CheckNoRtp2());
1556
1557 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001558 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1559 bool asymmetric = true;
1560 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1561 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 EXPECT_TRUE(media_channel1_->sending());
1563
wu@webrtc.org97077a32013-10-25 21:18:33 +00001564 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001565 SendRtp1();
1566 SendRtp2();
1567 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 EXPECT_TRUE(CheckRtp1());
1569 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001570 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571
1572 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001573 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001574 bool asymmetric = true;
1575 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1576 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001577 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001579 SendRtp1();
1580 SendRtp2();
1581 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 EXPECT_TRUE(CheckRtp1());
1583 EXPECT_TRUE(CheckRtp2());
1584 EXPECT_TRUE(CheckNoRtp1());
1585 EXPECT_TRUE(CheckNoRtp2());
1586 }
1587
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001588 void SendBundleToBundle(
1589 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1590 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001592 // Only pl_type1 was added to the bundle filter for both |channel1_|
1593 // and |channel2_|.
1594 int pl_type1 = pl_types[0];
1595 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001596 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001597 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001598 if (rtcp_mux) {
1599 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001600 }
1601 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001603 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1604 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001606 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1607 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001608 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1609 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1610 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1611 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001612
1613 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1615 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1616 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001617 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001618 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1619 EXPECT_TRUE(CheckNoRtp1());
1620 EXPECT_TRUE(CheckNoRtp2());
1621
1622 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001623 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1624 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1625 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001626 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001627 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001629 SendCustomRtcp1(kSsrc1);
1630 SendCustomRtcp2(kSsrc2);
1631 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1633 EXPECT_TRUE(CheckNoRtcp1());
1634 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1635 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637 SendCustomRtcp1(kSsrc2);
1638 SendCustomRtcp2(kSsrc1);
1639 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001640 // Bundle filter shouldn't filter out any RTCP.
1641 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1642 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 }
1644
deadbeefc6b6e092016-12-01 12:49:20 -08001645 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 CreateChannels(0, 0);
1648 EXPECT_TRUE(SendInitiate());
1649 EXPECT_TRUE(SendAccept());
1650 channel1_->StartMediaMonitor(100);
1651 channel2_->StartMediaMonitor(100);
1652 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001653 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1654 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 channel1_->StopMediaMonitor();
1656 channel2_->StopMediaMonitor();
1657 // Ensure a restart of a stopped monitor works.
1658 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001659 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 channel1_->StopMediaMonitor();
1661 // Ensure stopping a stopped monitor is OK.
1662 channel1_->StopMediaMonitor();
1663 }
1664
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 void TestSetContentFailure() {
1666 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667
Peter Thatchera6d24442015-07-09 21:26:36 -07001668 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001669 std::unique_ptr<typename T::Content> content(
1670 CreateMediaContentWithStream(1));
1671
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001673 EXPECT_FALSE(
1674 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1675 EXPECT_FALSE(
1676 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001679 EXPECT_FALSE(
1680 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1681
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001683 EXPECT_FALSE(
1684 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685 }
1686
1687 void TestSendTwoOffers() {
1688 CreateChannels(0, 0);
1689
Peter Thatchera6d24442015-07-09 21:26:36 -07001690 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001691 std::unique_ptr<typename T::Content> content1(
1692 CreateMediaContentWithStream(1));
1693 EXPECT_TRUE(
1694 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1696
Steve Anton18ee1d52017-09-11 11:32:35 -07001697 std::unique_ptr<typename T::Content> content2(
1698 CreateMediaContentWithStream(2));
1699 EXPECT_TRUE(
1700 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1702 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1703 }
1704
1705 void TestReceiveTwoOffers() {
1706 CreateChannels(0, 0);
1707
Peter Thatchera6d24442015-07-09 21:26:36 -07001708 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001709 std::unique_ptr<typename T::Content> content1(
1710 CreateMediaContentWithStream(1));
1711 EXPECT_TRUE(
1712 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1714
Steve Anton18ee1d52017-09-11 11:32:35 -07001715 std::unique_ptr<typename T::Content> content2(
1716 CreateMediaContentWithStream(2));
1717 EXPECT_TRUE(
1718 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1720 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1721 }
1722
1723 void TestSendPrAnswer() {
1724 CreateChannels(0, 0);
1725
Peter Thatchera6d24442015-07-09 21:26:36 -07001726 std::string err;
1727 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001728 std::unique_ptr<typename T::Content> content1(
1729 CreateMediaContentWithStream(1));
1730 EXPECT_TRUE(
1731 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1733
Peter Thatchera6d24442015-07-09 21:26:36 -07001734 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001735 std::unique_ptr<typename T::Content> content2(
1736 CreateMediaContentWithStream(2));
1737 EXPECT_TRUE(
1738 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1740 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1741
Peter Thatchera6d24442015-07-09 21:26:36 -07001742 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001743 std::unique_ptr<typename T::Content> content3(
1744 CreateMediaContentWithStream(3));
1745 EXPECT_TRUE(
1746 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1748 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1749 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1750 }
1751
1752 void TestReceivePrAnswer() {
1753 CreateChannels(0, 0);
1754
Peter Thatchera6d24442015-07-09 21:26:36 -07001755 std::string err;
1756 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001757 std::unique_ptr<typename T::Content> content1(
1758 CreateMediaContentWithStream(1));
1759 EXPECT_TRUE(
1760 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1762
Peter Thatchera6d24442015-07-09 21:26:36 -07001763 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001764 std::unique_ptr<typename T::Content> content2(
1765 CreateMediaContentWithStream(2));
1766 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1767 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1769 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1770
Peter Thatchera6d24442015-07-09 21:26:36 -07001771 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001772 std::unique_ptr<typename T::Content> content3(
1773 CreateMediaContentWithStream(3));
1774 EXPECT_TRUE(
1775 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1777 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1778 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1779 }
1780
1781 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001782 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 EXPECT_TRUE(SendInitiate());
1784 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001785 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1786 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787
1788 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 // The sending message is only posted. channel2_ should be empty.
1791 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001792 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1793 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794
1795 // When channel1_ is deleted, the RTCP packet should be sent out to
1796 // channel2_.
1797 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001798 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 EXPECT_TRUE(CheckRtcp2());
1800 }
1801
zstein56162b92017-04-24 16:54:35 -07001802 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001803 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001805
zstein56162b92017-04-24 16:54:35 -07001806 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001807 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_TRUE(media_channel1_->ready_to_send());
1809
zstein56162b92017-04-24 16:54:35 -07001810 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001811 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 }
1814
zstein56162b92017-04-24 16:54:35 -07001815 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001816 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001817 typename T::Content content;
1818 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001819 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001821 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001822 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001823 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001824 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1825 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826 EXPECT_FALSE(media_channel1_->ready_to_send());
1827 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1828 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001829 network_thread_->Invoke<void>(RTC_FROM_HERE,
1830 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001831 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001833
zstein56162b92017-04-24 16:54:35 -07001834 // TODO(zstein): Find a way to test this without making
1835 // OnTransportReadyToSend public.
1836 network_thread_->Invoke<void>(
1837 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001838 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839 EXPECT_FALSE(media_channel1_->ready_to_send());
1840 }
1841
skvladdc1c62c2016-03-16 19:07:43 -07001842 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1843 typename T::Content content;
1844 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1845 content.set_bandwidth(remote_limit);
1846 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
1847 }
1848
deadbeefe702b302017-02-04 12:09:01 -08001849 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001850 webrtc::RtpParameters parameters;
1851 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001852 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001853 parameters.encodings.push_back(encoding);
1854 return parameters;
1855 }
1856
1857 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001858 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001859 EXPECT_EQ(1UL, parameters.encodings.size());
1860 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1861 }
1862
1863 void DefaultMaxBitrateIsUnlimited() {
1864 CreateChannels(0, 0);
1865 EXPECT_TRUE(
1866 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1867 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001868 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1869 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001870 }
1871
1872 void CanChangeMaxBitrate() {
1873 CreateChannels(0, 0);
1874 EXPECT_TRUE(
1875 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1876
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001877 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08001878 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
1879 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1880 rtc::Optional<int>(1000));
1881 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1882 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07001883 EXPECT_EQ(-1, media_channel1_->max_bps());
1884
deadbeefe702b302017-02-04 12:09:01 -08001885 EXPECT_TRUE(channel1_->SetRtpSendParameters(
1886 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
1887 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1888 rtc::Optional<int>());
1889 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1890 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001891 EXPECT_EQ(-1, media_channel1_->max_bps());
1892 }
1893
Steve Anton8a63f782017-10-23 13:08:53 -07001894 // Test that when a channel gets new transports with a call to
1895 // |SetTransports|, the socket options from the old transports are merged with
1896 // the options on the new transport.
1897 // For example, audio and video may use separate socket options, but initially
1898 // be unbundled, then later become bundled. When this happens, their preferred
1899 // socket options should be merged to the underlying transport they share.
1900 void SocketOptionsMergedOnSetTransport() {
1901 constexpr int kSndBufSize = 4000;
1902 constexpr int kRcvBufSize = 8000;
1903
1904 CreateChannels(0, 0);
1905
1906 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1907 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1908 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1909 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1910
1911 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1912 channel2_->rtcp_dtls_transport());
1913
1914 int option_val;
1915 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1916 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1917 EXPECT_EQ(kSndBufSize, option_val);
1918 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1919 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1920 EXPECT_EQ(kRcvBufSize, option_val);
1921 }
1922
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001924 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1925 static void ProcessThreadQueue(rtc::Thread* thread) {
1926 RTC_DCHECK(thread->IsCurrent());
1927 while (!thread->empty()) {
1928 thread->ProcessMessages(0);
1929 }
1930 }
1931 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1932 // |threads| and current thread post packets to network thread.
1933 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001934 thread->Invoke<void>(RTC_FROM_HERE,
1935 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001936 }
1937 ProcessThreadQueue(rtc::Thread::Current());
1938 // Network thread move them around and post back to worker = current thread.
1939 if (!network_thread_->IsCurrent()) {
1940 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001941 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942 }
1943 // Worker thread = current Thread process received messages.
1944 ProcessThreadQueue(rtc::Thread::Current());
1945 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001946 // TODO(pbos): Remove playout from all media channels and let renderers mute
1947 // themselves.
1948 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1950 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001951 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1952 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1953 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1954 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1955 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1956 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1957 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1958 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 cricket::FakeMediaEngine media_engine_;
1960 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001961 typename T::MediaChannel* media_channel1_ = nullptr;
1962 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001963 std::unique_ptr<typename T::Channel> channel1_;
1964 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 typename T::Content local_media_content1_;
1966 typename T::Content local_media_content2_;
1967 typename T::Content remote_media_content1_;
1968 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970 rtc::Buffer rtp_packet_;
1971 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001972 int media_info_callbacks1_ = 0;
1973 int media_info_callbacks2_ = 0;
1974 int rtcp_mux_activated_callbacks1_ = 0;
1975 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001976 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977};
1978
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979template<>
1980void ChannelTest<VoiceTraits>::CreateContent(
1981 int flags,
1982 const cricket::AudioCodec& audio_codec,
1983 const cricket::VideoCodec& video_codec,
1984 cricket::AudioContentDescription* audio) {
1985 audio->AddCodec(audio_codec);
1986 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
1987 if (flags & SECURE) {
1988 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001989 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1990 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991 }
1992}
1993
1994template<>
1995void ChannelTest<VoiceTraits>::CopyContent(
1996 const cricket::AudioContentDescription& source,
1997 cricket::AudioContentDescription* audio) {
1998 *audio = source;
1999}
2000
2001template<>
2002bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2003 const cricket::AudioCodec& c2) {
2004 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2005 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2006}
2007
Peter Boström0c4e06b2015-10-07 12:23:21 +02002008template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002009void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002010 uint32_t ssrc,
2011 int flags,
2012 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013 audio->AddLegacyStream(ssrc);
2014}
2015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002016class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017 public:
solenberg1dd98f32015-09-10 01:57:14 -07002018 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002019 VoiceChannelSingleThreadTest()
2020 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2021};
2022
2023class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2024 public:
2025 typedef ChannelTest<VoiceTraits> Base;
2026 VoiceChannelDoubleThreadTest()
2027 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028};
2029
jbauch5869f502017-06-29 12:31:36 -07002030class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2031 : public ChannelTest<VoiceTraits> {
2032 public:
2033 typedef ChannelTest<VoiceTraits> Base;
2034 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2035 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2036 NetworkIsWorker::Yes) {}
2037};
2038
2039class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2040 : public ChannelTest<VoiceTraits> {
2041 public:
2042 typedef ChannelTest<VoiceTraits> Base;
2043 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2044 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2045 NetworkIsWorker::No) {}
2046};
2047
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002049template <>
Steve Anton8699a322017-11-06 15:53:33 -08002050std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002051 rtc::Thread* worker_thread,
2052 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002053 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002054 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002055 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2056 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002057 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2058 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002059 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002060 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002061 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2062 worker_thread, network_thread, signaling_thread, std::move(ch),
2063 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2064 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002065 if (!channel->NeedsRtcpTransport()) {
2066 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002067 }
Steve Anton8699a322017-11-06 15:53:33 -08002068 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2069 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 return channel;
2071}
2072
2073// override to add 0 parameter
2074template<>
2075bool ChannelTest<VideoTraits>::AddStream1(int id) {
2076 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2077}
2078
2079template<>
2080void ChannelTest<VideoTraits>::CreateContent(
2081 int flags,
2082 const cricket::AudioCodec& audio_codec,
2083 const cricket::VideoCodec& video_codec,
2084 cricket::VideoContentDescription* video) {
2085 video->AddCodec(video_codec);
2086 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2087 if (flags & SECURE) {
2088 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002089 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2090 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 }
2092}
2093
2094template<>
2095void ChannelTest<VideoTraits>::CopyContent(
2096 const cricket::VideoContentDescription& source,
2097 cricket::VideoContentDescription* video) {
2098 *video = source;
2099}
2100
2101template<>
2102bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2103 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002104 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105}
2106
Peter Boström0c4e06b2015-10-07 12:23:21 +02002107template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002109 uint32_t ssrc,
2110 int flags,
2111 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112 video->AddLegacyStream(ssrc);
2113}
2114
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002115class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116 public:
solenberg1dd98f32015-09-10 01:57:14 -07002117 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002118 VideoChannelSingleThreadTest()
2119 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120};
2121
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002122class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2123 public:
2124 typedef ChannelTest<VideoTraits> Base;
2125 VideoChannelDoubleThreadTest()
2126 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2127};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002129TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 Base::TestInit();
2131 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2132 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2133}
2134
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002135TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2136 Base::TestDeinit();
2137}
2138
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002139TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002140 Base::TestSetContents();
2141}
2142
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002143TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144 Base::TestSetContentsNullOffer();
2145}
2146
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148 Base::TestSetContentsRtcpMux();
2149}
2150
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002151TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 Base::TestSetContentsRtcpMux();
2153}
2154
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002155TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 Base::TestStreams();
2157}
2158
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002159TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002160 Base::TestChangeStreamParamsInContent();
2161}
2162
jbauch5869f502017-06-29 12:31:36 -07002163TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2164 TestChangeEncryptedHeaderExtensionsDtls) {
2165 int flags = DTLS;
2166 Base::TestChangeEncryptedHeaderExtensions(flags);
2167}
2168
2169TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2170 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2171 int flags = DTLS;
2172 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2173}
2174
2175TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2176 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2177 int flags = DTLS;
2178 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2179}
2180
2181TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2182 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2183 int flags = DTLS | GCM_CIPHER;
2184 Base::TestChangeEncryptedHeaderExtensions(flags);
2185}
2186
2187TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2188 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2189 int flags = DTLS | GCM_CIPHER;
2190 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2191}
2192
2193TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2194 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2195 int flags = DTLS | GCM_CIPHER;
2196 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2197}
2198
2199TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2200 TestChangeEncryptedHeaderExtensionsSDES) {
2201 int flags = 0;
2202 Base::TestChangeEncryptedHeaderExtensions(flags);
2203}
2204
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002205TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206 Base::TestPlayoutAndSendingStates();
2207}
2208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002210 CreateChannels(0, 0);
2211 // Test that we can Mute the default channel even though the sending SSRC
2212 // is unknown.
2213 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002214 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002215 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2216 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002217 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2218
2219 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002220 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002221
2222 SendInitiate();
2223 // After the local session description has been set, we can mute a stream
2224 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002225 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002226 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2227 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002228 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229}
2230
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232 Base::TestMediaContentDirection();
2233}
2234
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002235TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002236 Base::TestNetworkRouteChanges();
2237}
2238
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002239TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 Base::TestCallSetup();
2241}
2242
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002243TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244 Base::TestCallTeardownRtcpMux();
2245}
2246
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002247TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248 Base::SendRtpToRtp();
2249}
2250
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252 Base::SendRtcpToRtcp();
2253}
2254
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002255TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 Base::SendRtcpMuxToRtcp();
2257}
2258
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002259TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260 Base::SendRtcpMuxToRtcpMux();
2261}
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002264 Base::SendRequireRtcpMuxToRtcpMux();
2265}
2266
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002267TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002268 Base::SendRtcpMuxToRequireRtcpMux();
2269}
2270
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002272 Base::SendRequireRtcpMuxToRequireRtcpMux();
2273}
2274
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002275TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002276 Base::SendRequireRtcpMuxToNoRtcpMux();
2277}
2278
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002279TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280 Base::SendEarlyRtcpMuxToRtcp();
2281}
2282
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284 Base::SendEarlyRtcpMuxToRtcpMux();
2285}
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292 Base::SendSrtpToSrtp();
2293}
2294
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2297}
2298
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002299TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300 Base::SendSrtpToSrtp(DTLS, 0);
2301}
2302
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002303TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304 Base::SendSrtpToSrtp(DTLS, DTLS);
2305}
2306
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002307TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2309}
2310
deadbeeff5346592017-01-24 21:51:21 -08002311// Test using the channel with a raw packet interface, as opposed to a DTLS
2312// transport interface.
2313TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2314 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2315}
2316
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002317TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2319}
2320
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002321TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 Base::SendRtpToRtpOnThread();
2323}
2324
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 Base::SendSrtpToSrtpOnThread();
2327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 Base::SendWithWritabilityLoss();
2331}
2332
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002333TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 Base::TestMediaMonitor();
2335}
2336
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002338TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 CreateChannels(0, 0);
2340 EXPECT_TRUE(SendInitiate());
2341 EXPECT_TRUE(SendAccept());
2342 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2343
solenberg1d63dd02015-12-02 12:35:09 -08002344 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2345 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2346 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002348 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002350 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002351 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002352 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002353 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002354 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355}
2356
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002357TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 Base::TestSetContentFailure();
2359}
2360
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002361TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 Base::TestSendTwoOffers();
2363}
2364
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002365TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 Base::TestReceiveTwoOffers();
2367}
2368
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002369TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 Base::TestSendPrAnswer();
2371}
2372
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002373TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 Base::TestReceivePrAnswer();
2375}
2376
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002377TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 Base::TestFlushRtcp();
2379}
2380
zstein56162b92017-04-24 16:54:35 -07002381TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2382 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383}
2384
zstein56162b92017-04-24 16:54:35 -07002385TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2386 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002390TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002391 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 EXPECT_TRUE(SendInitiate());
2393 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002394 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395
solenberg4bac9c52015-10-09 02:32:53 -07002396 // Default is (1.0).
2397 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2398 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002400 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401
solenberg4bac9c52015-10-09 02:32:53 -07002402 // Set scale to (1.5).
2403 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2404 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2405 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406
solenberg4bac9c52015-10-09 02:32:53 -07002407 // Set scale to (0).
2408 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2409 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2410 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411}
2412
2413// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002414TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002415 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 EXPECT_TRUE(SendInitiate());
2417 EXPECT_TRUE(SendAccept());
2418 EXPECT_TRUE(AddStream1(1));
2419 EXPECT_TRUE(AddStream1(2));
2420
solenberg4bac9c52015-10-09 02:32:53 -07002421 double volume;
2422 // Default is (1.0).
2423 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2424 EXPECT_DOUBLE_EQ(1.0, volume);
2425 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2426 EXPECT_DOUBLE_EQ(1.0, volume);
2427 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2428 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002430 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431
solenberg4bac9c52015-10-09 02:32:53 -07002432 // Set scale to (1.5) for ssrc = 1.
2433 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2434 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2435 EXPECT_DOUBLE_EQ(1.5, volume);
2436 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2437 EXPECT_DOUBLE_EQ(1.0, volume);
2438 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2439 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440
solenberg4bac9c52015-10-09 02:32:53 -07002441 // Set scale to (0) for all ssrcs.
2442 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2443 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2444 EXPECT_DOUBLE_EQ(0.0, volume);
2445 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2446 EXPECT_DOUBLE_EQ(0.0, volume);
2447 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2448 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002449}
2450
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002452 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453}
2454
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002455TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002456 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002457}
2458
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002460 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002461}
2462
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002463TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002464 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465}
2466
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002467TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002468 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002469}
2470
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002471TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002472 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002473}
2474
Steve Anton8a63f782017-10-23 13:08:53 -07002475TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2476 Base::SocketOptionsMergedOnSetTransport();
2477}
2478
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002479// VoiceChannelDoubleThreadTest
2480TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002482 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2483 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484}
2485
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002486TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2487 Base::TestDeinit();
2488}
2489
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002490TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 Base::TestSetContents();
2492}
2493
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002494TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 Base::TestSetContentsNullOffer();
2496}
2497
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002498TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 Base::TestSetContentsRtcpMux();
2500}
2501
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002502TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503 Base::TestSetContentsRtcpMux();
2504}
2505
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002506TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 Base::TestStreams();
2508}
2509
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002510TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 Base::TestChangeStreamParamsInContent();
2512}
2513
jbauch5869f502017-06-29 12:31:36 -07002514TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2515 TestChangeEncryptedHeaderExtensionsDtls) {
2516 int flags = DTLS;
2517 Base::TestChangeEncryptedHeaderExtensions(flags);
2518}
2519
2520TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2521 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2522 int flags = DTLS;
2523 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2524}
2525
2526TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2527 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2528 int flags = DTLS;
2529 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2530}
2531
2532TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2533 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2534 int flags = DTLS | GCM_CIPHER;
2535 Base::TestChangeEncryptedHeaderExtensions(flags);
2536}
2537
2538TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2539 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2540 int flags = DTLS | GCM_CIPHER;
2541 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2542}
2543
2544TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2545 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2546 int flags = DTLS | GCM_CIPHER;
2547 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2548}
2549
2550TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2551 TestChangeEncryptedHeaderExtensionsSDES) {
2552 int flags = 0;
2553 Base::TestChangeEncryptedHeaderExtensions(flags);
2554}
2555
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002556TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 Base::TestPlayoutAndSendingStates();
2558}
2559
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002560TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2561 CreateChannels(0, 0);
2562 // Test that we can Mute the default channel even though the sending SSRC
2563 // is unknown.
2564 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2565 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2566 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2567 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2568 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2569
2570 // Test that we can not mute an unknown SSRC.
2571 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2572
2573 SendInitiate();
2574 // After the local session description has been set, we can mute a stream
2575 // with its SSRC.
2576 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2577 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2578 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2579 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2580}
2581
2582TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2583 Base::TestMediaContentDirection();
2584}
2585
2586TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2587 Base::TestNetworkRouteChanges();
2588}
2589
2590TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2591 Base::TestCallSetup();
2592}
2593
2594TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2595 Base::TestCallTeardownRtcpMux();
2596}
2597
2598TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2599 Base::SendRtpToRtp();
2600}
2601
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002602TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2603 Base::SendRtcpToRtcp();
2604}
2605
2606TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2607 Base::SendRtcpMuxToRtcp();
2608}
2609
2610TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2611 Base::SendRtcpMuxToRtcpMux();
2612}
2613
2614TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2615 Base::SendRequireRtcpMuxToRtcpMux();
2616}
2617
2618TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2619 Base::SendRtcpMuxToRequireRtcpMux();
2620}
2621
2622TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2623 Base::SendRequireRtcpMuxToRequireRtcpMux();
2624}
2625
2626TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2627 Base::SendRequireRtcpMuxToNoRtcpMux();
2628}
2629
2630TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2631 Base::SendEarlyRtcpMuxToRtcp();
2632}
2633
2634TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2635 Base::SendEarlyRtcpMuxToRtcpMux();
2636}
2637
2638TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2639 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2640}
2641
2642TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2643 Base::SendSrtpToSrtp();
2644}
2645
2646TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2647 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2648}
2649
2650TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002651 Base::SendSrtpToSrtp(DTLS, 0);
2652}
2653
2654TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002655 Base::SendSrtpToSrtp(DTLS, DTLS);
2656}
2657
2658TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002659 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2660}
2661
deadbeeff5346592017-01-24 21:51:21 -08002662// Test using the channel with a raw packet interface, as opposed to a DTLS
2663// transport interface.
2664TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2665 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2666}
2667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002668TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2669 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2670}
2671
2672TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2673 Base::SendRtpToRtpOnThread();
2674}
2675
2676TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2677 Base::SendSrtpToSrtpOnThread();
2678}
2679
2680TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2681 Base::SendWithWritabilityLoss();
2682}
2683
2684TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2685 Base::TestMediaMonitor();
2686}
2687
2688// Test that InsertDtmf properly forwards to the media channel.
2689TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2690 CreateChannels(0, 0);
2691 EXPECT_TRUE(SendInitiate());
2692 EXPECT_TRUE(SendAccept());
2693 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2694
2695 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2696 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2697 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2698
2699 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2700 EXPECT_TRUE(
2701 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2702 EXPECT_TRUE(
2703 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2704 EXPECT_TRUE(
2705 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2706}
2707
2708TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2709 Base::TestSetContentFailure();
2710}
2711
2712TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2713 Base::TestSendTwoOffers();
2714}
2715
2716TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2717 Base::TestReceiveTwoOffers();
2718}
2719
2720TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2721 Base::TestSendPrAnswer();
2722}
2723
2724TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2725 Base::TestReceivePrAnswer();
2726}
2727
2728TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2729 Base::TestFlushRtcp();
2730}
2731
zstein56162b92017-04-24 16:54:35 -07002732TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2733 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002734}
2735
zstein56162b92017-04-24 16:54:35 -07002736TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2737 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002738}
2739
2740// Test that we can scale the output volume properly for 1:1 calls.
2741TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002742 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002743 EXPECT_TRUE(SendInitiate());
2744 EXPECT_TRUE(SendAccept());
2745 double volume;
2746
2747 // Default is (1.0).
2748 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2749 EXPECT_DOUBLE_EQ(1.0, volume);
2750 // invalid ssrc.
2751 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2752
2753 // Set scale to (1.5).
2754 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2755 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2756 EXPECT_DOUBLE_EQ(1.5, volume);
2757
2758 // Set scale to (0).
2759 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2760 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2761 EXPECT_DOUBLE_EQ(0.0, volume);
2762}
2763
2764// Test that we can scale the output volume properly for multiway calls.
2765TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002766 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002767 EXPECT_TRUE(SendInitiate());
2768 EXPECT_TRUE(SendAccept());
2769 EXPECT_TRUE(AddStream1(1));
2770 EXPECT_TRUE(AddStream1(2));
2771
2772 double volume;
2773 // Default is (1.0).
2774 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2775 EXPECT_DOUBLE_EQ(1.0, volume);
2776 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2777 EXPECT_DOUBLE_EQ(1.0, volume);
2778 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2779 EXPECT_DOUBLE_EQ(1.0, volume);
2780 // invalid ssrc.
2781 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2782
2783 // Set scale to (1.5) for ssrc = 1.
2784 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2785 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2786 EXPECT_DOUBLE_EQ(1.5, volume);
2787 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2788 EXPECT_DOUBLE_EQ(1.0, volume);
2789 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2790 EXPECT_DOUBLE_EQ(1.0, volume);
2791
2792 // Set scale to (0) for all ssrcs.
2793 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2794 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2795 EXPECT_DOUBLE_EQ(0.0, volume);
2796 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2797 EXPECT_DOUBLE_EQ(0.0, volume);
2798 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2799 EXPECT_DOUBLE_EQ(0.0, volume);
2800}
2801
2802TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2803 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2804}
2805
2806TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2807 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2808}
2809
2810TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2811 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2812}
2813
2814TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2815 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2816}
2817
2818TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2819 Base::DefaultMaxBitrateIsUnlimited();
2820}
2821
2822TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2823 Base::CanChangeMaxBitrate();
2824}
2825
Steve Anton8a63f782017-10-23 13:08:53 -07002826TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2827 Base::SocketOptionsMergedOnSetTransport();
2828}
2829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002830// VideoChannelSingleThreadTest
2831TEST_F(VideoChannelSingleThreadTest, TestInit) {
2832 Base::TestInit();
2833}
2834
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002835TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2836 Base::TestDeinit();
2837}
2838
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002839TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2840 Base::TestSetContents();
2841}
2842
2843TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2844 Base::TestSetContentsNullOffer();
2845}
2846
2847TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2848 Base::TestSetContentsRtcpMux();
2849}
2850
2851TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2852 Base::TestSetContentsRtcpMux();
2853}
2854
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002855TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2856 Base::TestStreams();
2857}
2858
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002859TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2860 Base::TestChangeStreamParamsInContent();
2861}
2862
2863TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2864 Base::TestPlayoutAndSendingStates();
2865}
2866
2867TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002868 CreateChannels(0, 0);
2869 // Test that we can Mute the default channel even though the sending SSRC
2870 // is unknown.
2871 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002872 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002873 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002874 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002875 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2876 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002877 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002878 SendInitiate();
2879 // After the local session description has been set, we can mute a stream
2880 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002881 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002882 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002883 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002884 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885}
2886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002887TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 Base::TestMediaContentDirection();
2889}
2890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002891TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002892 Base::TestNetworkRouteChanges();
2893}
2894
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002895TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896 Base::TestCallSetup();
2897}
2898
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002899TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900 Base::TestCallTeardownRtcpMux();
2901}
2902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002903TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 Base::SendRtpToRtp();
2905}
2906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002907TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 Base::SendRtcpToRtcp();
2909}
2910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002911TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 Base::SendRtcpMuxToRtcp();
2913}
2914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002915TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002916 Base::SendRtcpMuxToRtcpMux();
2917}
2918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002919TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002920 Base::SendRequireRtcpMuxToRtcpMux();
2921}
2922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002923TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002924 Base::SendRtcpMuxToRequireRtcpMux();
2925}
2926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002927TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002928 Base::SendRequireRtcpMuxToRequireRtcpMux();
2929}
2930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002931TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002932 Base::SendRequireRtcpMuxToNoRtcpMux();
2933}
2934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002935TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936 Base::SendEarlyRtcpMuxToRtcp();
2937}
2938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002939TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940 Base::SendEarlyRtcpMuxToRtcpMux();
2941}
2942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002943TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 Base::SendSrtpToSrtp();
2945}
2946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002947TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 Base::SendSrtpToSrtp();
2949}
2950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002951TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002952 Base::SendSrtpToSrtp(DTLS, 0);
2953}
2954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002955TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002956 Base::SendSrtpToSrtp(DTLS, DTLS);
2957}
2958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002959TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002960 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2961}
2962
deadbeeff5346592017-01-24 21:51:21 -08002963// Test using the channel with a raw packet interface, as opposed to a DTLS
2964// transport interface.
2965TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2966 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2967}
2968
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002969TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2971}
2972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002973TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2975}
2976
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002977TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978 Base::SendRtpToRtpOnThread();
2979}
2980
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002981TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 Base::SendSrtpToSrtpOnThread();
2983}
2984
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002985TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002986 Base::SendWithWritabilityLoss();
2987}
2988
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002989TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002990 Base::TestMediaMonitor();
2991}
2992
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002993TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994 Base::TestSetContentFailure();
2995}
2996
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002997TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 Base::TestSendTwoOffers();
2999}
3000
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003001TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002 Base::TestReceiveTwoOffers();
3003}
3004
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003005TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003006 Base::TestSendPrAnswer();
3007}
3008
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003009TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010 Base::TestReceivePrAnswer();
3011}
3012
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003013TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014 Base::TestFlushRtcp();
3015}
3016
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003017TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003018 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003019}
3020
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003021TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003022 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003023}
3024
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003025TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003026 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003027}
3028
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003029TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003030 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003031}
3032
zstein56162b92017-04-24 16:54:35 -07003033TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3034 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003035}
3036
zstein56162b92017-04-24 16:54:35 -07003037TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3038 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003039}
3040
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003041TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003042 Base::DefaultMaxBitrateIsUnlimited();
3043}
3044
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003045TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003046 Base::CanChangeMaxBitrate();
3047}
3048
Steve Anton8a63f782017-10-23 13:08:53 -07003049TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3050 Base::SocketOptionsMergedOnSetTransport();
3051}
3052
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003053// VideoChannelDoubleThreadTest
3054TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3055 Base::TestInit();
3056}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003057
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003058TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3059 Base::TestDeinit();
3060}
3061
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003062TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3063 Base::TestSetContents();
3064}
3065
3066TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3067 Base::TestSetContentsNullOffer();
3068}
3069
3070TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3071 Base::TestSetContentsRtcpMux();
3072}
3073
3074TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3075 Base::TestSetContentsRtcpMux();
3076}
3077
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003078TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3079 Base::TestStreams();
3080}
3081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003082TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3083 Base::TestChangeStreamParamsInContent();
3084}
3085
3086TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3087 Base::TestPlayoutAndSendingStates();
3088}
3089
3090TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3091 CreateChannels(0, 0);
3092 // Test that we can Mute the default channel even though the sending SSRC
3093 // is unknown.
3094 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003095 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003096 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003097 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003098 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3099 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003100 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003101 SendInitiate();
3102 // After the local session description has been set, we can mute a stream
3103 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003104 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003105 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003106 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003107 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3108}
3109
3110TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3111 Base::TestMediaContentDirection();
3112}
3113
3114TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3115 Base::TestNetworkRouteChanges();
3116}
3117
3118TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3119 Base::TestCallSetup();
3120}
3121
3122TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3123 Base::TestCallTeardownRtcpMux();
3124}
3125
3126TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3127 Base::SendRtpToRtp();
3128}
3129
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003130TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3131 Base::SendRtcpToRtcp();
3132}
3133
3134TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3135 Base::SendRtcpMuxToRtcp();
3136}
3137
3138TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3139 Base::SendRtcpMuxToRtcpMux();
3140}
3141
3142TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3143 Base::SendRequireRtcpMuxToRtcpMux();
3144}
3145
3146TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3147 Base::SendRtcpMuxToRequireRtcpMux();
3148}
3149
3150TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3151 Base::SendRequireRtcpMuxToRequireRtcpMux();
3152}
3153
3154TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3155 Base::SendRequireRtcpMuxToNoRtcpMux();
3156}
3157
3158TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3159 Base::SendEarlyRtcpMuxToRtcp();
3160}
3161
3162TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3163 Base::SendEarlyRtcpMuxToRtcpMux();
3164}
3165
3166TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3167 Base::SendSrtpToSrtp();
3168}
3169
3170TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3171 Base::SendSrtpToSrtp();
3172}
3173
3174TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003175 Base::SendSrtpToSrtp(DTLS, 0);
3176}
3177
3178TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003179 Base::SendSrtpToSrtp(DTLS, DTLS);
3180}
3181
3182TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003183 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3184}
3185
deadbeeff5346592017-01-24 21:51:21 -08003186// Test using the channel with a raw packet interface, as opposed to a DTLS
3187// transport interface.
3188TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3189 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3190}
3191
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003192TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3193 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3194}
3195
3196TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3197 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3198}
3199
3200TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3201 Base::SendRtpToRtpOnThread();
3202}
3203
3204TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3205 Base::SendSrtpToSrtpOnThread();
3206}
3207
3208TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3209 Base::SendWithWritabilityLoss();
3210}
3211
3212TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3213 Base::TestMediaMonitor();
3214}
3215
3216TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3217 Base::TestSetContentFailure();
3218}
3219
3220TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3221 Base::TestSendTwoOffers();
3222}
3223
3224TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3225 Base::TestReceiveTwoOffers();
3226}
3227
3228TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3229 Base::TestSendPrAnswer();
3230}
3231
3232TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3233 Base::TestReceivePrAnswer();
3234}
3235
3236TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3237 Base::TestFlushRtcp();
3238}
3239
3240TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3241 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3242}
3243
3244TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3245 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3246}
3247
3248TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3249 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3250}
3251
3252TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3253 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3254}
3255
zstein56162b92017-04-24 16:54:35 -07003256TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3257 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003258}
3259
zstein56162b92017-04-24 16:54:35 -07003260TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3261 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003262}
3263
3264TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3265 Base::DefaultMaxBitrateIsUnlimited();
3266}
3267
3268TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3269 Base::CanChangeMaxBitrate();
3270}
3271
Steve Anton8a63f782017-10-23 13:08:53 -07003272TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3273 Base::SocketOptionsMergedOnSetTransport();
3274}
3275
deadbeef953c2ce2017-01-09 14:53:41 -08003276// RtpDataChannelSingleThreadTest
3277class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003278 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003279 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003280 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003281 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3282};
3283
deadbeef953c2ce2017-01-09 14:53:41 -08003284// RtpDataChannelDoubleThreadTest
3285class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003286 public:
3287 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003288 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003289 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003290};
3291
3292// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003293template <>
Steve Anton8699a322017-11-06 15:53:33 -08003294std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003295 rtc::Thread* worker_thread,
3296 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003297 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003298 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003299 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3300 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003301 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3302 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003303 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003304 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003305 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3306 worker_thread, network_thread, signaling_thread, std::move(ch),
3307 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3308 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003309 if (!channel->NeedsRtcpTransport()) {
3310 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003311 }
Steve Anton8699a322017-11-06 15:53:33 -08003312 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3313 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003314 return channel;
3315}
3316
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003317template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003318void ChannelTest<DataTraits>::CreateContent(
3319 int flags,
3320 const cricket::AudioCodec& audio_codec,
3321 const cricket::VideoCodec& video_codec,
3322 cricket::DataContentDescription* data) {
3323 data->AddCodec(kGoogleDataCodec);
3324 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3325 if (flags & SECURE) {
3326 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003327 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3328 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003329 }
3330}
3331
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003332template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003333void ChannelTest<DataTraits>::CopyContent(
3334 const cricket::DataContentDescription& source,
3335 cricket::DataContentDescription* data) {
3336 *data = source;
3337}
3338
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003339template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003340bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3341 const cricket::DataCodec& c2) {
3342 return c1.name == c2.name;
3343}
3344
Peter Boström0c4e06b2015-10-07 12:23:21 +02003345template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003346void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003347 uint32_t ssrc,
3348 int flags,
3349 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003350 data->AddLegacyStream(ssrc);
3351}
3352
deadbeef953c2ce2017-01-09 14:53:41 -08003353TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003354 Base::TestInit();
3355 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3356}
3357
deadbeef953c2ce2017-01-09 14:53:41 -08003358TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003359 Base::TestDeinit();
3360}
3361
deadbeef953c2ce2017-01-09 14:53:41 -08003362TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003363 Base::TestSetContents();
3364}
3365
deadbeef953c2ce2017-01-09 14:53:41 -08003366TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003367 Base::TestSetContentsNullOffer();
3368}
3369
deadbeef953c2ce2017-01-09 14:53:41 -08003370TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003371 Base::TestSetContentsRtcpMux();
3372}
3373
deadbeef953c2ce2017-01-09 14:53:41 -08003374TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003375 Base::TestStreams();
3376}
3377
deadbeef953c2ce2017-01-09 14:53:41 -08003378TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003379 Base::TestChangeStreamParamsInContent();
3380}
3381
deadbeef953c2ce2017-01-09 14:53:41 -08003382TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003383 Base::TestPlayoutAndSendingStates();
3384}
3385
deadbeef953c2ce2017-01-09 14:53:41 -08003386TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003387 Base::TestMediaContentDirection();
3388}
3389
deadbeef953c2ce2017-01-09 14:53:41 -08003390TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003391 Base::TestCallSetup();
3392}
3393
deadbeef953c2ce2017-01-09 14:53:41 -08003394TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003395 Base::TestCallTeardownRtcpMux();
3396}
3397
zstein56162b92017-04-24 16:54:35 -07003398TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3399 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003400}
3401
zstein56162b92017-04-24 16:54:35 -07003402TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3403 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003404}
3405
deadbeef953c2ce2017-01-09 14:53:41 -08003406TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003407 Base::SendRtpToRtp();
3408}
3409
deadbeef953c2ce2017-01-09 14:53:41 -08003410TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003411 Base::SendRtcpToRtcp();
3412}
3413
deadbeef953c2ce2017-01-09 14:53:41 -08003414TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003415 Base::SendRtcpMuxToRtcp();
3416}
3417
deadbeef953c2ce2017-01-09 14:53:41 -08003418TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003419 Base::SendRtcpMuxToRtcpMux();
3420}
3421
deadbeef953c2ce2017-01-09 14:53:41 -08003422TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003423 Base::SendEarlyRtcpMuxToRtcp();
3424}
3425
deadbeef953c2ce2017-01-09 14:53:41 -08003426TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003427 Base::SendEarlyRtcpMuxToRtcpMux();
3428}
3429
deadbeef953c2ce2017-01-09 14:53:41 -08003430TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003431 Base::SendSrtpToSrtp();
3432}
3433
deadbeef953c2ce2017-01-09 14:53:41 -08003434TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003435 Base::SendSrtpToSrtp();
3436}
3437
deadbeef953c2ce2017-01-09 14:53:41 -08003438TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003439 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3440}
3441
deadbeef953c2ce2017-01-09 14:53:41 -08003442TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003443 Base::SendRtpToRtpOnThread();
3444}
3445
deadbeef953c2ce2017-01-09 14:53:41 -08003446TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003447 Base::SendSrtpToSrtpOnThread();
3448}
3449
deadbeef953c2ce2017-01-09 14:53:41 -08003450TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003451 Base::SendWithWritabilityLoss();
3452}
3453
deadbeef953c2ce2017-01-09 14:53:41 -08003454TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003455 Base::TestMediaMonitor();
3456}
3457
Steve Anton8a63f782017-10-23 13:08:53 -07003458TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3459 Base::SocketOptionsMergedOnSetTransport();
3460}
3461
deadbeef953c2ce2017-01-09 14:53:41 -08003462TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003463 CreateChannels(0, 0);
3464 EXPECT_TRUE(SendInitiate());
3465 EXPECT_TRUE(SendAccept());
3466
3467 cricket::SendDataParams params;
3468 params.ssrc = 42;
3469 unsigned char data[] = {'f', 'o', 'o'};
3470 rtc::CopyOnWriteBuffer payload(data, 3);
3471 cricket::SendDataResult result;
3472 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3473 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3474 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3475}
3476
deadbeef953c2ce2017-01-09 14:53:41 -08003477TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003478 Base::TestInit();
3479 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3480}
3481
deadbeef953c2ce2017-01-09 14:53:41 -08003482TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003483 Base::TestDeinit();
3484}
3485
deadbeef953c2ce2017-01-09 14:53:41 -08003486TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003487 Base::TestSetContents();
3488}
3489
deadbeef953c2ce2017-01-09 14:53:41 -08003490TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003491 Base::TestSetContentsNullOffer();
3492}
3493
deadbeef953c2ce2017-01-09 14:53:41 -08003494TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003495 Base::TestSetContentsRtcpMux();
3496}
3497
deadbeef953c2ce2017-01-09 14:53:41 -08003498TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003499 Base::TestStreams();
3500}
3501
deadbeef953c2ce2017-01-09 14:53:41 -08003502TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003503 Base::TestChangeStreamParamsInContent();
3504}
3505
deadbeef953c2ce2017-01-09 14:53:41 -08003506TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003507 Base::TestPlayoutAndSendingStates();
3508}
3509
deadbeef953c2ce2017-01-09 14:53:41 -08003510TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003511 Base::TestMediaContentDirection();
3512}
3513
deadbeef953c2ce2017-01-09 14:53:41 -08003514TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003515 Base::TestCallSetup();
3516}
3517
deadbeef953c2ce2017-01-09 14:53:41 -08003518TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003519 Base::TestCallTeardownRtcpMux();
3520}
3521
zstein56162b92017-04-24 16:54:35 -07003522TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3523 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003524}
3525
zstein56162b92017-04-24 16:54:35 -07003526TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3527 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003528}
3529
deadbeef953c2ce2017-01-09 14:53:41 -08003530TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003531 Base::SendRtpToRtp();
3532}
3533
deadbeef953c2ce2017-01-09 14:53:41 -08003534TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003535 Base::SendRtcpToRtcp();
3536}
3537
deadbeef953c2ce2017-01-09 14:53:41 -08003538TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003539 Base::SendRtcpMuxToRtcp();
3540}
3541
deadbeef953c2ce2017-01-09 14:53:41 -08003542TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003543 Base::SendRtcpMuxToRtcpMux();
3544}
3545
deadbeef953c2ce2017-01-09 14:53:41 -08003546TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003547 Base::SendEarlyRtcpMuxToRtcp();
3548}
3549
deadbeef953c2ce2017-01-09 14:53:41 -08003550TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003551 Base::SendEarlyRtcpMuxToRtcpMux();
3552}
3553
deadbeef953c2ce2017-01-09 14:53:41 -08003554TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003555 Base::SendSrtpToSrtp();
3556}
3557
deadbeef953c2ce2017-01-09 14:53:41 -08003558TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003559 Base::SendSrtpToSrtp();
3560}
3561
deadbeef953c2ce2017-01-09 14:53:41 -08003562TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003563 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3564}
3565
deadbeef953c2ce2017-01-09 14:53:41 -08003566TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003567 Base::SendRtpToRtpOnThread();
3568}
3569
deadbeef953c2ce2017-01-09 14:53:41 -08003570TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003571 Base::SendSrtpToSrtpOnThread();
3572}
3573
deadbeef953c2ce2017-01-09 14:53:41 -08003574TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003575 Base::SendWithWritabilityLoss();
3576}
3577
deadbeef953c2ce2017-01-09 14:53:41 -08003578TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003579 Base::TestMediaMonitor();
3580}
3581
Steve Anton8a63f782017-10-23 13:08:53 -07003582TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3583 Base::SocketOptionsMergedOnSetTransport();
3584}
3585
deadbeef953c2ce2017-01-09 14:53:41 -08003586TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003587 CreateChannels(0, 0);
3588 EXPECT_TRUE(SendInitiate());
3589 EXPECT_TRUE(SendAccept());
3590
3591 cricket::SendDataParams params;
3592 params.ssrc = 42;
3593 unsigned char data[] = {
3594 'f', 'o', 'o'
3595 };
jbaucheec21bd2016-03-20 06:15:43 -07003596 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003597 cricket::SendDataResult result;
3598 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3599 EXPECT_EQ(params.ssrc,
3600 media_channel1_->last_sent_data_params().ssrc);
3601 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3602}
3603
deadbeefbad5dad2017-01-17 18:32:35 -08003604#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3605
3606// Verifies some DCHECKs are in place.
3607// Uses VoiceChannel, but any BaseChannel subclass would work.
3608class BaseChannelDeathTest : public testing::Test {
3609 public:
3610 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003611 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3612 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3613 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003614 voice_channel_(rtc::Thread::Current(),
3615 rtc::Thread::Current(),
3616 rtc::Thread::Current(),
3617 &fake_media_engine_,
3618 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3619 nullptr,
3620 cricket::AudioOptions()),
3621 cricket::CN_AUDIO,
3622 false,
3623 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003624
3625 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003626 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003627 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3628 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003629 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003630};
3631
deadbeeff5346592017-01-24 21:51:21 -08003632TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003633 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3634 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003635 cricket::FakeDtlsTransport new_rtcp_transport(
3636 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3637 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003638}
3639
deadbeeff5346592017-01-24 21:51:21 -08003640TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003641 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3642 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003643 cricket::FakeDtlsTransport new_rtp_transport(
3644 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3645 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003646}
3647
deadbeeff5346592017-01-24 21:51:21 -08003648TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003649 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3650 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003651 // Activate RTCP muxing, simulating offer/answer negotiation.
3652 cricket::AudioContentDescription content;
3653 content.set_rtcp_mux(true);
3654 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3655 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003656 cricket::FakeDtlsTransport new_rtp_transport(
3657 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3658 cricket::FakeDtlsTransport new_rtcp_transport(
3659 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003660 // After muxing is enabled, no RTCP transport should be passed in here.
3661 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003662 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3663 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003664}
3665
3666// This test will probably go away if/when we move the transport name out of
3667// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003668TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003669 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3670 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003671 cricket::FakeDtlsTransport new_rtp_transport(
3672 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3673 cricket::FakeDtlsTransport new_rtcp_transport(
3674 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003675 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003676 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3677 "");
3678}
3679
3680// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003681// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003682TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003683 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3684 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003685 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003686 voice_channel_.SetTransports(
3687 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3688 static_cast<rtc::PacketTransportInternal*>(
3689 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003690 "");
3691}
3692
deadbeef5bd5ca32017-02-10 11:31:50 -08003693// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003694// DtlsTransportInternal.
3695TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003696 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3697 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003698 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3699 &fake_rtp_dtls_transport_),
3700 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003701}
3702
3703#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3704
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003705// TODO(pthatcher): TestSetReceiver?