blob: d1ceac5160f1bb5d64631c984dcffc55088c90bc [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;
Steve Anton4e70a722017-11-28 14:57:10 -080036using webrtc::RtpTransceiverDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037
Danil Chapovalov33b01f22016-05-11 19:55:27 +020038namespace {
39const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
40const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
41const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070042const cricket::VideoCodec kH264Codec(97, "H264");
43const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020044const cricket::DataCodec kGoogleDataCodec(101, "google-data");
45const uint32_t kSsrc1 = 0x1111;
46const uint32_t kSsrc2 = 0x2222;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020047const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080050const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
deadbeefcbecd352015-09-23 11:50:27 -070053template <class ChannelT,
54 class MediaChannelT,
55 class ContentT,
56 class CodecT,
57 class MediaInfoT,
58 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059class Traits {
60 public:
61 typedef ChannelT Channel;
62 typedef MediaChannelT MediaChannel;
63 typedef ContentT Content;
64 typedef CodecT Codec;
65 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020066 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class VoiceTraits : public Traits<cricket::VoiceChannel,
70 cricket::FakeVoiceMediaChannel,
71 cricket::AudioContentDescription,
72 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070074 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class VideoTraits : public Traits<cricket::VideoChannel,
77 cricket::FakeVideoMediaChannel,
78 cricket::VideoContentDescription,
79 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070081 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
deadbeef953c2ce2017-01-09 14:53:41 -080083class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 cricket::FakeDataMediaChannel,
85 cricket::DataContentDescription,
86 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
deadbeef953c2ce2017-01-09 14:53:41 -080090// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091template<class T>
92class ChannelTest : public testing::Test, public sigslot::has_slots<> {
93 public:
deadbeefac22f702017-01-12 21:59:29 -080094 enum Flags {
95 RTCP_MUX = 0x1,
96 RTCP_MUX_REQUIRED = 0x2,
97 SECURE = 0x4,
98 SSRC_MUX = 0x8,
99 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800100 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800101 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700102 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700103 GCM_CIPHER = 0x40,
104 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800105 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106
Peter Boström34fbfff2015-09-24 19:20:30 +0200107 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 rtc::ArrayView<const uint8_t> rtp_data,
109 rtc::ArrayView<const uint8_t> rtcp_data,
110 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200111 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200112 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800113 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 if (network_is_worker == NetworkIsWorker::Yes) {
115 network_thread_ = rtc::Thread::Current();
116 } else {
117 network_thread_keeper_ = rtc::Thread::Create();
118 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 network_thread_ = network_thread_keeper_.get();
120 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800124 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
125 nullptr, typename T::Options()),
126 rtc::MakeUnique<typename T::MediaChannel>(
127 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
Steve Anton8699a322017-11-06 15:53:33 -0800130 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
131 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 int flags1,
133 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800134 // Network thread is started in CreateChannels, to allow the test to
135 // configure a fake clock before any threads are spawned and attempt to
136 // access the time.
137 if (network_thread_keeper_) {
138 network_thread_keeper_->Start();
139 }
deadbeefac22f702017-01-12 21:59:29 -0800140 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800141 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
142 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
143 // Make sure if using raw packet transports, they're used for both
144 // channels.
145 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200146 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800147 media_channel1_ = ch1.get();
148 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800149 rtc::PacketTransportInternal* rtp1 = nullptr;
150 rtc::PacketTransportInternal* rtcp1 = nullptr;
151 rtc::PacketTransportInternal* rtp2 = nullptr;
152 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800153 // Based on flags, create fake DTLS or raw packet transports.
154 if (flags1 & RAW_PACKET_TRANSPORT) {
155 fake_rtp_packet_transport1_.reset(
156 new rtc::FakePacketTransport("channel1_rtp"));
157 rtp1 = fake_rtp_packet_transport1_.get();
158 if (!(flags1 & RTCP_MUX_REQUIRED)) {
159 fake_rtcp_packet_transport1_.reset(
160 new rtc::FakePacketTransport("channel1_rtcp"));
161 rtcp1 = fake_rtcp_packet_transport1_.get();
162 }
163 } else {
164 // Confirmed to work with KT_RSA and KT_ECDSA.
165 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
166 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
167 rtp1 = fake_rtp_dtls_transport1_.get();
168 if (!(flags1 & RTCP_MUX_REQUIRED)) {
169 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
171 rtcp1 = fake_rtcp_dtls_transport1_.get();
172 }
173 if (flags1 & DTLS) {
174 auto cert1 =
175 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
176 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
177 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
178 if (fake_rtcp_dtls_transport1_) {
179 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
180 }
181 }
jbauch5869f502017-06-29 12:31:36 -0700182 if (flags1 & ENCRYPTED_HEADERS) {
183 rtc::CryptoOptions crypto_options;
184 crypto_options.enable_encrypted_rtp_header_extensions = true;
185 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
188 }
189 }
190 if (flags1 & GCM_CIPHER) {
191 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
192 rtc::SRTP_AEAD_AES_256_GCM);
193 if (fake_rtcp_dtls_transport1_) {
194 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
195 rtc::SRTP_AEAD_AES_256_GCM);
196 }
197 }
deadbeeff5346592017-01-24 21:51:21 -0800198 }
199 // Based on flags, create fake DTLS or raw packet transports.
200 if (flags2 & RAW_PACKET_TRANSPORT) {
201 fake_rtp_packet_transport2_.reset(
202 new rtc::FakePacketTransport("channel2_rtp"));
203 rtp2 = fake_rtp_packet_transport2_.get();
204 if (!(flags2 & RTCP_MUX_REQUIRED)) {
205 fake_rtcp_packet_transport2_.reset(
206 new rtc::FakePacketTransport("channel2_rtcp"));
207 rtcp2 = fake_rtcp_packet_transport2_.get();
208 }
209 } else {
210 // Confirmed to work with KT_RSA and KT_ECDSA.
211 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
212 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
213 rtp2 = fake_rtp_dtls_transport2_.get();
214 if (!(flags2 & RTCP_MUX_REQUIRED)) {
215 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
216 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
217 rtcp2 = fake_rtcp_dtls_transport2_.get();
218 }
219 if (flags2 & DTLS) {
220 auto cert2 =
221 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
222 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
223 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
224 if (fake_rtcp_dtls_transport2_) {
225 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
226 }
227 }
jbauch5869f502017-06-29 12:31:36 -0700228 if (flags2 & ENCRYPTED_HEADERS) {
229 rtc::CryptoOptions crypto_options;
230 crypto_options.enable_encrypted_rtp_header_extensions = true;
231 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 if (fake_rtcp_dtls_transport2_) {
233 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
234 }
235 }
236 if (flags2 & GCM_CIPHER) {
237 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
238 rtc::SRTP_AEAD_AES_256_GCM);
239 if (fake_rtcp_dtls_transport2_) {
240 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
241 rtc::SRTP_AEAD_AES_256_GCM);
242 }
243 }
deadbeeff5346592017-01-24 21:51:21 -0800244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 channel1_ =
246 CreateChannel(worker_thread, network_thread_, &media_engine_,
247 std::move(ch1), fake_rtp_dtls_transport1_.get(),
248 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
249 channel2_ =
250 CreateChannel(worker_thread, network_thread_, &media_engine_,
251 std::move(ch2), fake_rtp_dtls_transport2_.get(),
252 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200253 channel1_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor1);
255 channel2_->SignalMediaMonitor.connect(this,
256 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800259 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800260 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000261 if ((flags1 & DTLS) && (flags2 & DTLS)) {
262 flags1 = (flags1 & ~SECURE);
263 flags2 = (flags2 & ~SECURE);
264 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000265 CreateContent(flags1, kPcmuCodec, kH264Codec,
266 &local_media_content1_);
267 CreateContent(flags2, kPcmuCodec, kH264Codec,
268 &local_media_content2_);
269 CopyContent(local_media_content1_, &remote_media_content1_);
270 CopyContent(local_media_content2_, &remote_media_content2_);
271
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 // Add stream information (SSRC) to the local content but not to the remote
273 // content. This means that we per default know the SSRC of what we send but
274 // not what we receive.
275 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
276 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
277
278 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
279 if (flags1 & SSRC_MUX) {
280 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
281 }
282 if (flags2 & SSRC_MUX) {
283 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
284 }
285 }
Steve Anton8699a322017-11-06 15:53:33 -0800286 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200287 rtc::Thread* worker_thread,
288 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700289 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800290 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800291 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
292 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800293 rtc::PacketTransportInternal* fake_rtp_packet_transport,
294 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700295 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800296 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800297 auto channel = rtc::MakeUnique<typename T::Channel>(
298 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800299 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
300 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800301 if (!channel->NeedsRtcpTransport()) {
302 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800303 }
Steve Anton8699a322017-11-06 15:53:33 -0800304 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
305 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000306 return channel;
307 }
308
deadbeeff5346592017-01-24 21:51:21 -0800309 void ConnectFakeTransports() {
310 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
311 bool asymmetric = false;
312 // Depending on test flags, could be using DTLS or raw packet transport.
313 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
314 fake_rtp_dtls_transport1_->SetDestination(
315 fake_rtp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
318 fake_rtcp_dtls_transport1_->SetDestination(
319 fake_rtcp_dtls_transport2_.get(), asymmetric);
320 }
321 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
322 fake_rtp_packet_transport1_->SetDestination(
323 fake_rtp_packet_transport2_.get(), asymmetric);
324 }
325 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
326 fake_rtcp_packet_transport1_->SetDestination(
327 fake_rtcp_packet_transport2_.get(), asymmetric);
328 }
329 });
330 }
331
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 bool result = channel1_->SetLocalContent(&local_media_content1_,
334 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
336 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetRemoteContent(&remote_media_content1_,
338 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800340 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000341 result = channel2_->SetLocalContent(&local_media_content2_,
342 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 }
344 }
345 return result;
346 }
347
348 bool SendAccept() {
349 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000350 return channel1_->SetRemoteContent(&remote_media_content2_,
351 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352 }
353
354 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 bool result = channel1_->SetLocalContent(&local_media_content1_,
356 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 if (result) {
358 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 result = channel2_->SetRemoteContent(&remote_media_content1_,
360 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 }
362 return result;
363 }
364
365 bool SendProvisionalAnswer() {
366 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
369 channel2_->Enable(true);
370 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000371 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800372 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 }
374 return result;
375 }
376
377 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 bool result = channel2_->SetLocalContent(&local_media_content2_,
379 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 result = channel1_->SetRemoteContent(&remote_media_content2_,
382 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 return result;
384 }
385
deadbeeff5346592017-01-24 21:51:21 -0800386 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 channel1_.reset();
388 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800389 fake_rtp_dtls_transport1_.reset();
390 fake_rtcp_dtls_transport1_.reset();
391 fake_rtp_dtls_transport2_.reset();
392 fake_rtcp_dtls_transport2_.reset();
393 fake_rtp_packet_transport1_.reset();
394 fake_rtcp_packet_transport1_.reset();
395 fake_rtp_packet_transport2_.reset();
396 fake_rtcp_packet_transport2_.reset();
397 if (network_thread_keeper_) {
398 network_thread_keeper_.reset();
399 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 return true;
401 }
402
403 bool AddStream1(int id) {
404 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
405 }
406 bool RemoveStream1(int id) {
407 return channel1_->RemoveRecvStream(id);
408 }
409
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp1() {
411 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtp2() {
415 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
416 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtcp1() {
419 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendRtcp2() {
422 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
426 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
427 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtcp1(uint32_t ssrc) {
434 rtc::Buffer data = CreateRtcpData(ssrc);
435 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtcp2(uint32_t ssrc) {
438 rtc::Buffer data = CreateRtcpData(ssrc);
439 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
451 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 }
454 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200455 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
457 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
461 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtcpData(ssrc);
465 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtcpData(ssrc);
469 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
472 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::SetBE32(data.data() + 8, ssrc);
475 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
482 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 return data;
486 }
487
488 bool CheckNoRtp1() {
489 return media_channel1_->CheckNoRtp();
490 }
491 bool CheckNoRtp2() {
492 return media_channel2_->CheckNoRtp();
493 }
494 bool CheckNoRtcp1() {
495 return media_channel1_->CheckNoRtcp();
496 }
497 bool CheckNoRtcp2() {
498 return media_channel2_->CheckNoRtcp();
499 }
500
501 void CreateContent(int flags,
502 const cricket::AudioCodec& audio_codec,
503 const cricket::VideoCodec& video_codec,
504 typename T::Content* content) {
505 // overridden in specialized classes
506 }
507 void CopyContent(const typename T::Content& source,
508 typename T::Content* content) {
509 // overridden in specialized classes
510 }
511
Steve Anton18ee1d52017-09-11 11:32:35 -0700512 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
515 typename T::Content* content = new typename T::Content();
516 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
517 AddLegacyStreamInContent(ssrc, 0, content);
518 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 }
520
ossu292d6582016-03-17 02:31:13 -0700521 // Will manage the lifetime of a CallThread, making sure it's
522 // destroyed before this object goes out of scope.
523 class ScopedCallThread {
524 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700526 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 : thread_(rtc::Thread::Create()),
528 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700529 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700530 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700531 }
532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700534
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700536
537 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200538 std::unique_ptr<rtc::Thread> thread_;
539 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700540 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
543 return false; // overridden in specialized classes
544 }
545
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200546 void OnMediaMonitor1(typename T::Channel* channel,
547 const typename T::MediaInfo& info) {
548 RTC_DCHECK_EQ(channel, channel1_.get());
549 media_info_callbacks1_++;
550 }
551 void OnMediaMonitor2(typename T::Channel* channel,
552 const typename T::MediaInfo& info) {
553 RTC_DCHECK_EQ(channel, channel2_.get());
554 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 }
deadbeeff5346592017-01-24 21:51:21 -0800556 void OnRtcpMuxFullyActive1(const std::string&) {
557 rtcp_mux_activated_callbacks1_++;
558 }
559 void OnRtcpMuxFullyActive2(const std::string&) {
560 rtcp_mux_activated_callbacks2_++;
561 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562
Honghai Zhangcc411c02016-03-29 17:27:21 -0700563 cricket::CandidatePairInterface* last_selected_candidate_pair() {
564 return last_selected_candidate_pair_;
565 }
566
Peter Boström0c4e06b2015-10-07 12:23:21 +0200567 void AddLegacyStreamInContent(uint32_t ssrc,
568 int flags,
569 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 // Base implementation.
571 }
572
573 // Tests that can be used by derived classes.
574
575 // Basic sanity check.
576 void TestInit() {
577 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700578 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200580 if (verify_playout_) {
581 EXPECT_FALSE(media_channel1_->playout());
582 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_TRUE(media_channel1_->codecs().empty());
584 EXPECT_TRUE(media_channel1_->recv_streams().empty());
585 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
586 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
587 }
588
589 // Test that SetLocalContent and SetRemoteContent properly configure
590 // the codecs.
591 void TestSetContents() {
592 CreateChannels(0, 0);
593 typename T::Content content;
594 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000595 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000597 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 ASSERT_EQ(1U, media_channel1_->codecs().size());
599 EXPECT_TRUE(CodecMatches(content.codecs()[0],
600 media_channel1_->codecs()[0]));
601 }
602
603 // Test that SetLocalContent and SetRemoteContent properly deals
604 // with an empty offer.
605 void TestSetContentsNullOffer() {
606 CreateChannels(0, 0);
607 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000608 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 CreateContent(0, kPcmuCodec, kH264Codec, &content);
610 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 ASSERT_EQ(1U, media_channel1_->codecs().size());
613 EXPECT_TRUE(CodecMatches(content.codecs()[0],
614 media_channel1_->codecs()[0]));
615 }
616
617 // Test that SetLocalContent and SetRemoteContent properly set RTCP
618 // mux.
619 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800620 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 typename T::Content content;
622 CreateContent(0, kPcmuCodec, kH264Codec, &content);
623 // Both sides agree on mux. Should no longer be a separate RTCP channel.
624 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000625 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
626 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000630 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
633 // Test that SetLocalContent and SetRemoteContent properly set RTCP
634 // mux when a provisional answer is received.
635 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800636 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 typename T::Content content;
638 CreateContent(0, kPcmuCodec, kH264Codec, &content);
639 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000640 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
641 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800642 // Both sides agree on mux. Should signal RTCP mux as fully activated.
643 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000644 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800645 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000647 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 }
653
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Test that Add/RemoveStream properly forward to the media channel.
655 void TestStreams() {
656 CreateChannels(0, 0);
657 EXPECT_TRUE(AddStream1(1));
658 EXPECT_TRUE(AddStream1(2));
659 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
660 EXPECT_TRUE(RemoveStream1(2));
661 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
662 EXPECT_TRUE(RemoveStream1(1));
663 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
664 }
665
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Test that SetLocalContent and SetRemoteContent properly
667 // handles adding and removing StreamParams when the action is a full
668 // CA_OFFER / CA_ANSWER.
669 void TestChangeStreamParamsInContent() {
670 cricket::StreamParams stream1;
671 stream1.groupid = "group1";
672 stream1.id = "stream1";
673 stream1.ssrcs.push_back(kSsrc1);
674 stream1.cname = "stream1_cname";
675
676 cricket::StreamParams stream2;
677 stream2.groupid = "group1";
678 stream2.id = "stream2";
679 stream2.ssrcs.push_back(kSsrc2);
680 stream2.cname = "stream2_cname";
681
682 // Setup a call where channel 1 send |stream1| to channel 2.
683 CreateChannels(0, 0);
684 typename T::Content content1;
685 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
686 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(channel1_->Enable(true));
689 EXPECT_EQ(1u, media_channel1_->send_streams().size());
690
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800693 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // Channel 2 do not send anything.
696 typename T::Content content2;
697 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_TRUE(channel2_->Enable(true));
702 EXPECT_EQ(0u, media_channel2_->send_streams().size());
703
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200704 SendCustomRtp1(kSsrc1, 0);
705 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
707
708 // Let channel 2 update the content by sending |stream2| and enable SRTP.
709 typename T::Content content3;
710 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
711 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000712 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 ASSERT_EQ(1u, media_channel2_->send_streams().size());
714 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
715
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000716 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
718 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
719
720 // Channel 1 replies but stop sending stream1.
721 typename T::Content content4;
722 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000723 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
725
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000726 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
728
Zhi Huangcf990f52017-09-22 12:12:30 -0700729 EXPECT_TRUE(channel1_->srtp_active());
730 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200731 SendCustomRtp2(kSsrc2, 0);
732 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
734 }
735
jbauch5869f502017-06-29 12:31:36 -0700736 enum EncryptedHeaderTestScenario {
737 // Offer/Answer are processed before DTLS completes.
738 DEFAULT,
739 // DTLS completes before any Offer/Answer have been sent.
740 DTLS_BEFORE_OFFER_ANSWER,
741 // DTLS completes after channel 2 has processed (remote) Offer and (local)
742 // Answer.
743 DTLS_AFTER_CHANNEL2_READY,
744 };
745
746 // Test that encrypted header extensions are working and can be changed when
747 // sending a new OFFER/ANSWER.
748 void TestChangeEncryptedHeaderExtensions(int flags,
749 EncryptedHeaderTestScenario scenario = DEFAULT) {
750 RTC_CHECK(scenario == 0 || (flags & DTLS));
751 struct PacketListener : public sigslot::has_slots<> {
752 PacketListener() {}
753 void OnReadPacket(rtc::PacketTransportInternal* transport,
754 const char* data, size_t size, const rtc::PacketTime& time,
755 int flags) {
756 CompareHeaderExtensions(
757 reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
758 sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
759 false);
760 }
761 std::vector<int> encrypted_headers;
762 } packet_listener1, packet_listener2;
763
764 cricket::StreamParams stream1;
765 stream1.groupid = "group1";
766 stream1.id = "stream1";
767 stream1.ssrcs.push_back(kSsrc1);
768 stream1.cname = "stream1_cname";
769
770 cricket::StreamParams stream2;
771 stream2.groupid = "group1";
772 stream2.id = "stream2";
773 stream2.ssrcs.push_back(kSsrc2);
774 stream2.cname = "stream2_cname";
775
776 // Use SRTP when testing encrypted extensions.
777 int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
778 // Enable SDES if channel is not using DTLS.
779 int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
780
781 // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
782 // Make sure to use URIs that are supported for encryption.
783 cricket::RtpHeaderExtensions extensions1;
784 extensions1.push_back(
785 RtpExtension(RtpExtension::kAudioLevelUri, 10));
786 extensions1.push_back(
787 RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
788
789 cricket::RtpHeaderExtensions extensions2;
790 extensions2.push_back(
791 RtpExtension(RtpExtension::kAudioLevelUri, 10));
792 extensions2.push_back(
793 RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
794 extensions2.push_back(
795 RtpExtension(RtpExtension::kVideoRotationUri, 3));
796 extensions2.push_back(
797 RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
798
799 // Setup a call where channel 1 send |stream1| to channel 2.
800 CreateChannels(channel_flags, channel_flags);
801 fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
802 &packet_listener1, &PacketListener::OnReadPacket);
803 fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
804 &packet_listener2, &PacketListener::OnReadPacket);
805
806 if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
807 ConnectFakeTransports();
808 WaitForThreads();
809 }
810
811 typename T::Content content1;
812 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
813 content1.AddStream(stream1);
814 content1.set_rtp_header_extensions(extensions1);
815 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
816 EXPECT_TRUE(channel1_->Enable(true));
817 EXPECT_EQ(1u, media_channel1_->send_streams().size());
818 packet_listener1.encrypted_headers.push_back(1);
819
820 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
821 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
822
823 // Channel 2 sends back |stream2|.
824 typename T::Content content2;
825 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
826 content2.AddStream(stream2);
827 content2.set_rtp_header_extensions(extensions1);
828 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
829 EXPECT_TRUE(channel2_->Enable(true));
830 EXPECT_EQ(1u, media_channel2_->send_streams().size());
831 packet_listener2.encrypted_headers.push_back(1);
832
833 if (scenario == DTLS_AFTER_CHANNEL2_READY) {
834 ConnectFakeTransports();
835 WaitForThreads();
836 }
837
838 if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
839 scenario == DTLS_AFTER_CHANNEL2_READY) {
840 // In both scenarios with partially completed Offer/Answer, sending
841 // packets from Channel 2 to Channel 1 should work.
842 SendCustomRtp2(kSsrc2, 0);
843 WaitForThreads();
844 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
845 }
846
847 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
848 EXPECT_EQ(1u, media_channel1_->recv_streams().size());
849
850 if (scenario == DEFAULT) {
851 ConnectFakeTransports();
852 WaitForThreads();
853 }
854
855 SendCustomRtp1(kSsrc1, 0);
856 SendCustomRtp2(kSsrc2, 0);
857 WaitForThreads();
858 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
859 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
860
861 // Let channel 2 update the encrypted header extensions.
862 typename T::Content content3;
863 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
864 content3.AddStream(stream2);
865 content3.set_rtp_header_extensions(extensions2);
866 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
867 ASSERT_EQ(1u, media_channel2_->send_streams().size());
868 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
869 packet_listener2.encrypted_headers.clear();
870 packet_listener2.encrypted_headers.push_back(2);
871 packet_listener2.encrypted_headers.push_back(4);
872
873 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
874 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
875 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
876
877 // Channel 1 is already sending the new encrypted extensions. These
878 // can be decrypted by channel 2. Channel 2 is still sending the old
879 // encrypted extensions (which can be decrypted by channel 1).
880
881 if (flags & DTLS) {
882 // DTLS supports updating the encrypted extensions with only the OFFER
883 // being processed. For SDES both the OFFER and ANSWER must have been
884 // processed to update encrypted extensions, so we can't check this case.
885 SendCustomRtp1(kSsrc1, 0);
886 SendCustomRtp2(kSsrc2, 0);
887 WaitForThreads();
888 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
889 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
890 }
891
892 // Channel 1 replies with the same extensions.
893 typename T::Content content4;
894 CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
895 content4.AddStream(stream1);
896 content4.set_rtp_header_extensions(extensions2);
897 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
898 EXPECT_EQ(1u, media_channel1_->send_streams().size());
899 packet_listener1.encrypted_headers.clear();
900 packet_listener1.encrypted_headers.push_back(2);
901 packet_listener1.encrypted_headers.push_back(4);
902
903 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
904 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
905
906 SendCustomRtp1(kSsrc1, 0);
907 SendCustomRtp2(kSsrc2, 0);
908 WaitForThreads();
909 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
910 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
911 }
912
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 // Test that we only start playout and sending at the right times.
914 void TestPlayoutAndSendingStates() {
915 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200916 if (verify_playout_) {
917 EXPECT_FALSE(media_channel1_->playout());
918 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200920 if (verify_playout_) {
921 EXPECT_FALSE(media_channel2_->playout());
922 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 EXPECT_FALSE(media_channel2_->sending());
924 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200925 if (verify_playout_) {
926 EXPECT_FALSE(media_channel1_->playout());
927 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000929 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
930 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200931 if (verify_playout_) {
932 EXPECT_TRUE(media_channel1_->playout());
933 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000934 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000935 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
936 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200937 if (verify_playout_) {
938 EXPECT_FALSE(media_channel2_->playout());
939 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000941 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
942 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200943 if (verify_playout_) {
944 EXPECT_FALSE(media_channel2_->playout());
945 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800947 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200948 if (verify_playout_) {
949 EXPECT_TRUE(media_channel1_->playout());
950 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200952 if (verify_playout_) {
953 EXPECT_FALSE(media_channel2_->playout());
954 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 EXPECT_FALSE(media_channel2_->sending());
956 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200957 if (verify_playout_) {
958 EXPECT_TRUE(media_channel2_->playout());
959 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000961 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
962 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200963 if (verify_playout_) {
964 EXPECT_TRUE(media_channel1_->playout());
965 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 EXPECT_TRUE(media_channel1_->sending());
967 }
968
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969 // Test that changing the MediaContentDirection in the local and remote
970 // session description start playout and sending at the right time.
971 void TestMediaContentDirection() {
972 CreateChannels(0, 0);
973 typename T::Content content1;
974 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
975 typename T::Content content2;
976 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
977 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800978 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979
980 EXPECT_TRUE(channel1_->Enable(true));
981 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200982 if (verify_playout_) {
983 EXPECT_FALSE(media_channel1_->playout());
984 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200986 if (verify_playout_) {
987 EXPECT_FALSE(media_channel2_->playout());
988 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989 EXPECT_FALSE(media_channel2_->sending());
990
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000991 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
992 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
993 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
994 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800995 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996
Peter Boström34fbfff2015-09-24 19:20:30 +0200997 if (verify_playout_) {
998 EXPECT_TRUE(media_channel1_->playout());
999 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001001 if (verify_playout_) {
1002 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1003 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1005
1006 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -08001007 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001008 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
1009 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010
Peter Boström34fbfff2015-09-24 19:20:30 +02001011 if (verify_playout_) {
1012 EXPECT_TRUE(media_channel1_->playout());
1013 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001015 if (verify_playout_) {
1016 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1017 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1019
1020 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -08001021 content2.set_direction(RtpTransceiverDirection::kSendRecv);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001022 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
1023 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024
Peter Boström34fbfff2015-09-24 19:20:30 +02001025 if (verify_playout_) {
1026 EXPECT_TRUE(media_channel1_->playout());
1027 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001029 if (verify_playout_) {
1030 EXPECT_TRUE(media_channel2_->playout());
1031 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(media_channel2_->sending());
1033 }
1034
Honghai Zhangcc411c02016-03-29 17:27:21 -07001035 // Tests that when the transport channel signals a candidate pair change
1036 // event, the media channel will receive a call on the network route change.
1037 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001038 static constexpr uint16_t kLocalNetId = 1;
1039 static constexpr uint16_t kRemoteNetId = 2;
1040 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001041 // Ipv4(20) + UDP(8).
1042 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001043
Honghai Zhangcc411c02016-03-29 17:27:21 -07001044 CreateChannels(0, 0);
1045
Honghai Zhangcc411c02016-03-29 17:27:21 -07001046 typename T::MediaChannel* media_channel1 =
1047 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001048 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001049
Zhi Huang942bc2e2017-11-13 13:26:07 -08001050 // Need to wait for the threads before calling
1051 // |set_num_network_route_changes| because the network route would be set
1052 // when creating the channel.
1053 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001054 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001055 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001056 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001057 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001058 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1059
1060 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001061 });
1062 WaitForThreads();
1063 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001064 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001065 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001066
eladalon05b07bb2017-08-24 07:40:16 -07001067 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001068 rtc::NetworkRoute network_route;
1069 network_route.connected = true;
1070 network_route.local_network_id = kLocalNetId;
1071 network_route.remote_network_id = kRemoteNetId;
1072 network_route.last_sent_packet_id = kLastPacketId;
1073 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001074 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001075 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1076
1077 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 });
1079 WaitForThreads();
1080 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001081 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001083 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001084 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001085 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001086 EXPECT_EQ(kTransportOverheadPerPacket,
1087 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001088 }
1089
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 // Test setting up a call.
1091 void TestCallSetup() {
1092 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001093 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001095 if (verify_playout_) {
1096 EXPECT_TRUE(media_channel1_->playout());
1097 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_FALSE(media_channel1_->sending());
1099 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001100 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 EXPECT_TRUE(media_channel1_->sending());
1102 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001103 if (verify_playout_) {
1104 EXPECT_TRUE(media_channel2_->playout());
1105 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 EXPECT_TRUE(media_channel2_->sending());
1107 EXPECT_EQ(1U, media_channel2_->codecs().size());
1108 }
1109
1110 // Test that we don't crash if packets are sent during call teardown
1111 // when RTCP mux is enabled. This is a regression test against a specific
1112 // race condition that would only occur when a RTCP packet was sent during
1113 // teardown of a channel on which RTCP mux was enabled.
1114 void TestCallTeardownRtcpMux() {
1115 class LastWordMediaChannel : public T::MediaChannel {
1116 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001119 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1120 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1122 }
1123 };
Steve Anton8699a322017-11-06 15:53:33 -08001124 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1125 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(SendInitiate());
1127 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001128 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 }
1130
1131 // Send voice RTP data to the other side and ensure it gets there.
1132 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001133 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_TRUE(SendInitiate());
1135 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001136 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1137 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001138 SendRtp1();
1139 SendRtp2();
1140 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141 EXPECT_TRUE(CheckRtp1());
1142 EXPECT_TRUE(CheckRtp2());
1143 EXPECT_TRUE(CheckNoRtp1());
1144 EXPECT_TRUE(CheckNoRtp2());
1145 }
1146
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001147 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001148 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001149 EXPECT_TRUE(SendInitiate());
1150 EXPECT_TRUE(SendAccept());
1151 SendRtp1();
1152 SendRtp2();
1153 SendRtcp1();
1154 SendRtcp2();
1155 // Do not wait, destroy channels.
1156 channel1_.reset(nullptr);
1157 channel2_.reset(nullptr);
1158 }
1159
deadbeefac22f702017-01-12 21:59:29 -08001160 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001162 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_TRUE(SendInitiate());
1164 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001165 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1166 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001167 SendRtcp1();
1168 SendRtcp2();
1169 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(CheckRtcp1());
1171 EXPECT_TRUE(CheckRtcp2());
1172 EXPECT_TRUE(CheckNoRtcp1());
1173 EXPECT_TRUE(CheckNoRtcp2());
1174 }
1175
1176 // Check that RTCP is transmitted if only the initiator supports mux.
1177 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001178 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 EXPECT_TRUE(SendInitiate());
1180 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001181 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1182 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001183 SendRtcp1();
1184 SendRtcp2();
1185 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 EXPECT_TRUE(CheckRtcp1());
1187 EXPECT_TRUE(CheckRtcp2());
1188 EXPECT_TRUE(CheckNoRtcp1());
1189 EXPECT_TRUE(CheckNoRtcp2());
1190 }
1191
1192 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1193 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001194 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001196 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1197 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1198 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001200 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1201 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001202 SendRtp1();
1203 SendRtp2();
1204 SendRtcp1();
1205 SendRtcp2();
1206 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207 EXPECT_TRUE(CheckRtp1());
1208 EXPECT_TRUE(CheckRtp2());
1209 EXPECT_TRUE(CheckNoRtp1());
1210 EXPECT_TRUE(CheckNoRtp2());
1211 EXPECT_TRUE(CheckRtcp1());
1212 EXPECT_TRUE(CheckRtcp2());
1213 EXPECT_TRUE(CheckNoRtcp1());
1214 EXPECT_TRUE(CheckNoRtcp2());
1215 }
1216
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001217 // Check that RTP and RTCP are transmitted ok when both sides
1218 // support mux and one the offerer requires mux.
1219 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001220 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001221 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001222 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1223 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001224 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001225 SendRtp1();
1226 SendRtp2();
1227 SendRtcp1();
1228 SendRtcp2();
1229 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001230 EXPECT_TRUE(CheckRtp1());
1231 EXPECT_TRUE(CheckRtp2());
1232 EXPECT_TRUE(CheckNoRtp1());
1233 EXPECT_TRUE(CheckNoRtp2());
1234 EXPECT_TRUE(CheckRtcp1());
1235 EXPECT_TRUE(CheckRtcp2());
1236 EXPECT_TRUE(CheckNoRtcp1());
1237 EXPECT_TRUE(CheckNoRtcp2());
1238 }
1239
1240 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001241 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001242 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001243 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001244 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001245 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1246 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1247 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001248 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001249 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1250 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001251 SendRtp1();
1252 SendRtp2();
1253 SendRtcp1();
1254 SendRtcp2();
1255 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001256 EXPECT_TRUE(CheckRtp1());
1257 EXPECT_TRUE(CheckRtp2());
1258 EXPECT_TRUE(CheckNoRtp1());
1259 EXPECT_TRUE(CheckNoRtp2());
1260 EXPECT_TRUE(CheckRtcp1());
1261 EXPECT_TRUE(CheckRtcp2());
1262 EXPECT_TRUE(CheckNoRtcp1());
1263 EXPECT_TRUE(CheckNoRtcp2());
1264 }
1265
1266 // Check that RTP and RTCP are transmitted ok when both sides
1267 // require mux.
1268 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001269 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001270 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001271 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1272 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001273 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001274 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001275 SendRtp1();
1276 SendRtp2();
1277 SendRtcp1();
1278 SendRtcp2();
1279 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001280 EXPECT_TRUE(CheckRtp1());
1281 EXPECT_TRUE(CheckRtp2());
1282 EXPECT_TRUE(CheckNoRtp1());
1283 EXPECT_TRUE(CheckNoRtp2());
1284 EXPECT_TRUE(CheckRtcp1());
1285 EXPECT_TRUE(CheckRtcp2());
1286 EXPECT_TRUE(CheckNoRtcp1());
1287 EXPECT_TRUE(CheckNoRtcp2());
1288 }
1289
1290 // Check that SendAccept fails if the answerer doesn't support mux
1291 // and the offerer requires it.
1292 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001293 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001294 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001295 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1296 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001297 EXPECT_FALSE(SendAccept());
1298 }
1299
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 // Check that RTCP data sent by the initiator before the accept is not muxed.
1301 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001302 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001303 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001304 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1305 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306
1307 // RTCP can be sent before the call is accepted, if the transport is ready.
1308 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001309 SendRtcp1();
1310 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311 EXPECT_TRUE(CheckNoRtp2());
1312 EXPECT_TRUE(CheckRtcp2());
1313
1314 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001315 SendRtcp2();
1316 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001317 EXPECT_TRUE(CheckNoRtp1());
1318 EXPECT_TRUE(CheckRtcp1());
1319
1320 // Complete call setup and ensure everything is still OK.
1321 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001322 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001323 SendRtcp1();
1324 SendRtcp2();
1325 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 EXPECT_TRUE(CheckRtcp1());
1328 }
1329
1330
1331 // Check that RTCP data is not muxed until both sides have enabled muxing,
1332 // but that we properly demux before we get the accept message, since there
1333 // is a race between RTP data and the jingle accept.
1334 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001335 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001337 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1338 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001339
1340 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1341 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001342 SendRtcp1();
1343 WaitForThreads();
1344 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345
1346 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001347 SendRtcp2();
1348 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349 EXPECT_TRUE(CheckNoRtp1());
1350 EXPECT_TRUE(CheckRtcp1());
1351
1352 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001353 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001354 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001355 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1356 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001357 SendRtcp1();
1358 SendRtcp2();
1359 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 EXPECT_TRUE(CheckRtcp1());
1362 }
1363
1364 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001365 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001367 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1368 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369
deadbeefac22f702017-01-12 21:59:29 -08001370 int flags1 = SECURE | flags1_in;
1371 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 bool dtls1 = !!(flags1_in & DTLS);
1373 bool dtls2 = !!(flags2_in & DTLS);
1374 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001375 EXPECT_FALSE(channel1_->srtp_active());
1376 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001377 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001378 WaitForThreads();
1379 EXPECT_TRUE(channel1_->writable());
1380 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001382 EXPECT_TRUE(channel1_->srtp_active());
1383 EXPECT_TRUE(channel2_->srtp_active());
1384 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1385 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001386 SendRtp1();
1387 SendRtp2();
1388 SendRtcp1();
1389 SendRtcp2();
1390 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391 EXPECT_TRUE(CheckRtp1());
1392 EXPECT_TRUE(CheckRtp2());
1393 EXPECT_TRUE(CheckNoRtp1());
1394 EXPECT_TRUE(CheckNoRtp2());
1395 EXPECT_TRUE(CheckRtcp1());
1396 EXPECT_TRUE(CheckRtcp2());
1397 EXPECT_TRUE(CheckNoRtcp1());
1398 EXPECT_TRUE(CheckNoRtcp2());
1399 }
1400
1401 // Test that we properly handling SRTP negotiating down to RTP.
1402 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001403 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001404 EXPECT_FALSE(channel1_->srtp_active());
1405 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406 EXPECT_TRUE(SendInitiate());
1407 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001408 EXPECT_FALSE(channel1_->srtp_active());
1409 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001410 SendRtp1();
1411 SendRtp2();
1412 SendRtcp1();
1413 SendRtcp2();
1414 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001415 EXPECT_TRUE(CheckRtp1());
1416 EXPECT_TRUE(CheckRtp2());
1417 EXPECT_TRUE(CheckNoRtp1());
1418 EXPECT_TRUE(CheckNoRtp2());
1419 EXPECT_TRUE(CheckRtcp1());
1420 EXPECT_TRUE(CheckRtcp2());
1421 EXPECT_TRUE(CheckNoRtcp1());
1422 EXPECT_TRUE(CheckNoRtcp2());
1423 }
1424
1425 // Test that we can send and receive early media when a provisional answer is
1426 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1427 void SendEarlyMediaUsingRtcpMuxSrtp() {
1428 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1429
deadbeefac22f702017-01-12 21:59:29 -08001430 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1431 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 EXPECT_TRUE(SendOffer());
1433 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001434 EXPECT_TRUE(channel1_->srtp_active());
1435 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001436 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1437 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1439 SendCustomRtcp1(kSsrc1);
1440 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1441 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1444
1445 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001446 SendCustomRtcp2(kSsrc2);
1447 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1448 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001449 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1451
1452 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001453 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1454 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001455 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001456 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1457 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1458 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1459 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001460 EXPECT_TRUE(channel1_->srtp_active());
1461 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001462 SendCustomRtcp1(kSsrc1);
1463 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1464 SendCustomRtcp2(kSsrc2);
1465 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1466 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1471 }
1472
1473 // Test that we properly send RTP without SRTP from a thread.
1474 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001475 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476 EXPECT_TRUE(SendInitiate());
1477 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001478 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1479 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1480 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1481 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1482 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1483 send_rtcp1.thread(),
1484 send_rtcp2.thread()};
1485 WaitForThreads(involved_threads);
1486 EXPECT_TRUE(CheckRtp1());
1487 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001488 EXPECT_TRUE(CheckNoRtp1());
1489 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001490 EXPECT_TRUE(CheckRtcp1());
1491 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 EXPECT_TRUE(CheckNoRtcp1());
1493 EXPECT_TRUE(CheckNoRtcp2());
1494 }
1495
1496 // Test that we properly send SRTP with RTCP from a thread.
1497 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001498 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 EXPECT_TRUE(SendInitiate());
1500 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001501 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1502 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1503 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1504 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1505 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1506 send_rtcp1.thread(),
1507 send_rtcp2.thread()};
1508 WaitForThreads(involved_threads);
1509 EXPECT_TRUE(CheckRtp1());
1510 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511 EXPECT_TRUE(CheckNoRtp1());
1512 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001513 EXPECT_TRUE(CheckRtcp1());
1514 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001515 EXPECT_TRUE(CheckNoRtcp1());
1516 EXPECT_TRUE(CheckNoRtcp2());
1517 }
1518
1519 // Test that the mediachannel retains its sending state after the transport
1520 // becomes non-writable.
1521 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001522 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 EXPECT_TRUE(SendInitiate());
1524 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001525 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1526 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001527 SendRtp1();
1528 SendRtp2();
1529 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 EXPECT_TRUE(CheckRtp1());
1531 EXPECT_TRUE(CheckRtp2());
1532 EXPECT_TRUE(CheckNoRtp1());
1533 EXPECT_TRUE(CheckNoRtp2());
1534
wu@webrtc.org97077a32013-10-25 21:18:33 +00001535 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001536 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1537 fake_rtp_dtls_transport1_->SetWritable(false);
1538 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001539 SendRtp1();
1540 SendRtp2();
1541 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542 EXPECT_TRUE(CheckRtp1());
1543 EXPECT_TRUE(CheckNoRtp2());
1544
1545 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001546 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1547 fake_rtp_dtls_transport1_->SetWritable(true);
1548 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001550 SendRtp1();
1551 SendRtp2();
1552 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001553 EXPECT_TRUE(CheckRtp1());
1554 EXPECT_TRUE(CheckRtp2());
1555 EXPECT_TRUE(CheckNoRtp1());
1556 EXPECT_TRUE(CheckNoRtp2());
1557
1558 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001559 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1560 bool asymmetric = true;
1561 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1562 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 EXPECT_TRUE(media_channel1_->sending());
1564
wu@webrtc.org97077a32013-10-25 21:18:33 +00001565 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001566 SendRtp1();
1567 SendRtp2();
1568 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 EXPECT_TRUE(CheckRtp1());
1570 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001571 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572
1573 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001574 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001575 bool asymmetric = true;
1576 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1577 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001578 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001580 SendRtp1();
1581 SendRtp2();
1582 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583 EXPECT_TRUE(CheckRtp1());
1584 EXPECT_TRUE(CheckRtp2());
1585 EXPECT_TRUE(CheckNoRtp1());
1586 EXPECT_TRUE(CheckNoRtp2());
1587 }
1588
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001589 void SendBundleToBundle(
1590 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1591 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001592 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001593 // Only pl_type1 was added to the bundle filter for both |channel1_|
1594 // and |channel2_|.
1595 int pl_type1 = pl_types[0];
1596 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001597 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001598 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001599 if (rtcp_mux) {
1600 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001601 }
1602 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001604 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1605 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001607 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1608 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001609 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1610 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1611 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1612 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001613
1614 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001615 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1616 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1617 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001618 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001619 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1620 EXPECT_TRUE(CheckNoRtp1());
1621 EXPECT_TRUE(CheckNoRtp2());
1622
1623 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001624 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1625 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1626 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001627 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001628 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630 SendCustomRtcp1(kSsrc1);
1631 SendCustomRtcp2(kSsrc2);
1632 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1634 EXPECT_TRUE(CheckNoRtcp1());
1635 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1636 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638 SendCustomRtcp1(kSsrc2);
1639 SendCustomRtcp2(kSsrc1);
1640 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001641 // Bundle filter shouldn't filter out any RTCP.
1642 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1643 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 }
1645
deadbeefc6b6e092016-12-01 12:49:20 -08001646 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 CreateChannels(0, 0);
1649 EXPECT_TRUE(SendInitiate());
1650 EXPECT_TRUE(SendAccept());
1651 channel1_->StartMediaMonitor(100);
1652 channel2_->StartMediaMonitor(100);
1653 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001654 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1655 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 channel1_->StopMediaMonitor();
1657 channel2_->StopMediaMonitor();
1658 // Ensure a restart of a stopped monitor works.
1659 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001660 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 channel1_->StopMediaMonitor();
1662 // Ensure stopping a stopped monitor is OK.
1663 channel1_->StopMediaMonitor();
1664 }
1665
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 void TestSetContentFailure() {
1667 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668
Peter Thatchera6d24442015-07-09 21:26:36 -07001669 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001670 std::unique_ptr<typename T::Content> content(
1671 CreateMediaContentWithStream(1));
1672
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001673 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001674 EXPECT_FALSE(
1675 channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
1676 EXPECT_FALSE(
1677 channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001680 EXPECT_FALSE(
1681 channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
1682
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001684 EXPECT_FALSE(
1685 channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 }
1687
1688 void TestSendTwoOffers() {
1689 CreateChannels(0, 0);
1690
Peter Thatchera6d24442015-07-09 21:26:36 -07001691 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001692 std::unique_ptr<typename T::Content> content1(
1693 CreateMediaContentWithStream(1));
1694 EXPECT_TRUE(
1695 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1697
Steve Anton18ee1d52017-09-11 11:32:35 -07001698 std::unique_ptr<typename T::Content> content2(
1699 CreateMediaContentWithStream(2));
1700 EXPECT_TRUE(
1701 channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1703 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1704 }
1705
1706 void TestReceiveTwoOffers() {
1707 CreateChannels(0, 0);
1708
Peter Thatchera6d24442015-07-09 21:26:36 -07001709 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001710 std::unique_ptr<typename T::Content> content1(
1711 CreateMediaContentWithStream(1));
1712 EXPECT_TRUE(
1713 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1715
Steve Anton18ee1d52017-09-11 11:32:35 -07001716 std::unique_ptr<typename T::Content> content2(
1717 CreateMediaContentWithStream(2));
1718 EXPECT_TRUE(
1719 channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1721 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1722 }
1723
1724 void TestSendPrAnswer() {
1725 CreateChannels(0, 0);
1726
Peter Thatchera6d24442015-07-09 21:26:36 -07001727 std::string err;
1728 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001729 std::unique_ptr<typename T::Content> content1(
1730 CreateMediaContentWithStream(1));
1731 EXPECT_TRUE(
1732 channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1734
Peter Thatchera6d24442015-07-09 21:26:36 -07001735 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001736 std::unique_ptr<typename T::Content> content2(
1737 CreateMediaContentWithStream(2));
1738 EXPECT_TRUE(
1739 channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1741 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1742
Peter Thatchera6d24442015-07-09 21:26:36 -07001743 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001744 std::unique_ptr<typename T::Content> content3(
1745 CreateMediaContentWithStream(3));
1746 EXPECT_TRUE(
1747 channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1749 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1750 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1751 }
1752
1753 void TestReceivePrAnswer() {
1754 CreateChannels(0, 0);
1755
Peter Thatchera6d24442015-07-09 21:26:36 -07001756 std::string err;
1757 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001758 std::unique_ptr<typename T::Content> content1(
1759 CreateMediaContentWithStream(1));
1760 EXPECT_TRUE(
1761 channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1763
Peter Thatchera6d24442015-07-09 21:26:36 -07001764 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001765 std::unique_ptr<typename T::Content> content2(
1766 CreateMediaContentWithStream(2));
1767 EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
1768 cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1770 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1771
Peter Thatchera6d24442015-07-09 21:26:36 -07001772 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001773 std::unique_ptr<typename T::Content> content3(
1774 CreateMediaContentWithStream(3));
1775 EXPECT_TRUE(
1776 channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1778 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1779 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1780 }
1781
1782 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001783 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_TRUE(SendInitiate());
1785 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001786 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1787 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788
1789 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001790 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 // The sending message is only posted. channel2_ should be empty.
1792 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001793 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1794 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795
1796 // When channel1_ is deleted, the RTCP packet should be sent out to
1797 // channel2_.
1798 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001799 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800 EXPECT_TRUE(CheckRtcp2());
1801 }
1802
zstein56162b92017-04-24 16:54:35 -07001803 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001804 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806
zstein56162b92017-04-24 16:54:35 -07001807 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809 EXPECT_TRUE(media_channel1_->ready_to_send());
1810
zstein56162b92017-04-24 16:54:35 -07001811 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001812 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814 }
1815
zstein56162b92017-04-24 16:54:35 -07001816 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001817 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 typename T::Content content;
1819 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001820 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001822 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001823 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001824 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001825 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1826 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 EXPECT_FALSE(media_channel1_->ready_to_send());
1828 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1829 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001830 network_thread_->Invoke<void>(RTC_FROM_HERE,
1831 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001832 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001834
zstein56162b92017-04-24 16:54:35 -07001835 // TODO(zstein): Find a way to test this without making
1836 // OnTransportReadyToSend public.
1837 network_thread_->Invoke<void>(
1838 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001839 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_FALSE(media_channel1_->ready_to_send());
1841 }
1842
skvladdc1c62c2016-03-16 19:07:43 -07001843 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1844 typename T::Content content;
1845 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1846 content.set_bandwidth(remote_limit);
1847 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
1848 }
1849
deadbeefe702b302017-02-04 12:09:01 -08001850 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001851 webrtc::RtpParameters parameters;
1852 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001853 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001854 parameters.encodings.push_back(encoding);
1855 return parameters;
1856 }
1857
1858 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001859 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001860 EXPECT_EQ(1UL, parameters.encodings.size());
1861 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1862 }
1863
1864 void DefaultMaxBitrateIsUnlimited() {
1865 CreateChannels(0, 0);
1866 EXPECT_TRUE(
1867 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1868 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001869 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001870 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001871 }
1872
1873 void CanChangeMaxBitrate() {
1874 CreateChannels(0, 0);
1875 EXPECT_TRUE(
1876 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1877
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001878 EXPECT_TRUE(channel1_->SetRtpSendParameters(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001879 kSsrc1, BitrateLimitedParameters(1000)));
1880 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), 1000);
1881 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1), 1000);
skvladdc1c62c2016-03-16 19:07:43 -07001882 EXPECT_EQ(-1, media_channel1_->max_bps());
1883
deadbeefe702b302017-02-04 12:09:01 -08001884 EXPECT_TRUE(channel1_->SetRtpSendParameters(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001885 kSsrc1, BitrateLimitedParameters(rtc::nullopt)));
1886 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), rtc::nullopt);
deadbeefe702b302017-02-04 12:09:01 -08001887 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001888 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001889 EXPECT_EQ(-1, media_channel1_->max_bps());
1890 }
1891
Steve Anton8a63f782017-10-23 13:08:53 -07001892 // Test that when a channel gets new transports with a call to
1893 // |SetTransports|, the socket options from the old transports are merged with
1894 // the options on the new transport.
1895 // For example, audio and video may use separate socket options, but initially
1896 // be unbundled, then later become bundled. When this happens, their preferred
1897 // socket options should be merged to the underlying transport they share.
1898 void SocketOptionsMergedOnSetTransport() {
1899 constexpr int kSndBufSize = 4000;
1900 constexpr int kRcvBufSize = 8000;
1901
1902 CreateChannels(0, 0);
1903
1904 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1905 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1906 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1907 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1908
1909 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1910 channel2_->rtcp_dtls_transport());
1911
1912 int option_val;
1913 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1914 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1915 EXPECT_EQ(kSndBufSize, option_val);
1916 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1917 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1918 EXPECT_EQ(kRcvBufSize, option_val);
1919 }
1920
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1923 static void ProcessThreadQueue(rtc::Thread* thread) {
1924 RTC_DCHECK(thread->IsCurrent());
1925 while (!thread->empty()) {
1926 thread->ProcessMessages(0);
1927 }
1928 }
1929 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1930 // |threads| and current thread post packets to network thread.
1931 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001932 thread->Invoke<void>(RTC_FROM_HERE,
1933 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934 }
1935 ProcessThreadQueue(rtc::Thread::Current());
1936 // Network thread move them around and post back to worker = current thread.
1937 if (!network_thread_->IsCurrent()) {
1938 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001939 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001940 }
1941 // Worker thread = current Thread process received messages.
1942 ProcessThreadQueue(rtc::Thread::Current());
1943 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001944 // TODO(pbos): Remove playout from all media channels and let renderers mute
1945 // themselves.
1946 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1948 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001949 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1950 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1951 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1952 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1953 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1954 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1955 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1956 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 cricket::FakeMediaEngine media_engine_;
1958 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001959 typename T::MediaChannel* media_channel1_ = nullptr;
1960 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001961 std::unique_ptr<typename T::Channel> channel1_;
1962 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 typename T::Content local_media_content1_;
1964 typename T::Content local_media_content2_;
1965 typename T::Content remote_media_content1_;
1966 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001968 rtc::Buffer rtp_packet_;
1969 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001970 int media_info_callbacks1_ = 0;
1971 int media_info_callbacks2_ = 0;
1972 int rtcp_mux_activated_callbacks1_ = 0;
1973 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001974 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975};
1976
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977template<>
1978void ChannelTest<VoiceTraits>::CreateContent(
1979 int flags,
1980 const cricket::AudioCodec& audio_codec,
1981 const cricket::VideoCodec& video_codec,
1982 cricket::AudioContentDescription* audio) {
1983 audio->AddCodec(audio_codec);
1984 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
1985 if (flags & SECURE) {
1986 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001987 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
1988 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989 }
1990}
1991
1992template<>
1993void ChannelTest<VoiceTraits>::CopyContent(
1994 const cricket::AudioContentDescription& source,
1995 cricket::AudioContentDescription* audio) {
1996 *audio = source;
1997}
1998
1999template<>
2000bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2001 const cricket::AudioCodec& c2) {
2002 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2003 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2004}
2005
Peter Boström0c4e06b2015-10-07 12:23:21 +02002006template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002008 uint32_t ssrc,
2009 int flags,
2010 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 audio->AddLegacyStream(ssrc);
2012}
2013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002014class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 public:
solenberg1dd98f32015-09-10 01:57:14 -07002016 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002017 VoiceChannelSingleThreadTest()
2018 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2019};
2020
2021class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2022 public:
2023 typedef ChannelTest<VoiceTraits> Base;
2024 VoiceChannelDoubleThreadTest()
2025 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026};
2027
jbauch5869f502017-06-29 12:31:36 -07002028class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2029 : public ChannelTest<VoiceTraits> {
2030 public:
2031 typedef ChannelTest<VoiceTraits> Base;
2032 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2033 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2034 NetworkIsWorker::Yes) {}
2035};
2036
2037class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2038 : public ChannelTest<VoiceTraits> {
2039 public:
2040 typedef ChannelTest<VoiceTraits> Base;
2041 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2042 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2043 NetworkIsWorker::No) {}
2044};
2045
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002046// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002047template <>
Steve Anton8699a322017-11-06 15:53:33 -08002048std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002049 rtc::Thread* worker_thread,
2050 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002051 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002052 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002053 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2054 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002055 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2056 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002057 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002058 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002059 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2060 worker_thread, network_thread, signaling_thread, std::move(ch),
2061 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2062 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002063 if (!channel->NeedsRtcpTransport()) {
2064 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002065 }
Steve Anton8699a322017-11-06 15:53:33 -08002066 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2067 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002068 return channel;
2069}
2070
2071// override to add 0 parameter
2072template<>
2073bool ChannelTest<VideoTraits>::AddStream1(int id) {
2074 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2075}
2076
2077template<>
2078void ChannelTest<VideoTraits>::CreateContent(
2079 int flags,
2080 const cricket::AudioCodec& audio_codec,
2081 const cricket::VideoCodec& video_codec,
2082 cricket::VideoContentDescription* video) {
2083 video->AddCodec(video_codec);
2084 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2085 if (flags & SECURE) {
2086 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002087 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2088 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002089 }
2090}
2091
2092template<>
2093void ChannelTest<VideoTraits>::CopyContent(
2094 const cricket::VideoContentDescription& source,
2095 cricket::VideoContentDescription* video) {
2096 *video = source;
2097}
2098
2099template<>
2100bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2101 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002102 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002103}
2104
Peter Boström0c4e06b2015-10-07 12:23:21 +02002105template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002107 uint32_t ssrc,
2108 int flags,
2109 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110 video->AddLegacyStream(ssrc);
2111}
2112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002113class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 public:
solenberg1dd98f32015-09-10 01:57:14 -07002115 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002116 VideoChannelSingleThreadTest()
2117 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118};
2119
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002120class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2121 public:
2122 typedef ChannelTest<VideoTraits> Base;
2123 VideoChannelDoubleThreadTest()
2124 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2125};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002127TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128 Base::TestInit();
2129 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2130 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2131}
2132
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002133TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2134 Base::TestDeinit();
2135}
2136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002137TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002138 Base::TestSetContents();
2139}
2140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002141TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 Base::TestSetContentsNullOffer();
2143}
2144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002145TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146 Base::TestSetContentsRtcpMux();
2147}
2148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 Base::TestSetContentsRtcpMux();
2151}
2152
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002153TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002154 Base::TestStreams();
2155}
2156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002157TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002158 Base::TestChangeStreamParamsInContent();
2159}
2160
jbauch5869f502017-06-29 12:31:36 -07002161TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2162 TestChangeEncryptedHeaderExtensionsDtls) {
2163 int flags = DTLS;
2164 Base::TestChangeEncryptedHeaderExtensions(flags);
2165}
2166
2167TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2168 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2169 int flags = DTLS;
2170 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2171}
2172
2173TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2174 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2175 int flags = DTLS;
2176 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2177}
2178
2179TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2180 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2181 int flags = DTLS | GCM_CIPHER;
2182 Base::TestChangeEncryptedHeaderExtensions(flags);
2183}
2184
2185TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2186 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2187 int flags = DTLS | GCM_CIPHER;
2188 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2189}
2190
2191TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2192 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2193 int flags = DTLS | GCM_CIPHER;
2194 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2195}
2196
2197TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2198 TestChangeEncryptedHeaderExtensionsSDES) {
2199 int flags = 0;
2200 Base::TestChangeEncryptedHeaderExtensions(flags);
2201}
2202
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204 Base::TestPlayoutAndSendingStates();
2205}
2206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002208 CreateChannels(0, 0);
2209 // Test that we can Mute the default channel even though the sending SSRC
2210 // is unknown.
2211 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002212 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002213 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2214 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002215 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2216
2217 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002218 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002219
2220 SendInitiate();
2221 // After the local session description has been set, we can mute a stream
2222 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002223 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002224 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2225 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002226 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227}
2228
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002229TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 Base::TestMediaContentDirection();
2231}
2232
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002233TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002234 Base::TestNetworkRouteChanges();
2235}
2236
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002237TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238 Base::TestCallSetup();
2239}
2240
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242 Base::TestCallTeardownRtcpMux();
2243}
2244
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 Base::SendRtpToRtp();
2247}
2248
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002249TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 Base::SendRtcpToRtcp();
2251}
2252
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002253TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254 Base::SendRtcpMuxToRtcp();
2255}
2256
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002257TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002258 Base::SendRtcpMuxToRtcpMux();
2259}
2260
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002262 Base::SendRequireRtcpMuxToRtcpMux();
2263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002266 Base::SendRtcpMuxToRequireRtcpMux();
2267}
2268
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002270 Base::SendRequireRtcpMuxToRequireRtcpMux();
2271}
2272
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002274 Base::SendRequireRtcpMuxToNoRtcpMux();
2275}
2276
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002277TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 Base::SendEarlyRtcpMuxToRtcp();
2279}
2280
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002281TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282 Base::SendEarlyRtcpMuxToRtcpMux();
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290 Base::SendSrtpToSrtp();
2291}
2292
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002293TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2295}
2296
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 Base::SendSrtpToSrtp(DTLS, 0);
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 Base::SendSrtpToSrtp(DTLS, DTLS);
2303}
2304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2307}
2308
deadbeeff5346592017-01-24 21:51:21 -08002309// Test using the channel with a raw packet interface, as opposed to a DTLS
2310// transport interface.
2311TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2312 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2313}
2314
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002315TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2317}
2318
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002319TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320 Base::SendRtpToRtpOnThread();
2321}
2322
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324 Base::SendSrtpToSrtpOnThread();
2325}
2326
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002328 Base::SendWithWritabilityLoss();
2329}
2330
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002331TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332 Base::TestMediaMonitor();
2333}
2334
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002336TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337 CreateChannels(0, 0);
2338 EXPECT_TRUE(SendInitiate());
2339 EXPECT_TRUE(SendAccept());
2340 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2341
solenberg1d63dd02015-12-02 12:35:09 -08002342 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2343 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2344 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002346 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002348 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002349 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002350 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002351 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002352 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353}
2354
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002355TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 Base::TestSetContentFailure();
2357}
2358
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002359TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360 Base::TestSendTwoOffers();
2361}
2362
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002363TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364 Base::TestReceiveTwoOffers();
2365}
2366
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002367TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 Base::TestSendPrAnswer();
2369}
2370
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002371TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 Base::TestReceivePrAnswer();
2373}
2374
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 Base::TestFlushRtcp();
2377}
2378
zstein56162b92017-04-24 16:54:35 -07002379TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2380 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381}
2382
zstein56162b92017-04-24 16:54:35 -07002383TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2384 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385}
2386
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002388TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002389 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 EXPECT_TRUE(SendInitiate());
2391 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002392 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002393
solenberg4bac9c52015-10-09 02:32:53 -07002394 // Default is (1.0).
2395 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2396 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002398 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399
solenberg4bac9c52015-10-09 02:32:53 -07002400 // Set scale to (1.5).
2401 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2402 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2403 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404
solenberg4bac9c52015-10-09 02:32:53 -07002405 // Set scale to (0).
2406 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2407 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2408 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409}
2410
2411// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002412TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002413 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 EXPECT_TRUE(SendInitiate());
2415 EXPECT_TRUE(SendAccept());
2416 EXPECT_TRUE(AddStream1(1));
2417 EXPECT_TRUE(AddStream1(2));
2418
solenberg4bac9c52015-10-09 02:32:53 -07002419 double volume;
2420 // Default is (1.0).
2421 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2422 EXPECT_DOUBLE_EQ(1.0, volume);
2423 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2424 EXPECT_DOUBLE_EQ(1.0, volume);
2425 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2426 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002428 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429
solenberg4bac9c52015-10-09 02:32:53 -07002430 // Set scale to (1.5) for ssrc = 1.
2431 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2432 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2433 EXPECT_DOUBLE_EQ(1.5, volume);
2434 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2435 EXPECT_DOUBLE_EQ(1.0, volume);
2436 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2437 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438
solenberg4bac9c52015-10-09 02:32:53 -07002439 // Set scale to (0) for all ssrcs.
2440 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2441 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2442 EXPECT_DOUBLE_EQ(0.0, volume);
2443 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2444 EXPECT_DOUBLE_EQ(0.0, volume);
2445 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2446 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002447}
2448
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002450 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002451}
2452
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002454 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002455}
2456
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002458 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002459}
2460
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002462 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002463}
2464
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002466 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002467}
2468
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002470 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002471}
2472
Steve Anton8a63f782017-10-23 13:08:53 -07002473TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2474 Base::SocketOptionsMergedOnSetTransport();
2475}
2476
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002477// VoiceChannelDoubleThreadTest
2478TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002480 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2481 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482}
2483
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002484TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2485 Base::TestDeinit();
2486}
2487
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002488TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 Base::TestSetContents();
2490}
2491
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002492TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493 Base::TestSetContentsNullOffer();
2494}
2495
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002496TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 Base::TestSetContentsRtcpMux();
2498}
2499
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002500TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 Base::TestSetContentsRtcpMux();
2502}
2503
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002504TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505 Base::TestStreams();
2506}
2507
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002508TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509 Base::TestChangeStreamParamsInContent();
2510}
2511
jbauch5869f502017-06-29 12:31:36 -07002512TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2513 TestChangeEncryptedHeaderExtensionsDtls) {
2514 int flags = DTLS;
2515 Base::TestChangeEncryptedHeaderExtensions(flags);
2516}
2517
2518TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2519 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2520 int flags = DTLS;
2521 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2522}
2523
2524TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2525 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2526 int flags = DTLS;
2527 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2528}
2529
2530TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2531 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2532 int flags = DTLS | GCM_CIPHER;
2533 Base::TestChangeEncryptedHeaderExtensions(flags);
2534}
2535
2536TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2537 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2538 int flags = DTLS | GCM_CIPHER;
2539 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2540}
2541
2542TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2543 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2544 int flags = DTLS | GCM_CIPHER;
2545 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2546}
2547
2548TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2549 TestChangeEncryptedHeaderExtensionsSDES) {
2550 int flags = 0;
2551 Base::TestChangeEncryptedHeaderExtensions(flags);
2552}
2553
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002554TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555 Base::TestPlayoutAndSendingStates();
2556}
2557
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002558TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2559 CreateChannels(0, 0);
2560 // Test that we can Mute the default channel even though the sending SSRC
2561 // is unknown.
2562 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2563 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2564 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2565 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2566 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2567
2568 // Test that we can not mute an unknown SSRC.
2569 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2570
2571 SendInitiate();
2572 // After the local session description has been set, we can mute a stream
2573 // with its SSRC.
2574 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2575 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2576 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2577 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2578}
2579
2580TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2581 Base::TestMediaContentDirection();
2582}
2583
2584TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2585 Base::TestNetworkRouteChanges();
2586}
2587
2588TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2589 Base::TestCallSetup();
2590}
2591
2592TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2593 Base::TestCallTeardownRtcpMux();
2594}
2595
2596TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2597 Base::SendRtpToRtp();
2598}
2599
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002600TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2601 Base::SendRtcpToRtcp();
2602}
2603
2604TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2605 Base::SendRtcpMuxToRtcp();
2606}
2607
2608TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2609 Base::SendRtcpMuxToRtcpMux();
2610}
2611
2612TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2613 Base::SendRequireRtcpMuxToRtcpMux();
2614}
2615
2616TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2617 Base::SendRtcpMuxToRequireRtcpMux();
2618}
2619
2620TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2621 Base::SendRequireRtcpMuxToRequireRtcpMux();
2622}
2623
2624TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2625 Base::SendRequireRtcpMuxToNoRtcpMux();
2626}
2627
2628TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2629 Base::SendEarlyRtcpMuxToRtcp();
2630}
2631
2632TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2633 Base::SendEarlyRtcpMuxToRtcpMux();
2634}
2635
2636TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2637 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2638}
2639
2640TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2641 Base::SendSrtpToSrtp();
2642}
2643
2644TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2645 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2646}
2647
2648TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002649 Base::SendSrtpToSrtp(DTLS, 0);
2650}
2651
2652TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002653 Base::SendSrtpToSrtp(DTLS, DTLS);
2654}
2655
2656TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002657 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2658}
2659
deadbeeff5346592017-01-24 21:51:21 -08002660// Test using the channel with a raw packet interface, as opposed to a DTLS
2661// transport interface.
2662TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2663 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2664}
2665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002666TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2667 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2668}
2669
2670TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2671 Base::SendRtpToRtpOnThread();
2672}
2673
2674TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2675 Base::SendSrtpToSrtpOnThread();
2676}
2677
2678TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2679 Base::SendWithWritabilityLoss();
2680}
2681
2682TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2683 Base::TestMediaMonitor();
2684}
2685
2686// Test that InsertDtmf properly forwards to the media channel.
2687TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2688 CreateChannels(0, 0);
2689 EXPECT_TRUE(SendInitiate());
2690 EXPECT_TRUE(SendAccept());
2691 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2692
2693 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2694 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2695 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2696
2697 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2698 EXPECT_TRUE(
2699 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2700 EXPECT_TRUE(
2701 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2702 EXPECT_TRUE(
2703 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2704}
2705
2706TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2707 Base::TestSetContentFailure();
2708}
2709
2710TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2711 Base::TestSendTwoOffers();
2712}
2713
2714TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2715 Base::TestReceiveTwoOffers();
2716}
2717
2718TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2719 Base::TestSendPrAnswer();
2720}
2721
2722TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2723 Base::TestReceivePrAnswer();
2724}
2725
2726TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2727 Base::TestFlushRtcp();
2728}
2729
zstein56162b92017-04-24 16:54:35 -07002730TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2731 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002732}
2733
zstein56162b92017-04-24 16:54:35 -07002734TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2735 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002736}
2737
2738// Test that we can scale the output volume properly for 1:1 calls.
2739TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002740 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002741 EXPECT_TRUE(SendInitiate());
2742 EXPECT_TRUE(SendAccept());
2743 double volume;
2744
2745 // Default is (1.0).
2746 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2747 EXPECT_DOUBLE_EQ(1.0, volume);
2748 // invalid ssrc.
2749 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2750
2751 // Set scale to (1.5).
2752 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2753 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2754 EXPECT_DOUBLE_EQ(1.5, volume);
2755
2756 // Set scale to (0).
2757 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2758 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2759 EXPECT_DOUBLE_EQ(0.0, volume);
2760}
2761
2762// Test that we can scale the output volume properly for multiway calls.
2763TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002764 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002765 EXPECT_TRUE(SendInitiate());
2766 EXPECT_TRUE(SendAccept());
2767 EXPECT_TRUE(AddStream1(1));
2768 EXPECT_TRUE(AddStream1(2));
2769
2770 double volume;
2771 // Default is (1.0).
2772 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2773 EXPECT_DOUBLE_EQ(1.0, volume);
2774 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2775 EXPECT_DOUBLE_EQ(1.0, volume);
2776 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2777 EXPECT_DOUBLE_EQ(1.0, volume);
2778 // invalid ssrc.
2779 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2780
2781 // Set scale to (1.5) for ssrc = 1.
2782 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2783 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2784 EXPECT_DOUBLE_EQ(1.5, volume);
2785 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2786 EXPECT_DOUBLE_EQ(1.0, volume);
2787 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2788 EXPECT_DOUBLE_EQ(1.0, volume);
2789
2790 // Set scale to (0) for all ssrcs.
2791 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2792 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2793 EXPECT_DOUBLE_EQ(0.0, volume);
2794 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2795 EXPECT_DOUBLE_EQ(0.0, volume);
2796 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2797 EXPECT_DOUBLE_EQ(0.0, volume);
2798}
2799
2800TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2801 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2802}
2803
2804TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2805 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2806}
2807
2808TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2809 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2810}
2811
2812TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2813 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2814}
2815
2816TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2817 Base::DefaultMaxBitrateIsUnlimited();
2818}
2819
2820TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2821 Base::CanChangeMaxBitrate();
2822}
2823
Steve Anton8a63f782017-10-23 13:08:53 -07002824TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2825 Base::SocketOptionsMergedOnSetTransport();
2826}
2827
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002828// VideoChannelSingleThreadTest
2829TEST_F(VideoChannelSingleThreadTest, TestInit) {
2830 Base::TestInit();
2831}
2832
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002833TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2834 Base::TestDeinit();
2835}
2836
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002837TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2838 Base::TestSetContents();
2839}
2840
2841TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2842 Base::TestSetContentsNullOffer();
2843}
2844
2845TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2846 Base::TestSetContentsRtcpMux();
2847}
2848
2849TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2850 Base::TestSetContentsRtcpMux();
2851}
2852
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002853TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2854 Base::TestStreams();
2855}
2856
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002857TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2858 Base::TestChangeStreamParamsInContent();
2859}
2860
2861TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2862 Base::TestPlayoutAndSendingStates();
2863}
2864
2865TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002866 CreateChannels(0, 0);
2867 // Test that we can Mute the default channel even though the sending SSRC
2868 // is unknown.
2869 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002870 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002871 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002872 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002873 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2874 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002875 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002876 SendInitiate();
2877 // After the local session description has been set, we can mute a stream
2878 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002879 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002880 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002881 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002882 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883}
2884
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002885TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 Base::TestMediaContentDirection();
2887}
2888
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002889TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002890 Base::TestNetworkRouteChanges();
2891}
2892
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002893TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 Base::TestCallSetup();
2895}
2896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002897TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 Base::TestCallTeardownRtcpMux();
2899}
2900
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002901TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002902 Base::SendRtpToRtp();
2903}
2904
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002905TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002906 Base::SendRtcpToRtcp();
2907}
2908
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002909TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 Base::SendRtcpMuxToRtcp();
2911}
2912
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002913TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 Base::SendRtcpMuxToRtcpMux();
2915}
2916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002917TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002918 Base::SendRequireRtcpMuxToRtcpMux();
2919}
2920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002921TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002922 Base::SendRtcpMuxToRequireRtcpMux();
2923}
2924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002925TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002926 Base::SendRequireRtcpMuxToRequireRtcpMux();
2927}
2928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002929TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002930 Base::SendRequireRtcpMuxToNoRtcpMux();
2931}
2932
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002933TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 Base::SendEarlyRtcpMuxToRtcp();
2935}
2936
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002937TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938 Base::SendEarlyRtcpMuxToRtcpMux();
2939}
2940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002941TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 Base::SendSrtpToSrtp();
2943}
2944
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002945TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 Base::SendSrtpToSrtp();
2947}
2948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002949TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950 Base::SendSrtpToSrtp(DTLS, 0);
2951}
2952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002953TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 Base::SendSrtpToSrtp(DTLS, DTLS);
2955}
2956
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002957TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002958 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2959}
2960
deadbeeff5346592017-01-24 21:51:21 -08002961// Test using the channel with a raw packet interface, as opposed to a DTLS
2962// transport interface.
2963TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2964 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2965}
2966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002967TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2969}
2970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002971TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2973}
2974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002975TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002976 Base::SendRtpToRtpOnThread();
2977}
2978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002979TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 Base::SendSrtpToSrtpOnThread();
2981}
2982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002983TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002984 Base::SendWithWritabilityLoss();
2985}
2986
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002987TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002988 Base::TestMediaMonitor();
2989}
2990
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002991TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002992 Base::TestSetContentFailure();
2993}
2994
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002995TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002996 Base::TestSendTwoOffers();
2997}
2998
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002999TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 Base::TestReceiveTwoOffers();
3001}
3002
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003003TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003004 Base::TestSendPrAnswer();
3005}
3006
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003007TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008 Base::TestReceivePrAnswer();
3009}
3010
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003011TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003012 Base::TestFlushRtcp();
3013}
3014
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003015TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003016 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003017}
3018
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003019TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003020 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003021}
3022
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003023TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003024 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003025}
3026
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003027TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003028 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003029}
3030
zstein56162b92017-04-24 16:54:35 -07003031TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3032 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033}
3034
zstein56162b92017-04-24 16:54:35 -07003035TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3036 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003037}
3038
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003039TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003040 Base::DefaultMaxBitrateIsUnlimited();
3041}
3042
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003043TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003044 Base::CanChangeMaxBitrate();
3045}
3046
Steve Anton8a63f782017-10-23 13:08:53 -07003047TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3048 Base::SocketOptionsMergedOnSetTransport();
3049}
3050
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003051// VideoChannelDoubleThreadTest
3052TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3053 Base::TestInit();
3054}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003056TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3057 Base::TestDeinit();
3058}
3059
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003060TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3061 Base::TestSetContents();
3062}
3063
3064TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3065 Base::TestSetContentsNullOffer();
3066}
3067
3068TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3069 Base::TestSetContentsRtcpMux();
3070}
3071
3072TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3073 Base::TestSetContentsRtcpMux();
3074}
3075
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003076TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3077 Base::TestStreams();
3078}
3079
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003080TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3081 Base::TestChangeStreamParamsInContent();
3082}
3083
3084TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3085 Base::TestPlayoutAndSendingStates();
3086}
3087
3088TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3089 CreateChannels(0, 0);
3090 // Test that we can Mute the default channel even though the sending SSRC
3091 // is unknown.
3092 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003093 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003094 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003095 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003096 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3097 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003098 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003099 SendInitiate();
3100 // After the local session description has been set, we can mute a stream
3101 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003102 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003103 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003104 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003105 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3106}
3107
3108TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3109 Base::TestMediaContentDirection();
3110}
3111
3112TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3113 Base::TestNetworkRouteChanges();
3114}
3115
3116TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3117 Base::TestCallSetup();
3118}
3119
3120TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3121 Base::TestCallTeardownRtcpMux();
3122}
3123
3124TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3125 Base::SendRtpToRtp();
3126}
3127
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003128TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3129 Base::SendRtcpToRtcp();
3130}
3131
3132TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3133 Base::SendRtcpMuxToRtcp();
3134}
3135
3136TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3137 Base::SendRtcpMuxToRtcpMux();
3138}
3139
3140TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3141 Base::SendRequireRtcpMuxToRtcpMux();
3142}
3143
3144TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3145 Base::SendRtcpMuxToRequireRtcpMux();
3146}
3147
3148TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3149 Base::SendRequireRtcpMuxToRequireRtcpMux();
3150}
3151
3152TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3153 Base::SendRequireRtcpMuxToNoRtcpMux();
3154}
3155
3156TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3157 Base::SendEarlyRtcpMuxToRtcp();
3158}
3159
3160TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3161 Base::SendEarlyRtcpMuxToRtcpMux();
3162}
3163
3164TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3165 Base::SendSrtpToSrtp();
3166}
3167
3168TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3169 Base::SendSrtpToSrtp();
3170}
3171
3172TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003173 Base::SendSrtpToSrtp(DTLS, 0);
3174}
3175
3176TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003177 Base::SendSrtpToSrtp(DTLS, DTLS);
3178}
3179
3180TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003181 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3182}
3183
deadbeeff5346592017-01-24 21:51:21 -08003184// Test using the channel with a raw packet interface, as opposed to a DTLS
3185// transport interface.
3186TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3187 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3188}
3189
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003190TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3191 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3192}
3193
3194TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3195 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3196}
3197
3198TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3199 Base::SendRtpToRtpOnThread();
3200}
3201
3202TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3203 Base::SendSrtpToSrtpOnThread();
3204}
3205
3206TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3207 Base::SendWithWritabilityLoss();
3208}
3209
3210TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3211 Base::TestMediaMonitor();
3212}
3213
3214TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3215 Base::TestSetContentFailure();
3216}
3217
3218TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3219 Base::TestSendTwoOffers();
3220}
3221
3222TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3223 Base::TestReceiveTwoOffers();
3224}
3225
3226TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3227 Base::TestSendPrAnswer();
3228}
3229
3230TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3231 Base::TestReceivePrAnswer();
3232}
3233
3234TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3235 Base::TestFlushRtcp();
3236}
3237
3238TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3239 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3240}
3241
3242TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3243 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3244}
3245
3246TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3247 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3248}
3249
3250TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3251 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3252}
3253
zstein56162b92017-04-24 16:54:35 -07003254TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3255 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003256}
3257
zstein56162b92017-04-24 16:54:35 -07003258TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3259 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003260}
3261
3262TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3263 Base::DefaultMaxBitrateIsUnlimited();
3264}
3265
3266TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3267 Base::CanChangeMaxBitrate();
3268}
3269
Steve Anton8a63f782017-10-23 13:08:53 -07003270TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3271 Base::SocketOptionsMergedOnSetTransport();
3272}
3273
deadbeef953c2ce2017-01-09 14:53:41 -08003274// RtpDataChannelSingleThreadTest
3275class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003276 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003277 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003278 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003279 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3280};
3281
deadbeef953c2ce2017-01-09 14:53:41 -08003282// RtpDataChannelDoubleThreadTest
3283class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003284 public:
3285 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003286 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003287 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003288};
3289
3290// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003291template <>
Steve Anton8699a322017-11-06 15:53:33 -08003292std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003293 rtc::Thread* worker_thread,
3294 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003295 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003296 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003297 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3298 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003299 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3300 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003301 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003302 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003303 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3304 worker_thread, network_thread, signaling_thread, std::move(ch),
3305 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3306 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003307 if (!channel->NeedsRtcpTransport()) {
3308 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003309 }
Steve Anton8699a322017-11-06 15:53:33 -08003310 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3311 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003312 return channel;
3313}
3314
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003315template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003316void ChannelTest<DataTraits>::CreateContent(
3317 int flags,
3318 const cricket::AudioCodec& audio_codec,
3319 const cricket::VideoCodec& video_codec,
3320 cricket::DataContentDescription* data) {
3321 data->AddCodec(kGoogleDataCodec);
3322 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3323 if (flags & SECURE) {
3324 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003325 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3326 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003327 }
3328}
3329
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003330template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003331void ChannelTest<DataTraits>::CopyContent(
3332 const cricket::DataContentDescription& source,
3333 cricket::DataContentDescription* data) {
3334 *data = source;
3335}
3336
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003337template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003338bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3339 const cricket::DataCodec& c2) {
3340 return c1.name == c2.name;
3341}
3342
Peter Boström0c4e06b2015-10-07 12:23:21 +02003343template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003344void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003345 uint32_t ssrc,
3346 int flags,
3347 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003348 data->AddLegacyStream(ssrc);
3349}
3350
deadbeef953c2ce2017-01-09 14:53:41 -08003351TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003352 Base::TestInit();
3353 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3354}
3355
deadbeef953c2ce2017-01-09 14:53:41 -08003356TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003357 Base::TestDeinit();
3358}
3359
deadbeef953c2ce2017-01-09 14:53:41 -08003360TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003361 Base::TestSetContents();
3362}
3363
deadbeef953c2ce2017-01-09 14:53:41 -08003364TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003365 Base::TestSetContentsNullOffer();
3366}
3367
deadbeef953c2ce2017-01-09 14:53:41 -08003368TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003369 Base::TestSetContentsRtcpMux();
3370}
3371
deadbeef953c2ce2017-01-09 14:53:41 -08003372TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003373 Base::TestStreams();
3374}
3375
deadbeef953c2ce2017-01-09 14:53:41 -08003376TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003377 Base::TestChangeStreamParamsInContent();
3378}
3379
deadbeef953c2ce2017-01-09 14:53:41 -08003380TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003381 Base::TestPlayoutAndSendingStates();
3382}
3383
deadbeef953c2ce2017-01-09 14:53:41 -08003384TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003385 Base::TestMediaContentDirection();
3386}
3387
deadbeef953c2ce2017-01-09 14:53:41 -08003388TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003389 Base::TestCallSetup();
3390}
3391
deadbeef953c2ce2017-01-09 14:53:41 -08003392TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003393 Base::TestCallTeardownRtcpMux();
3394}
3395
zstein56162b92017-04-24 16:54:35 -07003396TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3397 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003398}
3399
zstein56162b92017-04-24 16:54:35 -07003400TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3401 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003402}
3403
deadbeef953c2ce2017-01-09 14:53:41 -08003404TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003405 Base::SendRtpToRtp();
3406}
3407
deadbeef953c2ce2017-01-09 14:53:41 -08003408TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003409 Base::SendRtcpToRtcp();
3410}
3411
deadbeef953c2ce2017-01-09 14:53:41 -08003412TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003413 Base::SendRtcpMuxToRtcp();
3414}
3415
deadbeef953c2ce2017-01-09 14:53:41 -08003416TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003417 Base::SendRtcpMuxToRtcpMux();
3418}
3419
deadbeef953c2ce2017-01-09 14:53:41 -08003420TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003421 Base::SendEarlyRtcpMuxToRtcp();
3422}
3423
deadbeef953c2ce2017-01-09 14:53:41 -08003424TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003425 Base::SendEarlyRtcpMuxToRtcpMux();
3426}
3427
deadbeef953c2ce2017-01-09 14:53:41 -08003428TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003429 Base::SendSrtpToSrtp();
3430}
3431
deadbeef953c2ce2017-01-09 14:53:41 -08003432TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003433 Base::SendSrtpToSrtp();
3434}
3435
deadbeef953c2ce2017-01-09 14:53:41 -08003436TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003437 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3438}
3439
deadbeef953c2ce2017-01-09 14:53:41 -08003440TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003441 Base::SendRtpToRtpOnThread();
3442}
3443
deadbeef953c2ce2017-01-09 14:53:41 -08003444TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003445 Base::SendSrtpToSrtpOnThread();
3446}
3447
deadbeef953c2ce2017-01-09 14:53:41 -08003448TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003449 Base::SendWithWritabilityLoss();
3450}
3451
deadbeef953c2ce2017-01-09 14:53:41 -08003452TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003453 Base::TestMediaMonitor();
3454}
3455
Steve Anton8a63f782017-10-23 13:08:53 -07003456TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3457 Base::SocketOptionsMergedOnSetTransport();
3458}
3459
deadbeef953c2ce2017-01-09 14:53:41 -08003460TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003461 CreateChannels(0, 0);
3462 EXPECT_TRUE(SendInitiate());
3463 EXPECT_TRUE(SendAccept());
3464
3465 cricket::SendDataParams params;
3466 params.ssrc = 42;
3467 unsigned char data[] = {'f', 'o', 'o'};
3468 rtc::CopyOnWriteBuffer payload(data, 3);
3469 cricket::SendDataResult result;
3470 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3471 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3472 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3473}
3474
deadbeef953c2ce2017-01-09 14:53:41 -08003475TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003476 Base::TestInit();
3477 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3478}
3479
deadbeef953c2ce2017-01-09 14:53:41 -08003480TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003481 Base::TestDeinit();
3482}
3483
deadbeef953c2ce2017-01-09 14:53:41 -08003484TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003485 Base::TestSetContents();
3486}
3487
deadbeef953c2ce2017-01-09 14:53:41 -08003488TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003489 Base::TestSetContentsNullOffer();
3490}
3491
deadbeef953c2ce2017-01-09 14:53:41 -08003492TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003493 Base::TestSetContentsRtcpMux();
3494}
3495
deadbeef953c2ce2017-01-09 14:53:41 -08003496TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003497 Base::TestStreams();
3498}
3499
deadbeef953c2ce2017-01-09 14:53:41 -08003500TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003501 Base::TestChangeStreamParamsInContent();
3502}
3503
deadbeef953c2ce2017-01-09 14:53:41 -08003504TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003505 Base::TestPlayoutAndSendingStates();
3506}
3507
deadbeef953c2ce2017-01-09 14:53:41 -08003508TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003509 Base::TestMediaContentDirection();
3510}
3511
deadbeef953c2ce2017-01-09 14:53:41 -08003512TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003513 Base::TestCallSetup();
3514}
3515
deadbeef953c2ce2017-01-09 14:53:41 -08003516TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003517 Base::TestCallTeardownRtcpMux();
3518}
3519
zstein56162b92017-04-24 16:54:35 -07003520TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3521 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003522}
3523
zstein56162b92017-04-24 16:54:35 -07003524TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3525 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003526}
3527
deadbeef953c2ce2017-01-09 14:53:41 -08003528TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003529 Base::SendRtpToRtp();
3530}
3531
deadbeef953c2ce2017-01-09 14:53:41 -08003532TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003533 Base::SendRtcpToRtcp();
3534}
3535
deadbeef953c2ce2017-01-09 14:53:41 -08003536TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003537 Base::SendRtcpMuxToRtcp();
3538}
3539
deadbeef953c2ce2017-01-09 14:53:41 -08003540TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003541 Base::SendRtcpMuxToRtcpMux();
3542}
3543
deadbeef953c2ce2017-01-09 14:53:41 -08003544TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003545 Base::SendEarlyRtcpMuxToRtcp();
3546}
3547
deadbeef953c2ce2017-01-09 14:53:41 -08003548TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003549 Base::SendEarlyRtcpMuxToRtcpMux();
3550}
3551
deadbeef953c2ce2017-01-09 14:53:41 -08003552TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003553 Base::SendSrtpToSrtp();
3554}
3555
deadbeef953c2ce2017-01-09 14:53:41 -08003556TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003557 Base::SendSrtpToSrtp();
3558}
3559
deadbeef953c2ce2017-01-09 14:53:41 -08003560TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003561 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3562}
3563
deadbeef953c2ce2017-01-09 14:53:41 -08003564TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003565 Base::SendRtpToRtpOnThread();
3566}
3567
deadbeef953c2ce2017-01-09 14:53:41 -08003568TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003569 Base::SendSrtpToSrtpOnThread();
3570}
3571
deadbeef953c2ce2017-01-09 14:53:41 -08003572TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003573 Base::SendWithWritabilityLoss();
3574}
3575
deadbeef953c2ce2017-01-09 14:53:41 -08003576TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003577 Base::TestMediaMonitor();
3578}
3579
Steve Anton8a63f782017-10-23 13:08:53 -07003580TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3581 Base::SocketOptionsMergedOnSetTransport();
3582}
3583
deadbeef953c2ce2017-01-09 14:53:41 -08003584TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003585 CreateChannels(0, 0);
3586 EXPECT_TRUE(SendInitiate());
3587 EXPECT_TRUE(SendAccept());
3588
3589 cricket::SendDataParams params;
3590 params.ssrc = 42;
3591 unsigned char data[] = {
3592 'f', 'o', 'o'
3593 };
jbaucheec21bd2016-03-20 06:15:43 -07003594 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003595 cricket::SendDataResult result;
3596 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3597 EXPECT_EQ(params.ssrc,
3598 media_channel1_->last_sent_data_params().ssrc);
3599 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3600}
3601
deadbeefbad5dad2017-01-17 18:32:35 -08003602#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3603
3604// Verifies some DCHECKs are in place.
3605// Uses VoiceChannel, but any BaseChannel subclass would work.
3606class BaseChannelDeathTest : public testing::Test {
3607 public:
3608 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003609 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3610 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3611 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003612 voice_channel_(rtc::Thread::Current(),
3613 rtc::Thread::Current(),
3614 rtc::Thread::Current(),
3615 &fake_media_engine_,
3616 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3617 nullptr,
3618 cricket::AudioOptions()),
3619 cricket::CN_AUDIO,
3620 false,
3621 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003622
3623 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003624 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003625 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3626 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003627 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003628};
3629
deadbeeff5346592017-01-24 21:51:21 -08003630TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003631 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3632 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003633 cricket::FakeDtlsTransport new_rtcp_transport(
3634 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3635 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003636}
3637
deadbeeff5346592017-01-24 21:51:21 -08003638TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003639 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3640 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003641 cricket::FakeDtlsTransport new_rtp_transport(
3642 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3643 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003644}
3645
deadbeeff5346592017-01-24 21:51:21 -08003646TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003647 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3648 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003649 // Activate RTCP muxing, simulating offer/answer negotiation.
3650 cricket::AudioContentDescription content;
3651 content.set_rtcp_mux(true);
3652 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3653 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003654 cricket::FakeDtlsTransport new_rtp_transport(
3655 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3656 cricket::FakeDtlsTransport new_rtcp_transport(
3657 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003658 // After muxing is enabled, no RTCP transport should be passed in here.
3659 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003660 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3661 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003662}
3663
3664// This test will probably go away if/when we move the transport name out of
3665// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003666TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003667 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3668 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003669 cricket::FakeDtlsTransport new_rtp_transport(
3670 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3671 cricket::FakeDtlsTransport new_rtcp_transport(
3672 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003673 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003674 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3675 "");
3676}
3677
3678// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003679// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003680TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003681 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3682 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003683 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003684 voice_channel_.SetTransports(
3685 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3686 static_cast<rtc::PacketTransportInternal*>(
3687 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003688 "");
3689}
3690
deadbeef5bd5ca32017-02-10 11:31:50 -08003691// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003692// DtlsTransportInternal.
3693TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003694 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3695 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003696 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3697 &fake_rtp_dtls_transport_),
3698 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003699}
3700
3701#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3702
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003703// TODO(pthatcher): TestSetReceiver?