blob: 181356493c19bb691ccbd9b04be411045f93347b [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),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001869 rtc::nullopt);
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(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001878 kSsrc1, BitrateLimitedParameters(1000)));
1879 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), 1000);
1880 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1), 1000);
skvladdc1c62c2016-03-16 19:07:43 -07001881 EXPECT_EQ(-1, media_channel1_->max_bps());
1882
deadbeefe702b302017-02-04 12:09:01 -08001883 EXPECT_TRUE(channel1_->SetRtpSendParameters(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001884 kSsrc1, BitrateLimitedParameters(rtc::nullopt)));
1885 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), rtc::nullopt);
deadbeefe702b302017-02-04 12:09:01 -08001886 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001887 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001888 EXPECT_EQ(-1, media_channel1_->max_bps());
1889 }
1890
Steve Anton8a63f782017-10-23 13:08:53 -07001891 // Test that when a channel gets new transports with a call to
1892 // |SetTransports|, the socket options from the old transports are merged with
1893 // the options on the new transport.
1894 // For example, audio and video may use separate socket options, but initially
1895 // be unbundled, then later become bundled. When this happens, their preferred
1896 // socket options should be merged to the underlying transport they share.
1897 void SocketOptionsMergedOnSetTransport() {
1898 constexpr int kSndBufSize = 4000;
1899 constexpr int kRcvBufSize = 8000;
1900
1901 CreateChannels(0, 0);
1902
1903 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1904 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1905 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1906 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1907
1908 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1909 channel2_->rtcp_dtls_transport());
1910
1911 int option_val;
1912 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1913 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1914 EXPECT_EQ(kSndBufSize, option_val);
1915 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1916 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1917 EXPECT_EQ(kRcvBufSize, option_val);
1918 }
1919
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1922 static void ProcessThreadQueue(rtc::Thread* thread) {
1923 RTC_DCHECK(thread->IsCurrent());
1924 while (!thread->empty()) {
1925 thread->ProcessMessages(0);
1926 }
1927 }
1928 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1929 // |threads| and current thread post packets to network thread.
1930 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001931 thread->Invoke<void>(RTC_FROM_HERE,
1932 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001933 }
1934 ProcessThreadQueue(rtc::Thread::Current());
1935 // Network thread move them around and post back to worker = current thread.
1936 if (!network_thread_->IsCurrent()) {
1937 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001938 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939 }
1940 // Worker thread = current Thread process received messages.
1941 ProcessThreadQueue(rtc::Thread::Current());
1942 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001943 // TODO(pbos): Remove playout from all media channels and let renderers mute
1944 // themselves.
1945 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1947 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001948 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1949 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1950 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1951 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1952 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1953 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1954 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1955 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 cricket::FakeMediaEngine media_engine_;
1957 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001958 typename T::MediaChannel* media_channel1_ = nullptr;
1959 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001960 std::unique_ptr<typename T::Channel> channel1_;
1961 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 typename T::Content local_media_content1_;
1963 typename T::Content local_media_content2_;
1964 typename T::Content remote_media_content1_;
1965 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967 rtc::Buffer rtp_packet_;
1968 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001969 int media_info_callbacks1_ = 0;
1970 int media_info_callbacks2_ = 0;
1971 int rtcp_mux_activated_callbacks1_ = 0;
1972 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001973 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974};
1975
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976template<>
1977void ChannelTest<VoiceTraits>::CreateContent(
1978 int flags,
1979 const cricket::AudioCodec& audio_codec,
1980 const cricket::VideoCodec& video_codec,
1981 cricket::AudioContentDescription* audio) {
1982 audio->AddCodec(audio_codec);
1983 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
1984 if (flags & SECURE) {
1985 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001986 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1987 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988 }
1989}
1990
1991template<>
1992void ChannelTest<VoiceTraits>::CopyContent(
1993 const cricket::AudioContentDescription& source,
1994 cricket::AudioContentDescription* audio) {
1995 *audio = source;
1996}
1997
1998template<>
1999bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2000 const cricket::AudioCodec& c2) {
2001 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2002 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2003}
2004
Peter Boström0c4e06b2015-10-07 12:23:21 +02002005template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002007 uint32_t ssrc,
2008 int flags,
2009 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002010 audio->AddLegacyStream(ssrc);
2011}
2012
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002013class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002014 public:
solenberg1dd98f32015-09-10 01:57:14 -07002015 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002016 VoiceChannelSingleThreadTest()
2017 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2018};
2019
2020class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2021 public:
2022 typedef ChannelTest<VoiceTraits> Base;
2023 VoiceChannelDoubleThreadTest()
2024 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002025};
2026
jbauch5869f502017-06-29 12:31:36 -07002027class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2028 : public ChannelTest<VoiceTraits> {
2029 public:
2030 typedef ChannelTest<VoiceTraits> Base;
2031 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2032 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2033 NetworkIsWorker::Yes) {}
2034};
2035
2036class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2037 : public ChannelTest<VoiceTraits> {
2038 public:
2039 typedef ChannelTest<VoiceTraits> Base;
2040 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2041 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2042 NetworkIsWorker::No) {}
2043};
2044
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002046template <>
Steve Anton8699a322017-11-06 15:53:33 -08002047std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002048 rtc::Thread* worker_thread,
2049 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002050 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002051 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002052 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2053 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002054 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2055 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002056 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002057 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002058 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2059 worker_thread, network_thread, signaling_thread, std::move(ch),
2060 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2061 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002062 if (!channel->NeedsRtcpTransport()) {
2063 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002064 }
Steve Anton8699a322017-11-06 15:53:33 -08002065 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2066 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 return channel;
2068}
2069
2070// override to add 0 parameter
2071template<>
2072bool ChannelTest<VideoTraits>::AddStream1(int id) {
2073 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2074}
2075
2076template<>
2077void ChannelTest<VideoTraits>::CreateContent(
2078 int flags,
2079 const cricket::AudioCodec& audio_codec,
2080 const cricket::VideoCodec& video_codec,
2081 cricket::VideoContentDescription* video) {
2082 video->AddCodec(video_codec);
2083 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2084 if (flags & SECURE) {
2085 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002086 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2087 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088 }
2089}
2090
2091template<>
2092void ChannelTest<VideoTraits>::CopyContent(
2093 const cricket::VideoContentDescription& source,
2094 cricket::VideoContentDescription* video) {
2095 *video = source;
2096}
2097
2098template<>
2099bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2100 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002101 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102}
2103
Peter Boström0c4e06b2015-10-07 12:23:21 +02002104template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002106 uint32_t ssrc,
2107 int flags,
2108 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109 video->AddLegacyStream(ssrc);
2110}
2111
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002112class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113 public:
solenberg1dd98f32015-09-10 01:57:14 -07002114 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002115 VideoChannelSingleThreadTest()
2116 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117};
2118
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002119class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2120 public:
2121 typedef ChannelTest<VideoTraits> Base;
2122 VideoChannelDoubleThreadTest()
2123 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2124};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002126TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127 Base::TestInit();
2128 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2129 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2130}
2131
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002132TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2133 Base::TestDeinit();
2134}
2135
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002136TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 Base::TestSetContents();
2138}
2139
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002140TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 Base::TestSetContentsNullOffer();
2142}
2143
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002144TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002145 Base::TestSetContentsRtcpMux();
2146}
2147
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002148TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002149 Base::TestSetContentsRtcpMux();
2150}
2151
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002152TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 Base::TestStreams();
2154}
2155
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002156TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157 Base::TestChangeStreamParamsInContent();
2158}
2159
jbauch5869f502017-06-29 12:31:36 -07002160TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2161 TestChangeEncryptedHeaderExtensionsDtls) {
2162 int flags = DTLS;
2163 Base::TestChangeEncryptedHeaderExtensions(flags);
2164}
2165
2166TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2167 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2168 int flags = DTLS;
2169 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2170}
2171
2172TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2173 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2174 int flags = DTLS;
2175 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2176}
2177
2178TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2179 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2180 int flags = DTLS | GCM_CIPHER;
2181 Base::TestChangeEncryptedHeaderExtensions(flags);
2182}
2183
2184TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2185 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2186 int flags = DTLS | GCM_CIPHER;
2187 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2188}
2189
2190TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2191 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2192 int flags = DTLS | GCM_CIPHER;
2193 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2194}
2195
2196TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2197 TestChangeEncryptedHeaderExtensionsSDES) {
2198 int flags = 0;
2199 Base::TestChangeEncryptedHeaderExtensions(flags);
2200}
2201
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002202TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203 Base::TestPlayoutAndSendingStates();
2204}
2205
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002206TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002207 CreateChannels(0, 0);
2208 // Test that we can Mute the default channel even though the sending SSRC
2209 // is unknown.
2210 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002211 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002212 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2213 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002214 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2215
2216 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002217 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002218
2219 SendInitiate();
2220 // After the local session description has been set, we can mute a stream
2221 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002222 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002223 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2224 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002225 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226}
2227
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002228TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229 Base::TestMediaContentDirection();
2230}
2231
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002232TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002233 Base::TestNetworkRouteChanges();
2234}
2235
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002236TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237 Base::TestCallSetup();
2238}
2239
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002240TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241 Base::TestCallTeardownRtcpMux();
2242}
2243
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 Base::SendRtpToRtp();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 Base::SendRtcpToRtcp();
2250}
2251
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002252TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 Base::SendRtcpMuxToRtcp();
2254}
2255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 Base::SendRtcpMuxToRtcpMux();
2258}
2259
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002260TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002261 Base::SendRequireRtcpMuxToRtcpMux();
2262}
2263
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002264TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002265 Base::SendRtcpMuxToRequireRtcpMux();
2266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002269 Base::SendRequireRtcpMuxToRequireRtcpMux();
2270}
2271
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002272TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002273 Base::SendRequireRtcpMuxToNoRtcpMux();
2274}
2275
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 Base::SendEarlyRtcpMuxToRtcp();
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 Base::SendEarlyRtcpMuxToRtcpMux();
2282}
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2286}
2287
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002288TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289 Base::SendSrtpToSrtp();
2290}
2291
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002292TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2294}
2295
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002296TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297 Base::SendSrtpToSrtp(DTLS, 0);
2298}
2299
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002300TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301 Base::SendSrtpToSrtp(DTLS, DTLS);
2302}
2303
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002304TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2306}
2307
deadbeeff5346592017-01-24 21:51:21 -08002308// Test using the channel with a raw packet interface, as opposed to a DTLS
2309// transport interface.
2310TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2311 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2312}
2313
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002314TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2316}
2317
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002318TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319 Base::SendRtpToRtpOnThread();
2320}
2321
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002322TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 Base::SendSrtpToSrtpOnThread();
2324}
2325
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002326TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 Base::SendWithWritabilityLoss();
2328}
2329
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002330TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 Base::TestMediaMonitor();
2332}
2333
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002335TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 CreateChannels(0, 0);
2337 EXPECT_TRUE(SendInitiate());
2338 EXPECT_TRUE(SendAccept());
2339 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2340
solenberg1d63dd02015-12-02 12:35:09 -08002341 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2342 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2343 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002345 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002347 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002348 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002349 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002350 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002351 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352}
2353
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002354TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 Base::TestSetContentFailure();
2356}
2357
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002358TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 Base::TestSendTwoOffers();
2360}
2361
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002362TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 Base::TestReceiveTwoOffers();
2364}
2365
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002366TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 Base::TestSendPrAnswer();
2368}
2369
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002370TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 Base::TestReceivePrAnswer();
2372}
2373
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002374TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 Base::TestFlushRtcp();
2376}
2377
zstein56162b92017-04-24 16:54:35 -07002378TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2379 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380}
2381
zstein56162b92017-04-24 16:54:35 -07002382TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2383 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384}
2385
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002387TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002388 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 EXPECT_TRUE(SendInitiate());
2390 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002391 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392
solenberg4bac9c52015-10-09 02:32:53 -07002393 // Default is (1.0).
2394 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2395 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002397 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398
solenberg4bac9c52015-10-09 02:32:53 -07002399 // Set scale to (1.5).
2400 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2401 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2402 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403
solenberg4bac9c52015-10-09 02:32:53 -07002404 // Set scale to (0).
2405 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2406 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2407 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408}
2409
2410// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002411TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002412 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 EXPECT_TRUE(SendInitiate());
2414 EXPECT_TRUE(SendAccept());
2415 EXPECT_TRUE(AddStream1(1));
2416 EXPECT_TRUE(AddStream1(2));
2417
solenberg4bac9c52015-10-09 02:32:53 -07002418 double volume;
2419 // Default is (1.0).
2420 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2421 EXPECT_DOUBLE_EQ(1.0, volume);
2422 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2423 EXPECT_DOUBLE_EQ(1.0, volume);
2424 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2425 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002427 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428
solenberg4bac9c52015-10-09 02:32:53 -07002429 // Set scale to (1.5) for ssrc = 1.
2430 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2431 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2432 EXPECT_DOUBLE_EQ(1.5, volume);
2433 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2434 EXPECT_DOUBLE_EQ(1.0, volume);
2435 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2436 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437
solenberg4bac9c52015-10-09 02:32:53 -07002438 // Set scale to (0) for all ssrcs.
2439 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2440 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2441 EXPECT_DOUBLE_EQ(0.0, volume);
2442 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2443 EXPECT_DOUBLE_EQ(0.0, volume);
2444 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2445 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446}
2447
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002448TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002449 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450}
2451
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002452TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002453 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002454}
2455
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002456TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002457 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002458}
2459
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002460TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002461 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462}
2463
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002464TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002465 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002466}
2467
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002468TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002469 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002470}
2471
Steve Anton8a63f782017-10-23 13:08:53 -07002472TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2473 Base::SocketOptionsMergedOnSetTransport();
2474}
2475
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002476// VoiceChannelDoubleThreadTest
2477TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002479 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2480 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002483TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2484 Base::TestDeinit();
2485}
2486
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002487TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 Base::TestSetContents();
2489}
2490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002491TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::TestSetContentsNullOffer();
2493}
2494
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002495TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 Base::TestSetContentsRtcpMux();
2497}
2498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002499TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::TestSetContentsRtcpMux();
2501}
2502
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002503TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestStreams();
2505}
2506
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002507TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 Base::TestChangeStreamParamsInContent();
2509}
2510
jbauch5869f502017-06-29 12:31:36 -07002511TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2512 TestChangeEncryptedHeaderExtensionsDtls) {
2513 int flags = DTLS;
2514 Base::TestChangeEncryptedHeaderExtensions(flags);
2515}
2516
2517TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2518 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2519 int flags = DTLS;
2520 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2521}
2522
2523TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2524 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2525 int flags = DTLS;
2526 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2527}
2528
2529TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2530 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2531 int flags = DTLS | GCM_CIPHER;
2532 Base::TestChangeEncryptedHeaderExtensions(flags);
2533}
2534
2535TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2536 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2537 int flags = DTLS | GCM_CIPHER;
2538 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2539}
2540
2541TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2542 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2543 int flags = DTLS | GCM_CIPHER;
2544 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2545}
2546
2547TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2548 TestChangeEncryptedHeaderExtensionsSDES) {
2549 int flags = 0;
2550 Base::TestChangeEncryptedHeaderExtensions(flags);
2551}
2552
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002553TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554 Base::TestPlayoutAndSendingStates();
2555}
2556
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002557TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2558 CreateChannels(0, 0);
2559 // Test that we can Mute the default channel even though the sending SSRC
2560 // is unknown.
2561 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2562 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2563 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2564 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2565 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2566
2567 // Test that we can not mute an unknown SSRC.
2568 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2569
2570 SendInitiate();
2571 // After the local session description has been set, we can mute a stream
2572 // with its SSRC.
2573 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2574 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2575 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2576 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2577}
2578
2579TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2580 Base::TestMediaContentDirection();
2581}
2582
2583TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2584 Base::TestNetworkRouteChanges();
2585}
2586
2587TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2588 Base::TestCallSetup();
2589}
2590
2591TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2592 Base::TestCallTeardownRtcpMux();
2593}
2594
2595TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2596 Base::SendRtpToRtp();
2597}
2598
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002599TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2600 Base::SendRtcpToRtcp();
2601}
2602
2603TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2604 Base::SendRtcpMuxToRtcp();
2605}
2606
2607TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2608 Base::SendRtcpMuxToRtcpMux();
2609}
2610
2611TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2612 Base::SendRequireRtcpMuxToRtcpMux();
2613}
2614
2615TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2616 Base::SendRtcpMuxToRequireRtcpMux();
2617}
2618
2619TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2620 Base::SendRequireRtcpMuxToRequireRtcpMux();
2621}
2622
2623TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2624 Base::SendRequireRtcpMuxToNoRtcpMux();
2625}
2626
2627TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2628 Base::SendEarlyRtcpMuxToRtcp();
2629}
2630
2631TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2632 Base::SendEarlyRtcpMuxToRtcpMux();
2633}
2634
2635TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2636 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2637}
2638
2639TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2640 Base::SendSrtpToSrtp();
2641}
2642
2643TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2644 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2645}
2646
2647TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002648 Base::SendSrtpToSrtp(DTLS, 0);
2649}
2650
2651TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002652 Base::SendSrtpToSrtp(DTLS, DTLS);
2653}
2654
2655TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002656 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2657}
2658
deadbeeff5346592017-01-24 21:51:21 -08002659// Test using the channel with a raw packet interface, as opposed to a DTLS
2660// transport interface.
2661TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2662 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2663}
2664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002665TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2666 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2667}
2668
2669TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2670 Base::SendRtpToRtpOnThread();
2671}
2672
2673TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2674 Base::SendSrtpToSrtpOnThread();
2675}
2676
2677TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2678 Base::SendWithWritabilityLoss();
2679}
2680
2681TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2682 Base::TestMediaMonitor();
2683}
2684
2685// Test that InsertDtmf properly forwards to the media channel.
2686TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2687 CreateChannels(0, 0);
2688 EXPECT_TRUE(SendInitiate());
2689 EXPECT_TRUE(SendAccept());
2690 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2691
2692 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2693 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2694 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2695
2696 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2697 EXPECT_TRUE(
2698 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2699 EXPECT_TRUE(
2700 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2701 EXPECT_TRUE(
2702 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2703}
2704
2705TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2706 Base::TestSetContentFailure();
2707}
2708
2709TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2710 Base::TestSendTwoOffers();
2711}
2712
2713TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2714 Base::TestReceiveTwoOffers();
2715}
2716
2717TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2718 Base::TestSendPrAnswer();
2719}
2720
2721TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2722 Base::TestReceivePrAnswer();
2723}
2724
2725TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2726 Base::TestFlushRtcp();
2727}
2728
zstein56162b92017-04-24 16:54:35 -07002729TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2730 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002731}
2732
zstein56162b92017-04-24 16:54:35 -07002733TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2734 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002735}
2736
2737// Test that we can scale the output volume properly for 1:1 calls.
2738TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002739 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002740 EXPECT_TRUE(SendInitiate());
2741 EXPECT_TRUE(SendAccept());
2742 double volume;
2743
2744 // Default is (1.0).
2745 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2746 EXPECT_DOUBLE_EQ(1.0, volume);
2747 // invalid ssrc.
2748 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2749
2750 // Set scale to (1.5).
2751 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2752 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2753 EXPECT_DOUBLE_EQ(1.5, volume);
2754
2755 // Set scale to (0).
2756 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2757 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2758 EXPECT_DOUBLE_EQ(0.0, volume);
2759}
2760
2761// Test that we can scale the output volume properly for multiway calls.
2762TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002763 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002764 EXPECT_TRUE(SendInitiate());
2765 EXPECT_TRUE(SendAccept());
2766 EXPECT_TRUE(AddStream1(1));
2767 EXPECT_TRUE(AddStream1(2));
2768
2769 double volume;
2770 // Default is (1.0).
2771 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2772 EXPECT_DOUBLE_EQ(1.0, volume);
2773 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2774 EXPECT_DOUBLE_EQ(1.0, volume);
2775 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2776 EXPECT_DOUBLE_EQ(1.0, volume);
2777 // invalid ssrc.
2778 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2779
2780 // Set scale to (1.5) for ssrc = 1.
2781 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2782 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2783 EXPECT_DOUBLE_EQ(1.5, volume);
2784 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2785 EXPECT_DOUBLE_EQ(1.0, volume);
2786 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2787 EXPECT_DOUBLE_EQ(1.0, volume);
2788
2789 // Set scale to (0) for all ssrcs.
2790 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2791 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2792 EXPECT_DOUBLE_EQ(0.0, volume);
2793 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2794 EXPECT_DOUBLE_EQ(0.0, volume);
2795 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2796 EXPECT_DOUBLE_EQ(0.0, volume);
2797}
2798
2799TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2800 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2801}
2802
2803TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2804 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2805}
2806
2807TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2808 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2809}
2810
2811TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2812 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2813}
2814
2815TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2816 Base::DefaultMaxBitrateIsUnlimited();
2817}
2818
2819TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2820 Base::CanChangeMaxBitrate();
2821}
2822
Steve Anton8a63f782017-10-23 13:08:53 -07002823TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2824 Base::SocketOptionsMergedOnSetTransport();
2825}
2826
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002827// VideoChannelSingleThreadTest
2828TEST_F(VideoChannelSingleThreadTest, TestInit) {
2829 Base::TestInit();
2830}
2831
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002832TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2833 Base::TestDeinit();
2834}
2835
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002836TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2837 Base::TestSetContents();
2838}
2839
2840TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2841 Base::TestSetContentsNullOffer();
2842}
2843
2844TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2845 Base::TestSetContentsRtcpMux();
2846}
2847
2848TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2849 Base::TestSetContentsRtcpMux();
2850}
2851
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002852TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2853 Base::TestStreams();
2854}
2855
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002856TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2857 Base::TestChangeStreamParamsInContent();
2858}
2859
2860TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2861 Base::TestPlayoutAndSendingStates();
2862}
2863
2864TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002865 CreateChannels(0, 0);
2866 // Test that we can Mute the default channel even though the sending SSRC
2867 // is unknown.
2868 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002869 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002870 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002871 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002872 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2873 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002874 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002875 SendInitiate();
2876 // After the local session description has been set, we can mute a stream
2877 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002878 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002879 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002880 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002881 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882}
2883
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002884TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 Base::TestMediaContentDirection();
2886}
2887
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002888TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002889 Base::TestNetworkRouteChanges();
2890}
2891
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002892TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893 Base::TestCallSetup();
2894}
2895
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002896TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 Base::TestCallTeardownRtcpMux();
2898}
2899
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002900TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901 Base::SendRtpToRtp();
2902}
2903
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002904TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002905 Base::SendRtcpToRtcp();
2906}
2907
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002908TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 Base::SendRtcpMuxToRtcp();
2910}
2911
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002912TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913 Base::SendRtcpMuxToRtcpMux();
2914}
2915
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002916TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002917 Base::SendRequireRtcpMuxToRtcpMux();
2918}
2919
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002920TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002921 Base::SendRtcpMuxToRequireRtcpMux();
2922}
2923
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002924TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002925 Base::SendRequireRtcpMuxToRequireRtcpMux();
2926}
2927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002928TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002929 Base::SendRequireRtcpMuxToNoRtcpMux();
2930}
2931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002932TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 Base::SendEarlyRtcpMuxToRtcp();
2934}
2935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002936TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 Base::SendEarlyRtcpMuxToRtcpMux();
2938}
2939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002940TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 Base::SendSrtpToSrtp();
2942}
2943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002944TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945 Base::SendSrtpToSrtp();
2946}
2947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002948TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949 Base::SendSrtpToSrtp(DTLS, 0);
2950}
2951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002952TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 Base::SendSrtpToSrtp(DTLS, DTLS);
2954}
2955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002956TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2958}
2959
deadbeeff5346592017-01-24 21:51:21 -08002960// Test using the channel with a raw packet interface, as opposed to a DTLS
2961// transport interface.
2962TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2963 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2964}
2965
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002966TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2968}
2969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002970TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2972}
2973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002974TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975 Base::SendRtpToRtpOnThread();
2976}
2977
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002978TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979 Base::SendSrtpToSrtpOnThread();
2980}
2981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002982TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002983 Base::SendWithWritabilityLoss();
2984}
2985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002986TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 Base::TestMediaMonitor();
2988}
2989
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002990TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991 Base::TestSetContentFailure();
2992}
2993
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002994TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995 Base::TestSendTwoOffers();
2996}
2997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002998TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999 Base::TestReceiveTwoOffers();
3000}
3001
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003002TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 Base::TestSendPrAnswer();
3004}
3005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003006TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003007 Base::TestReceivePrAnswer();
3008}
3009
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003010TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003011 Base::TestFlushRtcp();
3012}
3013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003014TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003015 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016}
3017
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003018TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003019 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003020}
3021
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003022TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003023 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003024}
3025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003026TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003027 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003028}
3029
zstein56162b92017-04-24 16:54:35 -07003030TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3031 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032}
3033
zstein56162b92017-04-24 16:54:35 -07003034TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3035 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003036}
3037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003038TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003039 Base::DefaultMaxBitrateIsUnlimited();
3040}
3041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003042TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003043 Base::CanChangeMaxBitrate();
3044}
3045
Steve Anton8a63f782017-10-23 13:08:53 -07003046TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3047 Base::SocketOptionsMergedOnSetTransport();
3048}
3049
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003050// VideoChannelDoubleThreadTest
3051TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3052 Base::TestInit();
3053}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003054
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003055TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3056 Base::TestDeinit();
3057}
3058
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003059TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3060 Base::TestSetContents();
3061}
3062
3063TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3064 Base::TestSetContentsNullOffer();
3065}
3066
3067TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3068 Base::TestSetContentsRtcpMux();
3069}
3070
3071TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3072 Base::TestSetContentsRtcpMux();
3073}
3074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003075TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3076 Base::TestStreams();
3077}
3078
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003079TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3080 Base::TestChangeStreamParamsInContent();
3081}
3082
3083TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3084 Base::TestPlayoutAndSendingStates();
3085}
3086
3087TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3088 CreateChannels(0, 0);
3089 // Test that we can Mute the default channel even though the sending SSRC
3090 // is unknown.
3091 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003092 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003093 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003094 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003095 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3096 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003097 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003098 SendInitiate();
3099 // After the local session description has been set, we can mute a stream
3100 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003101 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003102 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003103 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003104 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3105}
3106
3107TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3108 Base::TestMediaContentDirection();
3109}
3110
3111TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3112 Base::TestNetworkRouteChanges();
3113}
3114
3115TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3116 Base::TestCallSetup();
3117}
3118
3119TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3120 Base::TestCallTeardownRtcpMux();
3121}
3122
3123TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3124 Base::SendRtpToRtp();
3125}
3126
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003127TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3128 Base::SendRtcpToRtcp();
3129}
3130
3131TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3132 Base::SendRtcpMuxToRtcp();
3133}
3134
3135TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3136 Base::SendRtcpMuxToRtcpMux();
3137}
3138
3139TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3140 Base::SendRequireRtcpMuxToRtcpMux();
3141}
3142
3143TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3144 Base::SendRtcpMuxToRequireRtcpMux();
3145}
3146
3147TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3148 Base::SendRequireRtcpMuxToRequireRtcpMux();
3149}
3150
3151TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3152 Base::SendRequireRtcpMuxToNoRtcpMux();
3153}
3154
3155TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3156 Base::SendEarlyRtcpMuxToRtcp();
3157}
3158
3159TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3160 Base::SendEarlyRtcpMuxToRtcpMux();
3161}
3162
3163TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3164 Base::SendSrtpToSrtp();
3165}
3166
3167TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3168 Base::SendSrtpToSrtp();
3169}
3170
3171TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003172 Base::SendSrtpToSrtp(DTLS, 0);
3173}
3174
3175TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003176 Base::SendSrtpToSrtp(DTLS, DTLS);
3177}
3178
3179TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003180 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3181}
3182
deadbeeff5346592017-01-24 21:51:21 -08003183// Test using the channel with a raw packet interface, as opposed to a DTLS
3184// transport interface.
3185TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3186 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3187}
3188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003189TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3190 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3191}
3192
3193TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3194 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3195}
3196
3197TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3198 Base::SendRtpToRtpOnThread();
3199}
3200
3201TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3202 Base::SendSrtpToSrtpOnThread();
3203}
3204
3205TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3206 Base::SendWithWritabilityLoss();
3207}
3208
3209TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3210 Base::TestMediaMonitor();
3211}
3212
3213TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3214 Base::TestSetContentFailure();
3215}
3216
3217TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3218 Base::TestSendTwoOffers();
3219}
3220
3221TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3222 Base::TestReceiveTwoOffers();
3223}
3224
3225TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3226 Base::TestSendPrAnswer();
3227}
3228
3229TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3230 Base::TestReceivePrAnswer();
3231}
3232
3233TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3234 Base::TestFlushRtcp();
3235}
3236
3237TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3238 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3239}
3240
3241TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3242 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3243}
3244
3245TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3246 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3247}
3248
3249TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3250 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3251}
3252
zstein56162b92017-04-24 16:54:35 -07003253TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3254 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003255}
3256
zstein56162b92017-04-24 16:54:35 -07003257TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3258 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003259}
3260
3261TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3262 Base::DefaultMaxBitrateIsUnlimited();
3263}
3264
3265TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3266 Base::CanChangeMaxBitrate();
3267}
3268
Steve Anton8a63f782017-10-23 13:08:53 -07003269TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3270 Base::SocketOptionsMergedOnSetTransport();
3271}
3272
deadbeef953c2ce2017-01-09 14:53:41 -08003273// RtpDataChannelSingleThreadTest
3274class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003275 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003276 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003277 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003278 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3279};
3280
deadbeef953c2ce2017-01-09 14:53:41 -08003281// RtpDataChannelDoubleThreadTest
3282class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003283 public:
3284 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003285 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003286 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003287};
3288
3289// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003290template <>
Steve Anton8699a322017-11-06 15:53:33 -08003291std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003292 rtc::Thread* worker_thread,
3293 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003294 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003295 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003296 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3297 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003298 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3299 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003300 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003301 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003302 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3303 worker_thread, network_thread, signaling_thread, std::move(ch),
3304 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3305 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003306 if (!channel->NeedsRtcpTransport()) {
3307 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003308 }
Steve Anton8699a322017-11-06 15:53:33 -08003309 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3310 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003311 return channel;
3312}
3313
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003314template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003315void ChannelTest<DataTraits>::CreateContent(
3316 int flags,
3317 const cricket::AudioCodec& audio_codec,
3318 const cricket::VideoCodec& video_codec,
3319 cricket::DataContentDescription* data) {
3320 data->AddCodec(kGoogleDataCodec);
3321 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3322 if (flags & SECURE) {
3323 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003324 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3325 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003326 }
3327}
3328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003329template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003330void ChannelTest<DataTraits>::CopyContent(
3331 const cricket::DataContentDescription& source,
3332 cricket::DataContentDescription* data) {
3333 *data = source;
3334}
3335
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003336template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003337bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3338 const cricket::DataCodec& c2) {
3339 return c1.name == c2.name;
3340}
3341
Peter Boström0c4e06b2015-10-07 12:23:21 +02003342template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003343void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003344 uint32_t ssrc,
3345 int flags,
3346 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003347 data->AddLegacyStream(ssrc);
3348}
3349
deadbeef953c2ce2017-01-09 14:53:41 -08003350TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003351 Base::TestInit();
3352 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3353}
3354
deadbeef953c2ce2017-01-09 14:53:41 -08003355TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003356 Base::TestDeinit();
3357}
3358
deadbeef953c2ce2017-01-09 14:53:41 -08003359TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003360 Base::TestSetContents();
3361}
3362
deadbeef953c2ce2017-01-09 14:53:41 -08003363TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003364 Base::TestSetContentsNullOffer();
3365}
3366
deadbeef953c2ce2017-01-09 14:53:41 -08003367TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003368 Base::TestSetContentsRtcpMux();
3369}
3370
deadbeef953c2ce2017-01-09 14:53:41 -08003371TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003372 Base::TestStreams();
3373}
3374
deadbeef953c2ce2017-01-09 14:53:41 -08003375TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003376 Base::TestChangeStreamParamsInContent();
3377}
3378
deadbeef953c2ce2017-01-09 14:53:41 -08003379TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003380 Base::TestPlayoutAndSendingStates();
3381}
3382
deadbeef953c2ce2017-01-09 14:53:41 -08003383TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003384 Base::TestMediaContentDirection();
3385}
3386
deadbeef953c2ce2017-01-09 14:53:41 -08003387TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003388 Base::TestCallSetup();
3389}
3390
deadbeef953c2ce2017-01-09 14:53:41 -08003391TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003392 Base::TestCallTeardownRtcpMux();
3393}
3394
zstein56162b92017-04-24 16:54:35 -07003395TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3396 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003397}
3398
zstein56162b92017-04-24 16:54:35 -07003399TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3400 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003401}
3402
deadbeef953c2ce2017-01-09 14:53:41 -08003403TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003404 Base::SendRtpToRtp();
3405}
3406
deadbeef953c2ce2017-01-09 14:53:41 -08003407TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003408 Base::SendRtcpToRtcp();
3409}
3410
deadbeef953c2ce2017-01-09 14:53:41 -08003411TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003412 Base::SendRtcpMuxToRtcp();
3413}
3414
deadbeef953c2ce2017-01-09 14:53:41 -08003415TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003416 Base::SendRtcpMuxToRtcpMux();
3417}
3418
deadbeef953c2ce2017-01-09 14:53:41 -08003419TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003420 Base::SendEarlyRtcpMuxToRtcp();
3421}
3422
deadbeef953c2ce2017-01-09 14:53:41 -08003423TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003424 Base::SendEarlyRtcpMuxToRtcpMux();
3425}
3426
deadbeef953c2ce2017-01-09 14:53:41 -08003427TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003428 Base::SendSrtpToSrtp();
3429}
3430
deadbeef953c2ce2017-01-09 14:53:41 -08003431TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003432 Base::SendSrtpToSrtp();
3433}
3434
deadbeef953c2ce2017-01-09 14:53:41 -08003435TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003436 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3437}
3438
deadbeef953c2ce2017-01-09 14:53:41 -08003439TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003440 Base::SendRtpToRtpOnThread();
3441}
3442
deadbeef953c2ce2017-01-09 14:53:41 -08003443TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003444 Base::SendSrtpToSrtpOnThread();
3445}
3446
deadbeef953c2ce2017-01-09 14:53:41 -08003447TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003448 Base::SendWithWritabilityLoss();
3449}
3450
deadbeef953c2ce2017-01-09 14:53:41 -08003451TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003452 Base::TestMediaMonitor();
3453}
3454
Steve Anton8a63f782017-10-23 13:08:53 -07003455TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3456 Base::SocketOptionsMergedOnSetTransport();
3457}
3458
deadbeef953c2ce2017-01-09 14:53:41 -08003459TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003460 CreateChannels(0, 0);
3461 EXPECT_TRUE(SendInitiate());
3462 EXPECT_TRUE(SendAccept());
3463
3464 cricket::SendDataParams params;
3465 params.ssrc = 42;
3466 unsigned char data[] = {'f', 'o', 'o'};
3467 rtc::CopyOnWriteBuffer payload(data, 3);
3468 cricket::SendDataResult result;
3469 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3470 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3471 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3472}
3473
deadbeef953c2ce2017-01-09 14:53:41 -08003474TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003475 Base::TestInit();
3476 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3477}
3478
deadbeef953c2ce2017-01-09 14:53:41 -08003479TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003480 Base::TestDeinit();
3481}
3482
deadbeef953c2ce2017-01-09 14:53:41 -08003483TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003484 Base::TestSetContents();
3485}
3486
deadbeef953c2ce2017-01-09 14:53:41 -08003487TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003488 Base::TestSetContentsNullOffer();
3489}
3490
deadbeef953c2ce2017-01-09 14:53:41 -08003491TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003492 Base::TestSetContentsRtcpMux();
3493}
3494
deadbeef953c2ce2017-01-09 14:53:41 -08003495TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003496 Base::TestStreams();
3497}
3498
deadbeef953c2ce2017-01-09 14:53:41 -08003499TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003500 Base::TestChangeStreamParamsInContent();
3501}
3502
deadbeef953c2ce2017-01-09 14:53:41 -08003503TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003504 Base::TestPlayoutAndSendingStates();
3505}
3506
deadbeef953c2ce2017-01-09 14:53:41 -08003507TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003508 Base::TestMediaContentDirection();
3509}
3510
deadbeef953c2ce2017-01-09 14:53:41 -08003511TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003512 Base::TestCallSetup();
3513}
3514
deadbeef953c2ce2017-01-09 14:53:41 -08003515TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003516 Base::TestCallTeardownRtcpMux();
3517}
3518
zstein56162b92017-04-24 16:54:35 -07003519TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3520 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003521}
3522
zstein56162b92017-04-24 16:54:35 -07003523TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3524 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003525}
3526
deadbeef953c2ce2017-01-09 14:53:41 -08003527TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003528 Base::SendRtpToRtp();
3529}
3530
deadbeef953c2ce2017-01-09 14:53:41 -08003531TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003532 Base::SendRtcpToRtcp();
3533}
3534
deadbeef953c2ce2017-01-09 14:53:41 -08003535TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003536 Base::SendRtcpMuxToRtcp();
3537}
3538
deadbeef953c2ce2017-01-09 14:53:41 -08003539TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003540 Base::SendRtcpMuxToRtcpMux();
3541}
3542
deadbeef953c2ce2017-01-09 14:53:41 -08003543TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003544 Base::SendEarlyRtcpMuxToRtcp();
3545}
3546
deadbeef953c2ce2017-01-09 14:53:41 -08003547TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003548 Base::SendEarlyRtcpMuxToRtcpMux();
3549}
3550
deadbeef953c2ce2017-01-09 14:53:41 -08003551TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003552 Base::SendSrtpToSrtp();
3553}
3554
deadbeef953c2ce2017-01-09 14:53:41 -08003555TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003556 Base::SendSrtpToSrtp();
3557}
3558
deadbeef953c2ce2017-01-09 14:53:41 -08003559TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003560 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3561}
3562
deadbeef953c2ce2017-01-09 14:53:41 -08003563TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003564 Base::SendRtpToRtpOnThread();
3565}
3566
deadbeef953c2ce2017-01-09 14:53:41 -08003567TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003568 Base::SendSrtpToSrtpOnThread();
3569}
3570
deadbeef953c2ce2017-01-09 14:53:41 -08003571TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003572 Base::SendWithWritabilityLoss();
3573}
3574
deadbeef953c2ce2017-01-09 14:53:41 -08003575TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003576 Base::TestMediaMonitor();
3577}
3578
Steve Anton8a63f782017-10-23 13:08:53 -07003579TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3580 Base::SocketOptionsMergedOnSetTransport();
3581}
3582
deadbeef953c2ce2017-01-09 14:53:41 -08003583TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003584 CreateChannels(0, 0);
3585 EXPECT_TRUE(SendInitiate());
3586 EXPECT_TRUE(SendAccept());
3587
3588 cricket::SendDataParams params;
3589 params.ssrc = 42;
3590 unsigned char data[] = {
3591 'f', 'o', 'o'
3592 };
jbaucheec21bd2016-03-20 06:15:43 -07003593 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003594 cricket::SendDataResult result;
3595 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3596 EXPECT_EQ(params.ssrc,
3597 media_channel1_->last_sent_data_params().ssrc);
3598 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3599}
3600
deadbeefbad5dad2017-01-17 18:32:35 -08003601#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3602
3603// Verifies some DCHECKs are in place.
3604// Uses VoiceChannel, but any BaseChannel subclass would work.
3605class BaseChannelDeathTest : public testing::Test {
3606 public:
3607 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003608 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3609 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3610 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003611 voice_channel_(rtc::Thread::Current(),
3612 rtc::Thread::Current(),
3613 rtc::Thread::Current(),
3614 &fake_media_engine_,
3615 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3616 nullptr,
3617 cricket::AudioOptions()),
3618 cricket::CN_AUDIO,
3619 false,
3620 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003621
3622 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003623 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003624 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3625 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003626 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003627};
3628
deadbeeff5346592017-01-24 21:51:21 -08003629TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003630 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3631 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003632 cricket::FakeDtlsTransport new_rtcp_transport(
3633 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3634 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003635}
3636
deadbeeff5346592017-01-24 21:51:21 -08003637TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003638 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3639 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003640 cricket::FakeDtlsTransport new_rtp_transport(
3641 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3642 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003643}
3644
deadbeeff5346592017-01-24 21:51:21 -08003645TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003646 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3647 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003648 // Activate RTCP muxing, simulating offer/answer negotiation.
3649 cricket::AudioContentDescription content;
3650 content.set_rtcp_mux(true);
3651 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3652 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003653 cricket::FakeDtlsTransport new_rtp_transport(
3654 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3655 cricket::FakeDtlsTransport new_rtcp_transport(
3656 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003657 // After muxing is enabled, no RTCP transport should be passed in here.
3658 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003659 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3660 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003661}
3662
3663// This test will probably go away if/when we move the transport name out of
3664// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003665TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003666 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3667 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003668 cricket::FakeDtlsTransport new_rtp_transport(
3669 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3670 cricket::FakeDtlsTransport new_rtcp_transport(
3671 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003672 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003673 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3674 "");
3675}
3676
3677// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003678// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003679TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003680 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3681 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003682 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003683 voice_channel_.SetTransports(
3684 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3685 static_cast<rtc::PacketTransportInternal*>(
3686 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003687 "");
3688}
3689
deadbeef5bd5ca32017-02-10 11:31:50 -08003690// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003691// DtlsTransportInternal.
3692TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003693 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3694 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003695 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3696 &fake_rtp_dtls_transport_),
3697 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003698}
3699
3700#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3701
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003702// TODO(pthatcher): TestSetReceiver?