blob: 0d155c4a3fbf334665b3b3f54a4ff01713f95469 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010012#include <utility>
kwiberg31022942016-03-11 14:18:21 -080013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/array_view.h"
15#include "media/base/fakemediaengine.h"
16#include "media/base/fakertp.h"
17#include "media/base/mediachannel.h"
18#include "media/base/testutils.h"
19#include "p2p/base/fakecandidatepair.h"
20#include "p2p/base/fakedtlstransport.h"
21#include "p2p/base/fakepackettransport.h"
22#include "pc/channel.h"
23#include "rtc_base/buffer.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/fakeclock.h"
26#include "rtc_base/gunit.h"
27#include "rtc_base/logging.h"
28#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
zhihuangb2cdd932017-01-19 16:54:25 -080030using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080033using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080034using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Danil Chapovalov33b01f22016-05-11 19:55:27 +020036namespace {
37const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
38const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070040const cricket::VideoCodec kH264Codec(97, "H264");
41const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020042const cricket::DataCodec kGoogleDataCodec(101, "google-data");
43const uint32_t kSsrc1 = 0x1111;
44const uint32_t kSsrc2 = 0x2222;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020045const int kAudioPts[] = {0, 8};
46const int kVideoPts[] = {97, 99};
47enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080048const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
deadbeefcbecd352015-09-23 11:50:27 -070051template <class ChannelT,
52 class MediaChannelT,
53 class ContentT,
54 class CodecT,
55 class MediaInfoT,
56 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057class Traits {
58 public:
59 typedef ChannelT Channel;
60 typedef MediaChannelT MediaChannel;
61 typedef ContentT Content;
62 typedef CodecT Codec;
63 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020064 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065};
66
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067class VoiceTraits : public Traits<cricket::VoiceChannel,
68 cricket::FakeVoiceMediaChannel,
69 cricket::AudioContentDescription,
70 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020071 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070072 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073
74class VideoTraits : public Traits<cricket::VideoChannel,
75 cricket::FakeVideoMediaChannel,
76 cricket::VideoContentDescription,
77 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020078 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070079 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080
deadbeef953c2ce2017-01-09 14:53:41 -080081class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 cricket::FakeDataMediaChannel,
83 cricket::DataContentDescription,
84 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020085 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070086 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087
deadbeef953c2ce2017-01-09 14:53:41 -080088// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089template<class T>
90class ChannelTest : public testing::Test, public sigslot::has_slots<> {
91 public:
deadbeefac22f702017-01-12 21:59:29 -080092 enum Flags {
93 RTCP_MUX = 0x1,
94 RTCP_MUX_REQUIRED = 0x2,
95 SECURE = 0x4,
96 SSRC_MUX = 0x8,
97 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080098 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080099 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700100 RAW_PACKET_TRANSPORT = 0x20,
jbauch5869f502017-06-29 12:31:36 -0700101 GCM_CIPHER = 0x40,
102 ENCRYPTED_HEADERS = 0x80,
deadbeefac22f702017-01-12 21:59:29 -0800103 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
Peter Boström34fbfff2015-09-24 19:20:30 +0200105 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200106 rtc::ArrayView<const uint8_t> rtp_data,
107 rtc::ArrayView<const uint8_t> rtcp_data,
108 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200109 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200110 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800111 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200112 if (network_is_worker == NetworkIsWorker::Yes) {
113 network_thread_ = rtc::Thread::Current();
114 } else {
115 network_thread_keeper_ = rtc::Thread::Create();
116 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 network_thread_ = network_thread_keeper_.get();
118 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800122 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
123 nullptr, typename T::Options()),
124 rtc::MakeUnique<typename T::MediaChannel>(
125 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200126 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
Steve Anton8699a322017-11-06 15:53:33 -0800128 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
129 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 int flags1,
131 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800132 // Network thread is started in CreateChannels, to allow the test to
133 // configure a fake clock before any threads are spawned and attempt to
134 // access the time.
135 if (network_thread_keeper_) {
136 network_thread_keeper_->Start();
137 }
deadbeefac22f702017-01-12 21:59:29 -0800138 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800139 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
140 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
141 // Make sure if using raw packet transports, they're used for both
142 // channels.
143 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200144 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800145 media_channel1_ = ch1.get();
146 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800147 rtc::PacketTransportInternal* rtp1 = nullptr;
148 rtc::PacketTransportInternal* rtcp1 = nullptr;
149 rtc::PacketTransportInternal* rtp2 = nullptr;
150 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800151 // Based on flags, create fake DTLS or raw packet transports.
152 if (flags1 & RAW_PACKET_TRANSPORT) {
153 fake_rtp_packet_transport1_.reset(
154 new rtc::FakePacketTransport("channel1_rtp"));
155 rtp1 = fake_rtp_packet_transport1_.get();
156 if (!(flags1 & RTCP_MUX_REQUIRED)) {
157 fake_rtcp_packet_transport1_.reset(
158 new rtc::FakePacketTransport("channel1_rtcp"));
159 rtcp1 = fake_rtcp_packet_transport1_.get();
160 }
161 } else {
162 // Confirmed to work with KT_RSA and KT_ECDSA.
163 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
164 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
165 rtp1 = fake_rtp_dtls_transport1_.get();
166 if (!(flags1 & RTCP_MUX_REQUIRED)) {
167 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
168 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
169 rtcp1 = fake_rtcp_dtls_transport1_.get();
170 }
171 if (flags1 & DTLS) {
172 auto cert1 =
173 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
174 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
175 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
176 if (fake_rtcp_dtls_transport1_) {
177 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
178 }
179 }
jbauch5869f502017-06-29 12:31:36 -0700180 if (flags1 & ENCRYPTED_HEADERS) {
181 rtc::CryptoOptions crypto_options;
182 crypto_options.enable_encrypted_rtp_header_extensions = true;
183 fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
186 }
187 }
188 if (flags1 & GCM_CIPHER) {
189 fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
190 rtc::SRTP_AEAD_AES_256_GCM);
191 if (fake_rtcp_dtls_transport1_) {
192 fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
193 rtc::SRTP_AEAD_AES_256_GCM);
194 }
195 }
deadbeeff5346592017-01-24 21:51:21 -0800196 }
197 // Based on flags, create fake DTLS or raw packet transports.
198 if (flags2 & RAW_PACKET_TRANSPORT) {
199 fake_rtp_packet_transport2_.reset(
200 new rtc::FakePacketTransport("channel2_rtp"));
201 rtp2 = fake_rtp_packet_transport2_.get();
202 if (!(flags2 & RTCP_MUX_REQUIRED)) {
203 fake_rtcp_packet_transport2_.reset(
204 new rtc::FakePacketTransport("channel2_rtcp"));
205 rtcp2 = fake_rtcp_packet_transport2_.get();
206 }
207 } else {
208 // Confirmed to work with KT_RSA and KT_ECDSA.
209 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
210 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
211 rtp2 = fake_rtp_dtls_transport2_.get();
212 if (!(flags2 & RTCP_MUX_REQUIRED)) {
213 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
214 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
215 rtcp2 = fake_rtcp_dtls_transport2_.get();
216 }
217 if (flags2 & DTLS) {
218 auto cert2 =
219 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
220 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
221 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
222 if (fake_rtcp_dtls_transport2_) {
223 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
224 }
225 }
jbauch5869f502017-06-29 12:31:36 -0700226 if (flags2 & ENCRYPTED_HEADERS) {
227 rtc::CryptoOptions crypto_options;
228 crypto_options.enable_encrypted_rtp_header_extensions = true;
229 fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
230 if (fake_rtcp_dtls_transport2_) {
231 fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
232 }
233 }
234 if (flags2 & GCM_CIPHER) {
235 fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
236 rtc::SRTP_AEAD_AES_256_GCM);
237 if (fake_rtcp_dtls_transport2_) {
238 fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
239 rtc::SRTP_AEAD_AES_256_GCM);
240 }
241 }
deadbeeff5346592017-01-24 21:51:21 -0800242 }
Steve Anton8699a322017-11-06 15:53:33 -0800243 channel1_ =
244 CreateChannel(worker_thread, network_thread_, &media_engine_,
245 std::move(ch1), fake_rtp_dtls_transport1_.get(),
246 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1);
247 channel2_ =
248 CreateChannel(worker_thread, network_thread_, &media_engine_,
249 std::move(ch2), fake_rtp_dtls_transport2_.get(),
250 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 channel1_->SignalMediaMonitor.connect(this,
252 &ChannelTest<T>::OnMediaMonitor1);
253 channel2_->SignalMediaMonitor.connect(this,
254 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800255 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800256 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800257 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800258 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000259 if ((flags1 & DTLS) && (flags2 & DTLS)) {
260 flags1 = (flags1 & ~SECURE);
261 flags2 = (flags2 & ~SECURE);
262 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 CreateContent(flags1, kPcmuCodec, kH264Codec,
264 &local_media_content1_);
265 CreateContent(flags2, kPcmuCodec, kH264Codec,
266 &local_media_content2_);
267 CopyContent(local_media_content1_, &remote_media_content1_);
268 CopyContent(local_media_content2_, &remote_media_content2_);
269
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000270 // Add stream information (SSRC) to the local content but not to the remote
271 // content. This means that we per default know the SSRC of what we send but
272 // not what we receive.
273 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
274 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
275
276 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
277 if (flags1 & SSRC_MUX) {
278 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
279 }
280 if (flags2 & SSRC_MUX) {
281 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
282 }
283 }
Steve Anton8699a322017-11-06 15:53:33 -0800284 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200285 rtc::Thread* worker_thread,
286 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700287 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800288 std::unique_ptr<typename T::MediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -0800289 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
290 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800291 rtc::PacketTransportInternal* fake_rtp_packet_transport,
292 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700293 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800294 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800295 auto channel = rtc::MakeUnique<typename T::Channel>(
296 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
deadbeefac22f702017-01-12 21:59:29 -0800297 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
298 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800299 if (!channel->NeedsRtcpTransport()) {
300 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800301 }
Steve Anton8699a322017-11-06 15:53:33 -0800302 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
303 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000304 return channel;
305 }
306
deadbeeff5346592017-01-24 21:51:21 -0800307 void ConnectFakeTransports() {
308 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
309 bool asymmetric = false;
310 // Depending on test flags, could be using DTLS or raw packet transport.
311 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
312 fake_rtp_dtls_transport1_->SetDestination(
313 fake_rtp_dtls_transport2_.get(), asymmetric);
314 }
315 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
316 fake_rtcp_dtls_transport1_->SetDestination(
317 fake_rtcp_dtls_transport2_.get(), asymmetric);
318 }
319 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
320 fake_rtp_packet_transport1_->SetDestination(
321 fake_rtp_packet_transport2_.get(), asymmetric);
322 }
323 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
324 fake_rtcp_packet_transport1_->SetDestination(
325 fake_rtcp_packet_transport2_.get(), asymmetric);
326 }
327 });
328 }
329
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000331 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800332 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 if (result) {
334 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800336 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800338 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800340 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 }
342 }
343 return result;
344 }
345
346 bool SendAccept() {
347 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000348 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800349 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 }
351
352 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 if (result) {
356 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000357 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800358 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 }
360 return result;
361 }
362
363 bool SendProvisionalAnswer() {
364 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800365 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 if (result) {
367 channel2_->Enable(true);
368 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800369 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800370 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 }
372 return result;
373 }
374
375 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000376 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800377 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000379 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800380 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 return result;
382 }
383
deadbeeff5346592017-01-24 21:51:21 -0800384 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 channel1_.reset();
386 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800387 fake_rtp_dtls_transport1_.reset();
388 fake_rtcp_dtls_transport1_.reset();
389 fake_rtp_dtls_transport2_.reset();
390 fake_rtcp_dtls_transport2_.reset();
391 fake_rtp_packet_transport1_.reset();
392 fake_rtcp_packet_transport1_.reset();
393 fake_rtp_packet_transport2_.reset();
394 fake_rtcp_packet_transport2_.reset();
395 if (network_thread_keeper_) {
396 network_thread_keeper_.reset();
397 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 return true;
399 }
400
401 bool AddStream1(int id) {
402 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
403 }
404 bool RemoveStream1(int id) {
405 return channel1_->RemoveRecvStream(id);
406 }
407
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp1() {
409 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
410 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtp2() {
413 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
414 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendRtcp1() {
417 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendRtcp2() {
420 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
422 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
428 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
429 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtcp1(uint32_t ssrc) {
432 rtc::Buffer data = CreateRtcpData(ssrc);
433 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendCustomRtcp2(uint32_t ssrc) {
436 rtc::Buffer data = CreateRtcpData(ssrc);
437 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 }
443 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
446 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200447 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
449 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 }
452 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200453 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
455 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
459 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtcpData(ssrc);
463 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200465 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Buffer data = CreateRtcpData(ssrc);
467 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
470 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200472 rtc::SetBE32(data.data() + 8, ssrc);
473 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000474 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 return data;
478 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
480 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 return data;
484 }
485
486 bool CheckNoRtp1() {
487 return media_channel1_->CheckNoRtp();
488 }
489 bool CheckNoRtp2() {
490 return media_channel2_->CheckNoRtp();
491 }
492 bool CheckNoRtcp1() {
493 return media_channel1_->CheckNoRtcp();
494 }
495 bool CheckNoRtcp2() {
496 return media_channel2_->CheckNoRtcp();
497 }
498
499 void CreateContent(int flags,
500 const cricket::AudioCodec& audio_codec,
501 const cricket::VideoCodec& video_codec,
502 typename T::Content* content) {
503 // overridden in specialized classes
504 }
505 void CopyContent(const typename T::Content& source,
506 typename T::Content* content) {
507 // overridden in specialized classes
508 }
509
Steve Anton18ee1d52017-09-11 11:32:35 -0700510 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700512 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
513 typename T::Content* content = new typename T::Content();
514 CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
515 AddLegacyStreamInContent(ssrc, 0, content);
516 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517 }
518
ossu292d6582016-03-17 02:31:13 -0700519 // Will manage the lifetime of a CallThread, making sure it's
520 // destroyed before this object goes out of scope.
521 class ScopedCallThread {
522 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200523 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700524 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 : thread_(rtc::Thread::Create()),
526 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700527 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700528 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700529 }
530
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700534
535 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200536 std::unique_ptr<rtc::Thread> thread_;
537 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700538 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
541 return false; // overridden in specialized classes
542 }
543
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200544 void OnMediaMonitor1(typename T::Channel* channel,
545 const typename T::MediaInfo& info) {
546 RTC_DCHECK_EQ(channel, channel1_.get());
547 media_info_callbacks1_++;
548 }
549 void OnMediaMonitor2(typename T::Channel* channel,
550 const typename T::MediaInfo& info) {
551 RTC_DCHECK_EQ(channel, channel2_.get());
552 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 }
deadbeeff5346592017-01-24 21:51:21 -0800554 void OnRtcpMuxFullyActive1(const std::string&) {
555 rtcp_mux_activated_callbacks1_++;
556 }
557 void OnRtcpMuxFullyActive2(const std::string&) {
558 rtcp_mux_activated_callbacks2_++;
559 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560
Honghai Zhangcc411c02016-03-29 17:27:21 -0700561 cricket::CandidatePairInterface* last_selected_candidate_pair() {
562 return last_selected_candidate_pair_;
563 }
564
Peter Boström0c4e06b2015-10-07 12:23:21 +0200565 void AddLegacyStreamInContent(uint32_t ssrc,
566 int flags,
567 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Base implementation.
569 }
570
571 // Tests that can be used by derived classes.
572
573 // Basic sanity check.
574 void TestInit() {
575 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700576 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200578 if (verify_playout_) {
579 EXPECT_FALSE(media_channel1_->playout());
580 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_TRUE(media_channel1_->codecs().empty());
582 EXPECT_TRUE(media_channel1_->recv_streams().empty());
583 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
584 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly configure
588 // the codecs.
589 void TestSetContents() {
590 CreateChannels(0, 0);
591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800593 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800595 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 ASSERT_EQ(1U, media_channel1_->codecs().size());
597 EXPECT_TRUE(CodecMatches(content.codecs()[0],
598 media_channel1_->codecs()[0]));
599 }
600
601 // Test that SetLocalContent and SetRemoteContent properly deals
602 // with an empty offer.
603 void TestSetContentsNullOffer() {
604 CreateChannels(0, 0);
605 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800606 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 ASSERT_EQ(1U, media_channel1_->codecs().size());
611 EXPECT_TRUE(CodecMatches(content.codecs()[0],
612 media_channel1_->codecs()[0]));
613 }
614
615 // Test that SetLocalContent and SetRemoteContent properly set RTCP
616 // mux.
617 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800618 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 typename T::Content content;
620 CreateContent(0, kPcmuCodec, kH264Codec, &content);
621 // Both sides agree on mux. Should no longer be a separate RTCP channel.
622 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800623 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
624 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800626 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800628 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 }
630
631 // Test that SetLocalContent and SetRemoteContent properly set RTCP
632 // mux when a provisional answer is received.
633 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800634 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 typename T::Content content;
636 CreateContent(0, kPcmuCodec, kH264Codec, &content);
637 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800638 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
639 EXPECT_TRUE(
640 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800641 // Both sides agree on mux. Should signal RTCP mux as fully activated.
642 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800644 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800648 EXPECT_TRUE(
649 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, 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
Steve Anton3828c062017-12-06 10:34:51 -0800668 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 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);
Steve Anton3828c062017-12-06 10:34:51 -0800687 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, 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
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800698 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, 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
Steve Anton3828c062017-12-06 10:34:51 -0800716 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800723 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
725
Steve Anton3828c062017-12-06 10:34:51 -0800726 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, 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);
Steve Anton3828c062017-12-06 10:34:51 -0800815 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700816 EXPECT_TRUE(channel1_->Enable(true));
817 EXPECT_EQ(1u, media_channel1_->send_streams().size());
818 packet_listener1.encrypted_headers.push_back(1);
819
Steve Anton3828c062017-12-06 10:34:51 -0800820 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700821 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);
Steve Anton3828c062017-12-06 10:34:51 -0800828 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700829 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
Steve Anton3828c062017-12-06 10:34:51 -0800847 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700848 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);
Steve Anton3828c062017-12-06 10:34:51 -0800866 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700867 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
Steve Anton3828c062017-12-06 10:34:51 -0800873 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700874 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);
Steve Anton3828c062017-12-06 10:34:51 -0800897 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700898 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
Steve Anton3828c062017-12-06 10:34:51 -0800903 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
jbauch5869f502017-06-29 12:31:36 -0700904 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800930 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800936 SdpType::kOffer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800942 SdpType::kAnswer, 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_,
Steve Anton3828c062017-12-06 10:34:51 -0800962 SdpType::kAnswer, 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
Steve Anton3828c062017-12-06 10:34:51 -0800991 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
992 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
993 EXPECT_TRUE(
994 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
995 EXPECT_TRUE(
996 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800997 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998
Peter Boström34fbfff2015-09-24 19:20:30 +0200999 if (verify_playout_) {
1000 EXPECT_TRUE(media_channel1_->playout());
1001 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +02001003 if (verify_playout_) {
1004 EXPECT_FALSE(media_channel2_->playout()); // local InActive
1005 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006 EXPECT_FALSE(media_channel2_->sending()); // local InActive
1007
1008 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -08001009 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -08001010 EXPECT_TRUE(
1011 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
1012 EXPECT_TRUE(
1013 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014
Peter Boström34fbfff2015-09-24 19:20:30 +02001015 if (verify_playout_) {
1016 EXPECT_TRUE(media_channel1_->playout());
1017 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001019 if (verify_playout_) {
1020 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
1021 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
1023
1024 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -08001025 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -08001026 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
1027 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028
Peter Boström34fbfff2015-09-24 19:20:30 +02001029 if (verify_playout_) {
1030 EXPECT_TRUE(media_channel1_->playout());
1031 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +02001033 if (verify_playout_) {
1034 EXPECT_TRUE(media_channel2_->playout());
1035 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 EXPECT_TRUE(media_channel2_->sending());
1037 }
1038
Honghai Zhangcc411c02016-03-29 17:27:21 -07001039 // Tests that when the transport channel signals a candidate pair change
1040 // event, the media channel will receive a call on the network route change.
1041 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -07001042 static constexpr uint16_t kLocalNetId = 1;
1043 static constexpr uint16_t kRemoteNetId = 2;
1044 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -08001045 // Ipv4(20) + UDP(8).
1046 static constexpr int kTransportOverheadPerPacket = 28;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001047
Honghai Zhangcc411c02016-03-29 17:27:21 -07001048 CreateChannels(0, 0);
1049
Honghai Zhangcc411c02016-03-29 17:27:21 -07001050 typename T::MediaChannel* media_channel1 =
1051 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001052 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001053
Zhi Huang942bc2e2017-11-13 13:26:07 -08001054 // Need to wait for the threads before calling
1055 // |set_num_network_route_changes| because the network route would be set
1056 // when creating the channel.
1057 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001058 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001059 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001060 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001061 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001062 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1063
1064 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001065 });
1066 WaitForThreads();
1067 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001068 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001069 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001070
eladalon05b07bb2017-08-24 07:40:16 -07001071 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -08001072 rtc::NetworkRoute network_route;
1073 network_route.connected = true;
1074 network_route.local_network_id = kLocalNetId;
1075 network_route.remote_network_id = kRemoteNetId;
1076 network_route.last_sent_packet_id = kLastPacketId;
1077 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -08001079 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
1080
1081 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 });
1083 WaitForThreads();
1084 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001085 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001086 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001087 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001088 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001089 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001090 EXPECT_EQ(kTransportOverheadPerPacket,
1091 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001092 }
1093
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 // Test setting up a call.
1095 void TestCallSetup() {
1096 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001097 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001099 if (verify_playout_) {
1100 EXPECT_TRUE(media_channel1_->playout());
1101 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 EXPECT_FALSE(media_channel1_->sending());
1103 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001104 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_TRUE(media_channel1_->sending());
1106 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001107 if (verify_playout_) {
1108 EXPECT_TRUE(media_channel2_->playout());
1109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_TRUE(media_channel2_->sending());
1111 EXPECT_EQ(1U, media_channel2_->codecs().size());
1112 }
1113
1114 // Test that we don't crash if packets are sent during call teardown
1115 // when RTCP mux is enabled. This is a regression test against a specific
1116 // race condition that would only occur when a RTCP packet was sent during
1117 // teardown of a channel on which RTCP mux was enabled.
1118 void TestCallTeardownRtcpMux() {
1119 class LastWordMediaChannel : public T::MediaChannel {
1120 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001123 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1124 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1126 }
1127 };
Steve Anton8699a322017-11-06 15:53:33 -08001128 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
1129 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(SendInitiate());
1131 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001132 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 }
1134
1135 // Send voice RTP data to the other side and ensure it gets there.
1136 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001137 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 EXPECT_TRUE(SendInitiate());
1139 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001140 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1141 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001142 SendRtp1();
1143 SendRtp2();
1144 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_TRUE(CheckRtp1());
1146 EXPECT_TRUE(CheckRtp2());
1147 EXPECT_TRUE(CheckNoRtp1());
1148 EXPECT_TRUE(CheckNoRtp2());
1149 }
1150
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001151 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001152 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001153 EXPECT_TRUE(SendInitiate());
1154 EXPECT_TRUE(SendAccept());
1155 SendRtp1();
1156 SendRtp2();
1157 SendRtcp1();
1158 SendRtcp2();
1159 // Do not wait, destroy channels.
1160 channel1_.reset(nullptr);
1161 channel2_.reset(nullptr);
1162 }
1163
deadbeefac22f702017-01-12 21:59:29 -08001164 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001166 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 EXPECT_TRUE(SendInitiate());
1168 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001169 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1170 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001171 SendRtcp1();
1172 SendRtcp2();
1173 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 EXPECT_TRUE(CheckRtcp1());
1175 EXPECT_TRUE(CheckRtcp2());
1176 EXPECT_TRUE(CheckNoRtcp1());
1177 EXPECT_TRUE(CheckNoRtcp2());
1178 }
1179
1180 // Check that RTCP is transmitted if only the initiator supports mux.
1181 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001182 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(SendInitiate());
1184 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001185 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1186 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001187 SendRtcp1();
1188 SendRtcp2();
1189 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190 EXPECT_TRUE(CheckRtcp1());
1191 EXPECT_TRUE(CheckRtcp2());
1192 EXPECT_TRUE(CheckNoRtcp1());
1193 EXPECT_TRUE(CheckNoRtcp2());
1194 }
1195
1196 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1197 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001198 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001200 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1201 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1202 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001204 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1205 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001206 SendRtp1();
1207 SendRtp2();
1208 SendRtcp1();
1209 SendRtcp2();
1210 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 EXPECT_TRUE(CheckRtp1());
1212 EXPECT_TRUE(CheckRtp2());
1213 EXPECT_TRUE(CheckNoRtp1());
1214 EXPECT_TRUE(CheckNoRtp2());
1215 EXPECT_TRUE(CheckRtcp1());
1216 EXPECT_TRUE(CheckRtcp2());
1217 EXPECT_TRUE(CheckNoRtcp1());
1218 EXPECT_TRUE(CheckNoRtcp2());
1219 }
1220
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001221 // Check that RTP and RTCP are transmitted ok when both sides
1222 // support mux and one the offerer requires mux.
1223 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001224 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001225 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001226 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1227 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001228 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001229 SendRtp1();
1230 SendRtp2();
1231 SendRtcp1();
1232 SendRtcp2();
1233 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001234 EXPECT_TRUE(CheckRtp1());
1235 EXPECT_TRUE(CheckRtp2());
1236 EXPECT_TRUE(CheckNoRtp1());
1237 EXPECT_TRUE(CheckNoRtp2());
1238 EXPECT_TRUE(CheckRtcp1());
1239 EXPECT_TRUE(CheckRtcp2());
1240 EXPECT_TRUE(CheckNoRtcp1());
1241 EXPECT_TRUE(CheckNoRtcp2());
1242 }
1243
1244 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001245 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001246 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001247 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001248 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001249 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1250 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1251 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001252 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001253 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1254 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001255 SendRtp1();
1256 SendRtp2();
1257 SendRtcp1();
1258 SendRtcp2();
1259 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001260 EXPECT_TRUE(CheckRtp1());
1261 EXPECT_TRUE(CheckRtp2());
1262 EXPECT_TRUE(CheckNoRtp1());
1263 EXPECT_TRUE(CheckNoRtp2());
1264 EXPECT_TRUE(CheckRtcp1());
1265 EXPECT_TRUE(CheckRtcp2());
1266 EXPECT_TRUE(CheckNoRtcp1());
1267 EXPECT_TRUE(CheckNoRtcp2());
1268 }
1269
1270 // Check that RTP and RTCP are transmitted ok when both sides
1271 // require mux.
1272 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001273 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001274 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001275 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1276 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001277 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001278 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001279 SendRtp1();
1280 SendRtp2();
1281 SendRtcp1();
1282 SendRtcp2();
1283 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001284 EXPECT_TRUE(CheckRtp1());
1285 EXPECT_TRUE(CheckRtp2());
1286 EXPECT_TRUE(CheckNoRtp1());
1287 EXPECT_TRUE(CheckNoRtp2());
1288 EXPECT_TRUE(CheckRtcp1());
1289 EXPECT_TRUE(CheckRtcp2());
1290 EXPECT_TRUE(CheckNoRtcp1());
1291 EXPECT_TRUE(CheckNoRtcp2());
1292 }
1293
1294 // Check that SendAccept fails if the answerer doesn't support mux
1295 // and the offerer requires it.
1296 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001297 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001298 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001299 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1300 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001301 EXPECT_FALSE(SendAccept());
1302 }
1303
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 // Check that RTCP data sent by the initiator before the accept is not muxed.
1305 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001306 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001308 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1309 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001310
1311 // RTCP can be sent before the call is accepted, if the transport is ready.
1312 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001313 SendRtcp1();
1314 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(CheckNoRtp2());
1316 EXPECT_TRUE(CheckRtcp2());
1317
1318 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001319 SendRtcp2();
1320 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001321 EXPECT_TRUE(CheckNoRtp1());
1322 EXPECT_TRUE(CheckRtcp1());
1323
1324 // Complete call setup and ensure everything is still OK.
1325 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001326 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001327 SendRtcp1();
1328 SendRtcp2();
1329 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331 EXPECT_TRUE(CheckRtcp1());
1332 }
1333
1334
1335 // Check that RTCP data is not muxed until both sides have enabled muxing,
1336 // but that we properly demux before we get the accept message, since there
1337 // is a race between RTP data and the jingle accept.
1338 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001339 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001341 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1342 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343
1344 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1345 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 SendRtcp1();
1347 WaitForThreads();
1348 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349
1350 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001351 SendRtcp2();
1352 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353 EXPECT_TRUE(CheckNoRtp1());
1354 EXPECT_TRUE(CheckRtcp1());
1355
1356 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001357 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001359 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1360 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001361 SendRtcp1();
1362 SendRtcp2();
1363 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_TRUE(CheckRtcp1());
1366 }
1367
1368 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001369 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001371 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1372 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373
deadbeefac22f702017-01-12 21:59:29 -08001374 int flags1 = SECURE | flags1_in;
1375 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 bool dtls1 = !!(flags1_in & DTLS);
1377 bool dtls2 = !!(flags2_in & DTLS);
1378 CreateChannels(flags1, flags2);
Zhi Huangcf990f52017-09-22 12:12:30 -07001379 EXPECT_FALSE(channel1_->srtp_active());
1380 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001382 WaitForThreads();
1383 EXPECT_TRUE(channel1_->writable());
1384 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001385 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001386 EXPECT_TRUE(channel1_->srtp_active());
1387 EXPECT_TRUE(channel2_->srtp_active());
1388 EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
1389 EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 SendRtp1();
1391 SendRtp2();
1392 SendRtcp1();
1393 SendRtcp2();
1394 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395 EXPECT_TRUE(CheckRtp1());
1396 EXPECT_TRUE(CheckRtp2());
1397 EXPECT_TRUE(CheckNoRtp1());
1398 EXPECT_TRUE(CheckNoRtp2());
1399 EXPECT_TRUE(CheckRtcp1());
1400 EXPECT_TRUE(CheckRtcp2());
1401 EXPECT_TRUE(CheckNoRtcp1());
1402 EXPECT_TRUE(CheckNoRtcp2());
1403 }
1404
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08001405 // Test that the DTLS to SDES fallback is not supported and the negotiation
1406 // between DTLS to SDES end points will fail.
1407 void SendDtlsToSdesNotSupported() {
1408 int flags1 = SECURE | DTLS;
1409 int flags2 = SECURE;
1410 CreateChannels(flags1, flags2);
1411 EXPECT_FALSE(channel1_->srtp_active());
1412 EXPECT_FALSE(channel2_->srtp_active());
1413 EXPECT_FALSE(SendInitiate());
1414 }
1415
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416 // Test that we properly handling SRTP negotiating down to RTP.
1417 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001418 CreateChannels(SECURE, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -07001419 EXPECT_FALSE(channel1_->srtp_active());
1420 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421 EXPECT_TRUE(SendInitiate());
1422 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001423 EXPECT_FALSE(channel1_->srtp_active());
1424 EXPECT_FALSE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001425 SendRtp1();
1426 SendRtp2();
1427 SendRtcp1();
1428 SendRtcp2();
1429 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 EXPECT_TRUE(CheckRtp1());
1431 EXPECT_TRUE(CheckRtp2());
1432 EXPECT_TRUE(CheckNoRtp1());
1433 EXPECT_TRUE(CheckNoRtp2());
1434 EXPECT_TRUE(CheckRtcp1());
1435 EXPECT_TRUE(CheckRtcp2());
1436 EXPECT_TRUE(CheckNoRtcp1());
1437 EXPECT_TRUE(CheckNoRtcp2());
1438 }
1439
1440 // Test that we can send and receive early media when a provisional answer is
1441 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1442 void SendEarlyMediaUsingRtcpMuxSrtp() {
1443 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1444
deadbeefac22f702017-01-12 21:59:29 -08001445 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1446 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_TRUE(SendOffer());
1448 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001449 EXPECT_TRUE(channel1_->srtp_active());
1450 EXPECT_TRUE(channel2_->srtp_active());
deadbeeff5346592017-01-24 21:51:21 -08001451 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1452 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001453 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1454 SendCustomRtcp1(kSsrc1);
1455 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1456 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1459
1460 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001461 SendCustomRtcp2(kSsrc2);
1462 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1463 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1466
1467 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001468 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1469 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001471 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1472 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1473 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1474 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
Zhi Huangcf990f52017-09-22 12:12:30 -07001475 EXPECT_TRUE(channel1_->srtp_active());
1476 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001477 SendCustomRtcp1(kSsrc1);
1478 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1479 SendCustomRtcp2(kSsrc2);
1480 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1481 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001485 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1486 }
1487
1488 // Test that we properly send RTP without SRTP from a thread.
1489 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001490 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_TRUE(SendInitiate());
1492 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1494 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1495 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1496 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1497 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1498 send_rtcp1.thread(),
1499 send_rtcp2.thread()};
1500 WaitForThreads(involved_threads);
1501 EXPECT_TRUE(CheckRtp1());
1502 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 EXPECT_TRUE(CheckNoRtp1());
1504 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001505 EXPECT_TRUE(CheckRtcp1());
1506 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507 EXPECT_TRUE(CheckNoRtcp1());
1508 EXPECT_TRUE(CheckNoRtcp2());
1509 }
1510
1511 // Test that we properly send SRTP with RTCP from a thread.
1512 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001513 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_TRUE(SendInitiate());
1515 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001516 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1517 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1518 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1519 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1520 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1521 send_rtcp1.thread(),
1522 send_rtcp2.thread()};
1523 WaitForThreads(involved_threads);
1524 EXPECT_TRUE(CheckRtp1());
1525 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 EXPECT_TRUE(CheckNoRtp1());
1527 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001528 EXPECT_TRUE(CheckRtcp1());
1529 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 EXPECT_TRUE(CheckNoRtcp1());
1531 EXPECT_TRUE(CheckNoRtcp2());
1532 }
1533
1534 // Test that the mediachannel retains its sending state after the transport
1535 // becomes non-writable.
1536 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001537 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538 EXPECT_TRUE(SendInitiate());
1539 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001540 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1541 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542 SendRtp1();
1543 SendRtp2();
1544 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545 EXPECT_TRUE(CheckRtp1());
1546 EXPECT_TRUE(CheckRtp2());
1547 EXPECT_TRUE(CheckNoRtp1());
1548 EXPECT_TRUE(CheckNoRtp2());
1549
wu@webrtc.org97077a32013-10-25 21:18:33 +00001550 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001551 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1552 fake_rtp_dtls_transport1_->SetWritable(false);
1553 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001554 SendRtp1();
1555 SendRtp2();
1556 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557 EXPECT_TRUE(CheckRtp1());
1558 EXPECT_TRUE(CheckNoRtp2());
1559
1560 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001561 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1562 fake_rtp_dtls_transport1_->SetWritable(true);
1563 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001565 SendRtp1();
1566 SendRtp2();
1567 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 EXPECT_TRUE(CheckRtp1());
1569 EXPECT_TRUE(CheckRtp2());
1570 EXPECT_TRUE(CheckNoRtp1());
1571 EXPECT_TRUE(CheckNoRtp2());
1572
1573 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001574 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1575 bool asymmetric = true;
1576 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1577 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 EXPECT_TRUE(media_channel1_->sending());
1579
wu@webrtc.org97077a32013-10-25 21:18:33 +00001580 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001581 SendRtp1();
1582 SendRtp2();
1583 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584 EXPECT_TRUE(CheckRtp1());
1585 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001586 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587
1588 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001589 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001590 bool asymmetric = true;
1591 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1592 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001593 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001595 SendRtp1();
1596 SendRtp2();
1597 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 EXPECT_TRUE(CheckRtp1());
1599 EXPECT_TRUE(CheckRtp2());
1600 EXPECT_TRUE(CheckNoRtp1());
1601 EXPECT_TRUE(CheckNoRtp2());
1602 }
1603
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001604 void SendBundleToBundle(
1605 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1606 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001608 // Only pl_type1 was added to the bundle filter for both |channel1_|
1609 // and |channel2_|.
1610 int pl_type1 = pl_types[0];
1611 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001612 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001613 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001614 if (rtcp_mux) {
1615 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001616 }
1617 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001619 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1620 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001622 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1623 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
zstein3dcf0e92017-06-01 13:22:42 -07001624 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1625 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1626 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1627 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001628
1629 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1631 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1632 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001633 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001634 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1635 EXPECT_TRUE(CheckNoRtp1());
1636 EXPECT_TRUE(CheckNoRtp2());
1637
1638 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1640 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1641 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001642 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001643 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645 SendCustomRtcp1(kSsrc1);
1646 SendCustomRtcp2(kSsrc2);
1647 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1649 EXPECT_TRUE(CheckNoRtcp1());
1650 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1651 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653 SendCustomRtcp1(kSsrc2);
1654 SendCustomRtcp2(kSsrc1);
1655 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001656 // Bundle filter shouldn't filter out any RTCP.
1657 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1658 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 }
1660
deadbeefc6b6e092016-12-01 12:49:20 -08001661 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 CreateChannels(0, 0);
1664 EXPECT_TRUE(SendInitiate());
1665 EXPECT_TRUE(SendAccept());
1666 channel1_->StartMediaMonitor(100);
1667 channel2_->StartMediaMonitor(100);
1668 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001669 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1670 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 channel1_->StopMediaMonitor();
1672 channel2_->StopMediaMonitor();
1673 // Ensure a restart of a stopped monitor works.
1674 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001675 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 channel1_->StopMediaMonitor();
1677 // Ensure stopping a stopped monitor is OK.
1678 channel1_->StopMediaMonitor();
1679 }
1680
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 void TestSetContentFailure() {
1682 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683
Peter Thatchera6d24442015-07-09 21:26:36 -07001684 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001685 std::unique_ptr<typename T::Content> content(
1686 CreateMediaContentWithStream(1));
1687
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001689 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001690 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001691 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001692 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001695 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001696 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001697
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001699 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001700 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 }
1702
1703 void TestSendTwoOffers() {
1704 CreateChannels(0, 0);
1705
Peter Thatchera6d24442015-07-09 21:26:36 -07001706 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001707 std::unique_ptr<typename T::Content> content1(
1708 CreateMediaContentWithStream(1));
1709 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001710 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1712
Steve Anton18ee1d52017-09-11 11:32:35 -07001713 std::unique_ptr<typename T::Content> content2(
1714 CreateMediaContentWithStream(2));
1715 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001716 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1718 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1719 }
1720
1721 void TestReceiveTwoOffers() {
1722 CreateChannels(0, 0);
1723
Peter Thatchera6d24442015-07-09 21:26:36 -07001724 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001725 std::unique_ptr<typename T::Content> content1(
1726 CreateMediaContentWithStream(1));
1727 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001728 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1730
Steve Anton18ee1d52017-09-11 11:32:35 -07001731 std::unique_ptr<typename T::Content> content2(
1732 CreateMediaContentWithStream(2));
1733 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001734 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1736 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1737 }
1738
1739 void TestSendPrAnswer() {
1740 CreateChannels(0, 0);
1741
Peter Thatchera6d24442015-07-09 21:26:36 -07001742 std::string err;
1743 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001744 std::unique_ptr<typename T::Content> content1(
1745 CreateMediaContentWithStream(1));
1746 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001747 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1749
Peter Thatchera6d24442015-07-09 21:26:36 -07001750 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001751 std::unique_ptr<typename T::Content> content2(
1752 CreateMediaContentWithStream(2));
1753 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001754 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1756 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1757
Peter Thatchera6d24442015-07-09 21:26:36 -07001758 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001759 std::unique_ptr<typename T::Content> content3(
1760 CreateMediaContentWithStream(3));
1761 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001762 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1764 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1765 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1766 }
1767
1768 void TestReceivePrAnswer() {
1769 CreateChannels(0, 0);
1770
Peter Thatchera6d24442015-07-09 21:26:36 -07001771 std::string err;
1772 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001773 std::unique_ptr<typename T::Content> content1(
1774 CreateMediaContentWithStream(1));
1775 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001776 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1778
Peter Thatchera6d24442015-07-09 21:26:36 -07001779 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001780 std::unique_ptr<typename T::Content> content2(
1781 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001782 EXPECT_TRUE(
1783 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1785 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1786
Peter Thatchera6d24442015-07-09 21:26:36 -07001787 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001788 std::unique_ptr<typename T::Content> content3(
1789 CreateMediaContentWithStream(3));
1790 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001791 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1793 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1794 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1795 }
1796
1797 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001798 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 EXPECT_TRUE(SendInitiate());
1800 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001801 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1802 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803
1804 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001805 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 // The sending message is only posted. channel2_ should be empty.
1807 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1809 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810
1811 // When channel1_ is deleted, the RTCP packet should be sent out to
1812 // channel2_.
1813 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 EXPECT_TRUE(CheckRtcp2());
1816 }
1817
zstein56162b92017-04-24 16:54:35 -07001818 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001819 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821
zstein56162b92017-04-24 16:54:35 -07001822 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 EXPECT_TRUE(media_channel1_->ready_to_send());
1825
zstein56162b92017-04-24 16:54:35 -07001826 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 }
1830
zstein56162b92017-04-24 16:54:35 -07001831 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001832 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 typename T::Content content;
1834 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001835 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08001837 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001838 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -08001839 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001840 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1841 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 EXPECT_FALSE(media_channel1_->ready_to_send());
1843 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1844 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001845 network_thread_->Invoke<void>(RTC_FROM_HERE,
1846 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849
zstein56162b92017-04-24 16:54:35 -07001850 // TODO(zstein): Find a way to test this without making
1851 // OnTransportReadyToSend public.
1852 network_thread_->Invoke<void>(
1853 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001854 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 EXPECT_FALSE(media_channel1_->ready_to_send());
1856 }
1857
skvladdc1c62c2016-03-16 19:07:43 -07001858 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1859 typename T::Content content;
1860 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1861 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001862 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001863 }
1864
deadbeefe702b302017-02-04 12:09:01 -08001865 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001866 webrtc::RtpParameters parameters;
1867 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001868 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001869 parameters.encodings.push_back(encoding);
1870 return parameters;
1871 }
1872
1873 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001874 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001875 EXPECT_EQ(1UL, parameters.encodings.size());
1876 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1877 }
1878
1879 void DefaultMaxBitrateIsUnlimited() {
1880 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001881 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1882 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001883 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001884 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001885 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001886 }
1887
1888 void CanChangeMaxBitrate() {
1889 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001890 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1891 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001892
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001893 EXPECT_TRUE(channel1_->SetRtpSendParameters(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001894 kSsrc1, BitrateLimitedParameters(1000)));
1895 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), 1000);
1896 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1), 1000);
skvladdc1c62c2016-03-16 19:07:43 -07001897 EXPECT_EQ(-1, media_channel1_->max_bps());
1898
deadbeefe702b302017-02-04 12:09:01 -08001899 EXPECT_TRUE(channel1_->SetRtpSendParameters(
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001900 kSsrc1, BitrateLimitedParameters(rtc::nullopt)));
1901 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1), rtc::nullopt);
deadbeefe702b302017-02-04 12:09:01 -08001902 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001903 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001904 EXPECT_EQ(-1, media_channel1_->max_bps());
1905 }
1906
Steve Anton8a63f782017-10-23 13:08:53 -07001907 // Test that when a channel gets new transports with a call to
1908 // |SetTransports|, the socket options from the old transports are merged with
1909 // the options on the new transport.
1910 // For example, audio and video may use separate socket options, but initially
1911 // be unbundled, then later become bundled. When this happens, their preferred
1912 // socket options should be merged to the underlying transport they share.
1913 void SocketOptionsMergedOnSetTransport() {
1914 constexpr int kSndBufSize = 4000;
1915 constexpr int kRcvBufSize = 8000;
1916
1917 CreateChannels(0, 0);
1918
1919 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1920 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1921 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1922 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1923
1924 channel1_->SetTransports(channel2_->rtp_dtls_transport(),
1925 channel2_->rtcp_dtls_transport());
1926
1927 int option_val;
1928 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1929 rtc::Socket::Option::OPT_SNDBUF, &option_val));
1930 EXPECT_EQ(kSndBufSize, option_val);
1931 ASSERT_TRUE(channel1_->rtp_dtls_transport()->GetOption(
1932 rtc::Socket::Option::OPT_RCVBUF, &option_val));
1933 EXPECT_EQ(kRcvBufSize, option_val);
1934 }
1935
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001937 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1938 static void ProcessThreadQueue(rtc::Thread* thread) {
1939 RTC_DCHECK(thread->IsCurrent());
1940 while (!thread->empty()) {
1941 thread->ProcessMessages(0);
1942 }
1943 }
1944 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1945 // |threads| and current thread post packets to network thread.
1946 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001947 thread->Invoke<void>(RTC_FROM_HERE,
1948 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949 }
1950 ProcessThreadQueue(rtc::Thread::Current());
1951 // Network thread move them around and post back to worker = current thread.
1952 if (!network_thread_->IsCurrent()) {
1953 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001954 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955 }
1956 // Worker thread = current Thread process received messages.
1957 ProcessThreadQueue(rtc::Thread::Current());
1958 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001959 // TODO(pbos): Remove playout from all media channels and let renderers mute
1960 // themselves.
1961 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1963 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001964 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1965 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1966 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1967 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1968 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1969 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1970 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1971 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 cricket::FakeMediaEngine media_engine_;
1973 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001974 typename T::MediaChannel* media_channel1_ = nullptr;
1975 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001976 std::unique_ptr<typename T::Channel> channel1_;
1977 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 typename T::Content local_media_content1_;
1979 typename T::Content local_media_content2_;
1980 typename T::Content remote_media_content1_;
1981 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983 rtc::Buffer rtp_packet_;
1984 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001985 int media_info_callbacks1_ = 0;
1986 int media_info_callbacks2_ = 0;
1987 int rtcp_mux_activated_callbacks1_ = 0;
1988 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001989 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001990};
1991
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992template<>
1993void ChannelTest<VoiceTraits>::CreateContent(
1994 int flags,
1995 const cricket::AudioCodec& audio_codec,
1996 const cricket::VideoCodec& video_codec,
1997 cricket::AudioContentDescription* audio) {
1998 audio->AddCodec(audio_codec);
1999 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002000 if ((flags & SECURE) && !(flags & DTLS)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002002 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2003 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002004 }
2005}
2006
2007template<>
2008void ChannelTest<VoiceTraits>::CopyContent(
2009 const cricket::AudioContentDescription& source,
2010 cricket::AudioContentDescription* audio) {
2011 *audio = source;
2012}
2013
2014template<>
2015bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2016 const cricket::AudioCodec& c2) {
2017 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2018 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2019}
2020
Peter Boström0c4e06b2015-10-07 12:23:21 +02002021template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002023 uint32_t ssrc,
2024 int flags,
2025 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 audio->AddLegacyStream(ssrc);
2027}
2028
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002029class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 public:
solenberg1dd98f32015-09-10 01:57:14 -07002031 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002032 VoiceChannelSingleThreadTest()
2033 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2034};
2035
2036class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2037 public:
2038 typedef ChannelTest<VoiceTraits> Base;
2039 VoiceChannelDoubleThreadTest()
2040 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041};
2042
jbauch5869f502017-06-29 12:31:36 -07002043class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
2044 : public ChannelTest<VoiceTraits> {
2045 public:
2046 typedef ChannelTest<VoiceTraits> Base;
2047 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
2048 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2049 NetworkIsWorker::Yes) {}
2050};
2051
2052class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
2053 : public ChannelTest<VoiceTraits> {
2054 public:
2055 typedef ChannelTest<VoiceTraits> Base;
2056 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
2057 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
2058 NetworkIsWorker::No) {}
2059};
2060
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002061// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002062template <>
Steve Anton8699a322017-11-06 15:53:33 -08002063std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002064 rtc::Thread* worker_thread,
2065 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002066 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002067 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08002068 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2069 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002070 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2071 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002072 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002073 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002074 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
2075 worker_thread, network_thread, signaling_thread, std::move(ch),
2076 cricket::CN_VIDEO, (flags & RTCP_MUX_REQUIRED) != 0,
2077 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002078 if (!channel->NeedsRtcpTransport()) {
2079 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002080 }
Steve Anton8699a322017-11-06 15:53:33 -08002081 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2082 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 return channel;
2084}
2085
2086// override to add 0 parameter
2087template<>
2088bool ChannelTest<VideoTraits>::AddStream1(int id) {
2089 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2090}
2091
2092template<>
2093void ChannelTest<VideoTraits>::CreateContent(
2094 int flags,
2095 const cricket::AudioCodec& audio_codec,
2096 const cricket::VideoCodec& video_codec,
2097 cricket::VideoContentDescription* video) {
2098 video->AddCodec(video_codec);
2099 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2100 if (flags & SECURE) {
2101 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002102 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2103 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 }
2105}
2106
2107template<>
2108void ChannelTest<VideoTraits>::CopyContent(
2109 const cricket::VideoContentDescription& source,
2110 cricket::VideoContentDescription* video) {
2111 *video = source;
2112}
2113
2114template<>
2115bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2116 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002117 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118}
2119
Peter Boström0c4e06b2015-10-07 12:23:21 +02002120template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002121void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002122 uint32_t ssrc,
2123 int flags,
2124 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125 video->AddLegacyStream(ssrc);
2126}
2127
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002128class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 public:
solenberg1dd98f32015-09-10 01:57:14 -07002130 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002131 VideoChannelSingleThreadTest()
2132 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133};
2134
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002135class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2136 public:
2137 typedef ChannelTest<VideoTraits> Base;
2138 VideoChannelDoubleThreadTest()
2139 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2140};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02002142TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 Base::TestInit();
2144 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2145 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2146}
2147
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002148TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2149 Base::TestDeinit();
2150}
2151
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002152TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 Base::TestSetContents();
2154}
2155
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002156TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157 Base::TestSetContentsNullOffer();
2158}
2159
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002160TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161 Base::TestSetContentsRtcpMux();
2162}
2163
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002164TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165 Base::TestSetContentsRtcpMux();
2166}
2167
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002168TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002169 Base::TestStreams();
2170}
2171
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002172TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 Base::TestChangeStreamParamsInContent();
2174}
2175
jbauch5869f502017-06-29 12:31:36 -07002176TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2177 TestChangeEncryptedHeaderExtensionsDtls) {
2178 int flags = DTLS;
2179 Base::TestChangeEncryptedHeaderExtensions(flags);
2180}
2181
2182TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2183 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2184 int flags = DTLS;
2185 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2186}
2187
2188TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2189 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2190 int flags = DTLS;
2191 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2192}
2193
2194TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2195 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2196 int flags = DTLS | GCM_CIPHER;
2197 Base::TestChangeEncryptedHeaderExtensions(flags);
2198}
2199
2200TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2201 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2202 int flags = DTLS | GCM_CIPHER;
2203 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2204}
2205
2206TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2207 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2208 int flags = DTLS | GCM_CIPHER;
2209 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2210}
2211
2212TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
2213 TestChangeEncryptedHeaderExtensionsSDES) {
2214 int flags = 0;
2215 Base::TestChangeEncryptedHeaderExtensions(flags);
2216}
2217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002218TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002219 Base::TestPlayoutAndSendingStates();
2220}
2221
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002222TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002223 CreateChannels(0, 0);
2224 // Test that we can Mute the default channel even though the sending SSRC
2225 // is unknown.
2226 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002227 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002228 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2229 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002230 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2231
2232 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002233 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002234
2235 SendInitiate();
2236 // After the local session description has been set, we can mute a stream
2237 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002238 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002239 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2240 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002241 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242}
2243
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 Base::TestMediaContentDirection();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002249 Base::TestNetworkRouteChanges();
2250}
2251
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002252TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 Base::TestCallSetup();
2254}
2255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 Base::TestCallTeardownRtcpMux();
2258}
2259
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002260TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 Base::SendRtpToRtp();
2262}
2263
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002264TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002265 Base::SendRtcpToRtcp();
2266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269 Base::SendRtcpMuxToRtcp();
2270}
2271
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002272TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 Base::SendRtcpMuxToRtcpMux();
2274}
2275
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002277 Base::SendRequireRtcpMuxToRtcpMux();
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002281 Base::SendRtcpMuxToRequireRtcpMux();
2282}
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002285 Base::SendRequireRtcpMuxToRequireRtcpMux();
2286}
2287
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002288TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002289 Base::SendRequireRtcpMuxToNoRtcpMux();
2290}
2291
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002292TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293 Base::SendEarlyRtcpMuxToRtcp();
2294}
2295
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002296TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297 Base::SendEarlyRtcpMuxToRtcpMux();
2298}
2299
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002300TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2302}
2303
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002304TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 Base::SendSrtpToSrtp();
2306}
2307
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2310}
2311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002312TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002313 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314}
2315
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002316TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317 Base::SendSrtpToSrtp(DTLS, DTLS);
2318}
2319
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002320TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2322}
2323
deadbeeff5346592017-01-24 21:51:21 -08002324// Test using the channel with a raw packet interface, as opposed to a DTLS
2325// transport interface.
2326TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2327 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2328}
2329
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002330TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2332}
2333
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002334TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 Base::SendRtpToRtpOnThread();
2336}
2337
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002338TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 Base::SendSrtpToSrtpOnThread();
2340}
2341
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002342TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343 Base::SendWithWritabilityLoss();
2344}
2345
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002346TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 Base::TestMediaMonitor();
2348}
2349
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002351TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 CreateChannels(0, 0);
2353 EXPECT_TRUE(SendInitiate());
2354 EXPECT_TRUE(SendAccept());
2355 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2356
solenberg1d63dd02015-12-02 12:35:09 -08002357 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2358 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2359 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002361 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002363 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002364 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002365 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002366 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002367 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368}
2369
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002370TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 Base::TestSetContentFailure();
2372}
2373
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002374TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 Base::TestSendTwoOffers();
2376}
2377
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002378TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379 Base::TestReceiveTwoOffers();
2380}
2381
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002382TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383 Base::TestSendPrAnswer();
2384}
2385
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002386TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 Base::TestReceivePrAnswer();
2388}
2389
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002390TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 Base::TestFlushRtcp();
2392}
2393
zstein56162b92017-04-24 16:54:35 -07002394TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2395 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396}
2397
zstein56162b92017-04-24 16:54:35 -07002398TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2399 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400}
2401
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002404 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405 EXPECT_TRUE(SendInitiate());
2406 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002407 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408
solenberg4bac9c52015-10-09 02:32:53 -07002409 // Default is (1.0).
2410 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2411 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002413 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414
solenberg4bac9c52015-10-09 02:32:53 -07002415 // Set scale to (1.5).
2416 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2417 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2418 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419
solenberg4bac9c52015-10-09 02:32:53 -07002420 // Set scale to (0).
2421 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2422 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2423 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002424}
2425
2426// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002428 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 EXPECT_TRUE(SendInitiate());
2430 EXPECT_TRUE(SendAccept());
2431 EXPECT_TRUE(AddStream1(1));
2432 EXPECT_TRUE(AddStream1(2));
2433
solenberg4bac9c52015-10-09 02:32:53 -07002434 double volume;
2435 // Default is (1.0).
2436 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2437 EXPECT_DOUBLE_EQ(1.0, volume);
2438 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2439 EXPECT_DOUBLE_EQ(1.0, volume);
2440 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2441 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002443 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444
solenberg4bac9c52015-10-09 02:32:53 -07002445 // Set scale to (1.5) for ssrc = 1.
2446 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2447 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2448 EXPECT_DOUBLE_EQ(1.5, volume);
2449 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2450 EXPECT_DOUBLE_EQ(1.0, volume);
2451 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2452 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453
solenberg4bac9c52015-10-09 02:32:53 -07002454 // Set scale to (0) for all ssrcs.
2455 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2456 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2457 EXPECT_DOUBLE_EQ(0.0, volume);
2458 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2459 EXPECT_DOUBLE_EQ(0.0, volume);
2460 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2461 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462}
2463
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002464TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002465 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466}
2467
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002468TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002469 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002470}
2471
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002472TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002473 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002474}
2475
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002476TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002477 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478}
2479
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002480TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002481 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002482}
2483
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002484TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002485 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002486}
2487
Steve Anton8a63f782017-10-23 13:08:53 -07002488TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2489 Base::SocketOptionsMergedOnSetTransport();
2490}
2491
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002492// VoiceChannelDoubleThreadTest
2493TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002495 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2496 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497}
2498
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002499TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2500 Base::TestDeinit();
2501}
2502
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002503TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestSetContents();
2505}
2506
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002507TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 Base::TestSetContentsNullOffer();
2509}
2510
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002511TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 Base::TestSetContentsRtcpMux();
2513}
2514
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002515TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 Base::TestSetContentsRtcpMux();
2517}
2518
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002519TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 Base::TestStreams();
2521}
2522
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002523TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 Base::TestChangeStreamParamsInContent();
2525}
2526
jbauch5869f502017-06-29 12:31:36 -07002527TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2528 TestChangeEncryptedHeaderExtensionsDtls) {
2529 int flags = DTLS;
2530 Base::TestChangeEncryptedHeaderExtensions(flags);
2531}
2532
2533TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2534 TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
2535 int flags = DTLS;
2536 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2537}
2538
2539TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2540 TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
2541 int flags = DTLS;
2542 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2543}
2544
2545TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2546 TestChangeEncryptedHeaderExtensionsDtlsGcm) {
2547 int flags = DTLS | GCM_CIPHER;
2548 Base::TestChangeEncryptedHeaderExtensions(flags);
2549}
2550
2551TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2552 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
2553 int flags = DTLS | GCM_CIPHER;
2554 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
2555}
2556
2557TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2558 TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
2559 int flags = DTLS | GCM_CIPHER;
2560 Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
2561}
2562
2563TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
2564 TestChangeEncryptedHeaderExtensionsSDES) {
2565 int flags = 0;
2566 Base::TestChangeEncryptedHeaderExtensions(flags);
2567}
2568
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002569TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570 Base::TestPlayoutAndSendingStates();
2571}
2572
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002573TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2574 CreateChannels(0, 0);
2575 // Test that we can Mute the default channel even though the sending SSRC
2576 // is unknown.
2577 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2578 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2579 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2580 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2581 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2582
2583 // Test that we can not mute an unknown SSRC.
2584 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2585
2586 SendInitiate();
2587 // After the local session description has been set, we can mute a stream
2588 // with its SSRC.
2589 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2590 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2591 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2592 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2593}
2594
2595TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2596 Base::TestMediaContentDirection();
2597}
2598
2599TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2600 Base::TestNetworkRouteChanges();
2601}
2602
2603TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2604 Base::TestCallSetup();
2605}
2606
2607TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2608 Base::TestCallTeardownRtcpMux();
2609}
2610
2611TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2612 Base::SendRtpToRtp();
2613}
2614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002615TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2616 Base::SendRtcpToRtcp();
2617}
2618
2619TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2620 Base::SendRtcpMuxToRtcp();
2621}
2622
2623TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2624 Base::SendRtcpMuxToRtcpMux();
2625}
2626
2627TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2628 Base::SendRequireRtcpMuxToRtcpMux();
2629}
2630
2631TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2632 Base::SendRtcpMuxToRequireRtcpMux();
2633}
2634
2635TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2636 Base::SendRequireRtcpMuxToRequireRtcpMux();
2637}
2638
2639TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2640 Base::SendRequireRtcpMuxToNoRtcpMux();
2641}
2642
2643TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2644 Base::SendEarlyRtcpMuxToRtcp();
2645}
2646
2647TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2648 Base::SendEarlyRtcpMuxToRtcpMux();
2649}
2650
2651TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2652 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2653}
2654
2655TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2656 Base::SendSrtpToSrtp();
2657}
2658
2659TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2660 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2661}
2662
2663TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002664 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002665}
2666
2667TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002668 Base::SendSrtpToSrtp(DTLS, DTLS);
2669}
2670
2671TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002672 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2673}
2674
deadbeeff5346592017-01-24 21:51:21 -08002675// Test using the channel with a raw packet interface, as opposed to a DTLS
2676// transport interface.
2677TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2678 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2679}
2680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002681TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2682 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2683}
2684
2685TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2686 Base::SendRtpToRtpOnThread();
2687}
2688
2689TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2690 Base::SendSrtpToSrtpOnThread();
2691}
2692
2693TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2694 Base::SendWithWritabilityLoss();
2695}
2696
2697TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2698 Base::TestMediaMonitor();
2699}
2700
2701// Test that InsertDtmf properly forwards to the media channel.
2702TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2703 CreateChannels(0, 0);
2704 EXPECT_TRUE(SendInitiate());
2705 EXPECT_TRUE(SendAccept());
2706 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2707
2708 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2709 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2710 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2711
2712 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2713 EXPECT_TRUE(
2714 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2715 EXPECT_TRUE(
2716 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2717 EXPECT_TRUE(
2718 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2719}
2720
2721TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2722 Base::TestSetContentFailure();
2723}
2724
2725TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2726 Base::TestSendTwoOffers();
2727}
2728
2729TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2730 Base::TestReceiveTwoOffers();
2731}
2732
2733TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2734 Base::TestSendPrAnswer();
2735}
2736
2737TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2738 Base::TestReceivePrAnswer();
2739}
2740
2741TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2742 Base::TestFlushRtcp();
2743}
2744
zstein56162b92017-04-24 16:54:35 -07002745TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2746 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002747}
2748
zstein56162b92017-04-24 16:54:35 -07002749TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2750 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002751}
2752
2753// Test that we can scale the output volume properly for 1:1 calls.
2754TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002755 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002756 EXPECT_TRUE(SendInitiate());
2757 EXPECT_TRUE(SendAccept());
2758 double volume;
2759
2760 // Default is (1.0).
2761 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2762 EXPECT_DOUBLE_EQ(1.0, volume);
2763 // invalid ssrc.
2764 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2765
2766 // Set scale to (1.5).
2767 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2768 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2769 EXPECT_DOUBLE_EQ(1.5, volume);
2770
2771 // Set scale to (0).
2772 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2773 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2774 EXPECT_DOUBLE_EQ(0.0, volume);
2775}
2776
2777// Test that we can scale the output volume properly for multiway calls.
2778TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002779 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002780 EXPECT_TRUE(SendInitiate());
2781 EXPECT_TRUE(SendAccept());
2782 EXPECT_TRUE(AddStream1(1));
2783 EXPECT_TRUE(AddStream1(2));
2784
2785 double volume;
2786 // Default is (1.0).
2787 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2788 EXPECT_DOUBLE_EQ(1.0, volume);
2789 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2790 EXPECT_DOUBLE_EQ(1.0, volume);
2791 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2792 EXPECT_DOUBLE_EQ(1.0, volume);
2793 // invalid ssrc.
2794 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2795
2796 // Set scale to (1.5) for ssrc = 1.
2797 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2798 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2799 EXPECT_DOUBLE_EQ(1.5, volume);
2800 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2801 EXPECT_DOUBLE_EQ(1.0, volume);
2802 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2803 EXPECT_DOUBLE_EQ(1.0, volume);
2804
2805 // Set scale to (0) for all ssrcs.
2806 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2807 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2808 EXPECT_DOUBLE_EQ(0.0, volume);
2809 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2810 EXPECT_DOUBLE_EQ(0.0, volume);
2811 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2812 EXPECT_DOUBLE_EQ(0.0, volume);
2813}
2814
2815TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2816 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2817}
2818
2819TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2820 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2821}
2822
2823TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2824 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2825}
2826
2827TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2828 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2829}
2830
2831TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2832 Base::DefaultMaxBitrateIsUnlimited();
2833}
2834
2835TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2836 Base::CanChangeMaxBitrate();
2837}
2838
Steve Anton8a63f782017-10-23 13:08:53 -07002839TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2840 Base::SocketOptionsMergedOnSetTransport();
2841}
2842
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002843// VideoChannelSingleThreadTest
2844TEST_F(VideoChannelSingleThreadTest, TestInit) {
2845 Base::TestInit();
2846}
2847
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002848TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2849 Base::TestDeinit();
2850}
2851
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002852TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2853 Base::TestSetContents();
2854}
2855
2856TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2857 Base::TestSetContentsNullOffer();
2858}
2859
2860TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2861 Base::TestSetContentsRtcpMux();
2862}
2863
2864TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2865 Base::TestSetContentsRtcpMux();
2866}
2867
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002868TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2869 Base::TestStreams();
2870}
2871
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002872TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2873 Base::TestChangeStreamParamsInContent();
2874}
2875
2876TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2877 Base::TestPlayoutAndSendingStates();
2878}
2879
2880TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002881 CreateChannels(0, 0);
2882 // Test that we can Mute the default channel even though the sending SSRC
2883 // is unknown.
2884 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002885 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002886 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002887 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002888 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2889 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002890 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002891 SendInitiate();
2892 // After the local session description has been set, we can mute a stream
2893 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002894 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002895 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002896 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002897 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898}
2899
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002900TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901 Base::TestMediaContentDirection();
2902}
2903
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002904TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002905 Base::TestNetworkRouteChanges();
2906}
2907
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002908TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 Base::TestCallSetup();
2910}
2911
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002912TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913 Base::TestCallTeardownRtcpMux();
2914}
2915
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002916TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 Base::SendRtpToRtp();
2918}
2919
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002920TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 Base::SendRtcpToRtcp();
2922}
2923
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002924TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925 Base::SendRtcpMuxToRtcp();
2926}
2927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002928TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 Base::SendRtcpMuxToRtcpMux();
2930}
2931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002932TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002933 Base::SendRequireRtcpMuxToRtcpMux();
2934}
2935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002936TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002937 Base::SendRtcpMuxToRequireRtcpMux();
2938}
2939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002940TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002941 Base::SendRequireRtcpMuxToRequireRtcpMux();
2942}
2943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002944TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002945 Base::SendRequireRtcpMuxToNoRtcpMux();
2946}
2947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002948TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949 Base::SendEarlyRtcpMuxToRtcp();
2950}
2951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002952TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 Base::SendEarlyRtcpMuxToRtcpMux();
2954}
2955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002956TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 Base::SendSrtpToSrtp();
2958}
2959
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002960TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 Base::SendSrtpToSrtp();
2962}
2963
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002964TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08002965 Base::SendDtlsToSdesNotSupported();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002966}
2967
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002968TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969 Base::SendSrtpToSrtp(DTLS, DTLS);
2970}
2971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002972TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2974}
2975
deadbeeff5346592017-01-24 21:51:21 -08002976// Test using the channel with a raw packet interface, as opposed to a DTLS
2977// transport interface.
2978TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2979 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2980}
2981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002982TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002983 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2984}
2985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002986TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2988}
2989
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002990TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991 Base::SendRtpToRtpOnThread();
2992}
2993
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002994TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995 Base::SendSrtpToSrtpOnThread();
2996}
2997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002998TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999 Base::SendWithWritabilityLoss();
3000}
3001
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003002TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 Base::TestMediaMonitor();
3004}
3005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003006TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003007 Base::TestSetContentFailure();
3008}
3009
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003010TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003011 Base::TestSendTwoOffers();
3012}
3013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003014TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003015 Base::TestReceiveTwoOffers();
3016}
3017
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003018TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003019 Base::TestSendPrAnswer();
3020}
3021
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003022TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003023 Base::TestReceivePrAnswer();
3024}
3025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003026TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003027 Base::TestFlushRtcp();
3028}
3029
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003030TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08003031 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032}
3033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003034TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003035 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003036}
3037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003038TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08003039 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00003040}
3041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003042TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08003043 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044}
3045
zstein56162b92017-04-24 16:54:35 -07003046TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
3047 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003048}
3049
zstein56162b92017-04-24 16:54:35 -07003050TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3051 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003052}
3053
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003054TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003055 Base::DefaultMaxBitrateIsUnlimited();
3056}
3057
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003058TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003059 Base::CanChangeMaxBitrate();
3060}
3061
Steve Anton8a63f782017-10-23 13:08:53 -07003062TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3063 Base::SocketOptionsMergedOnSetTransport();
3064}
3065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003066// VideoChannelDoubleThreadTest
3067TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3068 Base::TestInit();
3069}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003071TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3072 Base::TestDeinit();
3073}
3074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003075TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3076 Base::TestSetContents();
3077}
3078
3079TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3080 Base::TestSetContentsNullOffer();
3081}
3082
3083TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3084 Base::TestSetContentsRtcpMux();
3085}
3086
3087TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3088 Base::TestSetContentsRtcpMux();
3089}
3090
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003091TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3092 Base::TestStreams();
3093}
3094
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003095TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3096 Base::TestChangeStreamParamsInContent();
3097}
3098
3099TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3100 Base::TestPlayoutAndSendingStates();
3101}
3102
3103TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3104 CreateChannels(0, 0);
3105 // Test that we can Mute the default channel even though the sending SSRC
3106 // is unknown.
3107 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003108 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003109 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003110 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003111 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3112 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003113 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003114 SendInitiate();
3115 // After the local session description has been set, we can mute a stream
3116 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003117 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003118 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003119 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003120 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3121}
3122
3123TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3124 Base::TestMediaContentDirection();
3125}
3126
3127TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3128 Base::TestNetworkRouteChanges();
3129}
3130
3131TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3132 Base::TestCallSetup();
3133}
3134
3135TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3136 Base::TestCallTeardownRtcpMux();
3137}
3138
3139TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3140 Base::SendRtpToRtp();
3141}
3142
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003143TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3144 Base::SendRtcpToRtcp();
3145}
3146
3147TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3148 Base::SendRtcpMuxToRtcp();
3149}
3150
3151TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3152 Base::SendRtcpMuxToRtcpMux();
3153}
3154
3155TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3156 Base::SendRequireRtcpMuxToRtcpMux();
3157}
3158
3159TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3160 Base::SendRtcpMuxToRequireRtcpMux();
3161}
3162
3163TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3164 Base::SendRequireRtcpMuxToRequireRtcpMux();
3165}
3166
3167TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3168 Base::SendRequireRtcpMuxToNoRtcpMux();
3169}
3170
3171TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3172 Base::SendEarlyRtcpMuxToRtcp();
3173}
3174
3175TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3176 Base::SendEarlyRtcpMuxToRtcpMux();
3177}
3178
3179TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3180 Base::SendSrtpToSrtp();
3181}
3182
3183TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3184 Base::SendSrtpToSrtp();
3185}
3186
3187TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Zhi Huangcd3fc5d2017-11-29 10:41:57 -08003188 Base::SendDtlsToSdesNotSupported();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003189}
3190
3191TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003192 Base::SendSrtpToSrtp(DTLS, DTLS);
3193}
3194
3195TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003196 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3197}
3198
deadbeeff5346592017-01-24 21:51:21 -08003199// Test using the channel with a raw packet interface, as opposed to a DTLS
3200// transport interface.
3201TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3202 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3203}
3204
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003205TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3206 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3207}
3208
3209TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3210 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3211}
3212
3213TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3214 Base::SendRtpToRtpOnThread();
3215}
3216
3217TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3218 Base::SendSrtpToSrtpOnThread();
3219}
3220
3221TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3222 Base::SendWithWritabilityLoss();
3223}
3224
3225TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3226 Base::TestMediaMonitor();
3227}
3228
3229TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3230 Base::TestSetContentFailure();
3231}
3232
3233TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3234 Base::TestSendTwoOffers();
3235}
3236
3237TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3238 Base::TestReceiveTwoOffers();
3239}
3240
3241TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3242 Base::TestSendPrAnswer();
3243}
3244
3245TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3246 Base::TestReceivePrAnswer();
3247}
3248
3249TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3250 Base::TestFlushRtcp();
3251}
3252
3253TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3254 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3255}
3256
3257TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3258 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3259}
3260
3261TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3262 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3263}
3264
3265TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3266 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3267}
3268
zstein56162b92017-04-24 16:54:35 -07003269TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3270 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003271}
3272
zstein56162b92017-04-24 16:54:35 -07003273TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3274 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003275}
3276
3277TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3278 Base::DefaultMaxBitrateIsUnlimited();
3279}
3280
3281TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3282 Base::CanChangeMaxBitrate();
3283}
3284
Steve Anton8a63f782017-10-23 13:08:53 -07003285TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3286 Base::SocketOptionsMergedOnSetTransport();
3287}
3288
deadbeef953c2ce2017-01-09 14:53:41 -08003289// RtpDataChannelSingleThreadTest
3290class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003291 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003292 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003293 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003294 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3295};
3296
deadbeef953c2ce2017-01-09 14:53:41 -08003297// RtpDataChannelDoubleThreadTest
3298class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003299 public:
3300 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003301 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003302 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003303};
3304
3305// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003306template <>
Steve Anton8699a322017-11-06 15:53:33 -08003307std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003308 rtc::Thread* worker_thread,
3309 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003310 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08003311 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
deadbeeff5346592017-01-24 21:51:21 -08003312 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3313 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003314 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3315 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003316 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003317 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08003318 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
3319 worker_thread, network_thread, signaling_thread, std::move(ch),
3320 cricket::CN_DATA, (flags & RTCP_MUX_REQUIRED) != 0,
3321 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003322 if (!channel->NeedsRtcpTransport()) {
3323 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003324 }
Steve Anton8699a322017-11-06 15:53:33 -08003325 channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3326 fake_rtp_packet_transport, fake_rtcp_packet_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003327 return channel;
3328}
3329
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003330template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003331void ChannelTest<DataTraits>::CreateContent(
3332 int flags,
3333 const cricket::AudioCodec& audio_codec,
3334 const cricket::VideoCodec& video_codec,
3335 cricket::DataContentDescription* data) {
3336 data->AddCodec(kGoogleDataCodec);
3337 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3338 if (flags & SECURE) {
3339 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003340 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3341 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003342 }
3343}
3344
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003345template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003346void ChannelTest<DataTraits>::CopyContent(
3347 const cricket::DataContentDescription& source,
3348 cricket::DataContentDescription* data) {
3349 *data = source;
3350}
3351
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003352template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003353bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3354 const cricket::DataCodec& c2) {
3355 return c1.name == c2.name;
3356}
3357
Peter Boström0c4e06b2015-10-07 12:23:21 +02003358template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003359void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003360 uint32_t ssrc,
3361 int flags,
3362 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003363 data->AddLegacyStream(ssrc);
3364}
3365
deadbeef953c2ce2017-01-09 14:53:41 -08003366TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003367 Base::TestInit();
3368 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3369}
3370
deadbeef953c2ce2017-01-09 14:53:41 -08003371TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003372 Base::TestDeinit();
3373}
3374
deadbeef953c2ce2017-01-09 14:53:41 -08003375TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003376 Base::TestSetContents();
3377}
3378
deadbeef953c2ce2017-01-09 14:53:41 -08003379TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003380 Base::TestSetContentsNullOffer();
3381}
3382
deadbeef953c2ce2017-01-09 14:53:41 -08003383TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003384 Base::TestSetContentsRtcpMux();
3385}
3386
deadbeef953c2ce2017-01-09 14:53:41 -08003387TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003388 Base::TestStreams();
3389}
3390
deadbeef953c2ce2017-01-09 14:53:41 -08003391TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003392 Base::TestChangeStreamParamsInContent();
3393}
3394
deadbeef953c2ce2017-01-09 14:53:41 -08003395TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003396 Base::TestPlayoutAndSendingStates();
3397}
3398
deadbeef953c2ce2017-01-09 14:53:41 -08003399TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003400 Base::TestMediaContentDirection();
3401}
3402
deadbeef953c2ce2017-01-09 14:53:41 -08003403TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003404 Base::TestCallSetup();
3405}
3406
deadbeef953c2ce2017-01-09 14:53:41 -08003407TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003408 Base::TestCallTeardownRtcpMux();
3409}
3410
zstein56162b92017-04-24 16:54:35 -07003411TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3412 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003413}
3414
zstein56162b92017-04-24 16:54:35 -07003415TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3416 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003417}
3418
deadbeef953c2ce2017-01-09 14:53:41 -08003419TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003420 Base::SendRtpToRtp();
3421}
3422
deadbeef953c2ce2017-01-09 14:53:41 -08003423TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003424 Base::SendRtcpToRtcp();
3425}
3426
deadbeef953c2ce2017-01-09 14:53:41 -08003427TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003428 Base::SendRtcpMuxToRtcp();
3429}
3430
deadbeef953c2ce2017-01-09 14:53:41 -08003431TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003432 Base::SendRtcpMuxToRtcpMux();
3433}
3434
deadbeef953c2ce2017-01-09 14:53:41 -08003435TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003436 Base::SendEarlyRtcpMuxToRtcp();
3437}
3438
deadbeef953c2ce2017-01-09 14:53:41 -08003439TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003440 Base::SendEarlyRtcpMuxToRtcpMux();
3441}
3442
deadbeef953c2ce2017-01-09 14:53:41 -08003443TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003444 Base::SendSrtpToSrtp();
3445}
3446
deadbeef953c2ce2017-01-09 14:53:41 -08003447TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003448 Base::SendSrtpToSrtp();
3449}
3450
deadbeef953c2ce2017-01-09 14:53:41 -08003451TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003452 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3453}
3454
deadbeef953c2ce2017-01-09 14:53:41 -08003455TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003456 Base::SendRtpToRtpOnThread();
3457}
3458
deadbeef953c2ce2017-01-09 14:53:41 -08003459TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003460 Base::SendSrtpToSrtpOnThread();
3461}
3462
deadbeef953c2ce2017-01-09 14:53:41 -08003463TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003464 Base::SendWithWritabilityLoss();
3465}
3466
deadbeef953c2ce2017-01-09 14:53:41 -08003467TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003468 Base::TestMediaMonitor();
3469}
3470
Steve Anton8a63f782017-10-23 13:08:53 -07003471TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
3472 Base::SocketOptionsMergedOnSetTransport();
3473}
3474
deadbeef953c2ce2017-01-09 14:53:41 -08003475TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003476 CreateChannels(0, 0);
3477 EXPECT_TRUE(SendInitiate());
3478 EXPECT_TRUE(SendAccept());
3479
3480 cricket::SendDataParams params;
3481 params.ssrc = 42;
3482 unsigned char data[] = {'f', 'o', 'o'};
3483 rtc::CopyOnWriteBuffer payload(data, 3);
3484 cricket::SendDataResult result;
3485 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3486 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3487 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3488}
3489
deadbeef953c2ce2017-01-09 14:53:41 -08003490TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003491 Base::TestInit();
3492 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3493}
3494
deadbeef953c2ce2017-01-09 14:53:41 -08003495TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003496 Base::TestDeinit();
3497}
3498
deadbeef953c2ce2017-01-09 14:53:41 -08003499TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003500 Base::TestSetContents();
3501}
3502
deadbeef953c2ce2017-01-09 14:53:41 -08003503TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003504 Base::TestSetContentsNullOffer();
3505}
3506
deadbeef953c2ce2017-01-09 14:53:41 -08003507TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003508 Base::TestSetContentsRtcpMux();
3509}
3510
deadbeef953c2ce2017-01-09 14:53:41 -08003511TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003512 Base::TestStreams();
3513}
3514
deadbeef953c2ce2017-01-09 14:53:41 -08003515TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003516 Base::TestChangeStreamParamsInContent();
3517}
3518
deadbeef953c2ce2017-01-09 14:53:41 -08003519TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003520 Base::TestPlayoutAndSendingStates();
3521}
3522
deadbeef953c2ce2017-01-09 14:53:41 -08003523TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003524 Base::TestMediaContentDirection();
3525}
3526
deadbeef953c2ce2017-01-09 14:53:41 -08003527TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003528 Base::TestCallSetup();
3529}
3530
deadbeef953c2ce2017-01-09 14:53:41 -08003531TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003532 Base::TestCallTeardownRtcpMux();
3533}
3534
zstein56162b92017-04-24 16:54:35 -07003535TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3536 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003537}
3538
zstein56162b92017-04-24 16:54:35 -07003539TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3540 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003541}
3542
deadbeef953c2ce2017-01-09 14:53:41 -08003543TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003544 Base::SendRtpToRtp();
3545}
3546
deadbeef953c2ce2017-01-09 14:53:41 -08003547TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003548 Base::SendRtcpToRtcp();
3549}
3550
deadbeef953c2ce2017-01-09 14:53:41 -08003551TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003552 Base::SendRtcpMuxToRtcp();
3553}
3554
deadbeef953c2ce2017-01-09 14:53:41 -08003555TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003556 Base::SendRtcpMuxToRtcpMux();
3557}
3558
deadbeef953c2ce2017-01-09 14:53:41 -08003559TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003560 Base::SendEarlyRtcpMuxToRtcp();
3561}
3562
deadbeef953c2ce2017-01-09 14:53:41 -08003563TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003564 Base::SendEarlyRtcpMuxToRtcpMux();
3565}
3566
deadbeef953c2ce2017-01-09 14:53:41 -08003567TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003568 Base::SendSrtpToSrtp();
3569}
3570
deadbeef953c2ce2017-01-09 14:53:41 -08003571TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003572 Base::SendSrtpToSrtp();
3573}
3574
deadbeef953c2ce2017-01-09 14:53:41 -08003575TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003576 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3577}
3578
deadbeef953c2ce2017-01-09 14:53:41 -08003579TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003580 Base::SendRtpToRtpOnThread();
3581}
3582
deadbeef953c2ce2017-01-09 14:53:41 -08003583TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003584 Base::SendSrtpToSrtpOnThread();
3585}
3586
deadbeef953c2ce2017-01-09 14:53:41 -08003587TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003588 Base::SendWithWritabilityLoss();
3589}
3590
deadbeef953c2ce2017-01-09 14:53:41 -08003591TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003592 Base::TestMediaMonitor();
3593}
3594
Steve Anton8a63f782017-10-23 13:08:53 -07003595TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
3596 Base::SocketOptionsMergedOnSetTransport();
3597}
3598
deadbeef953c2ce2017-01-09 14:53:41 -08003599TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003600 CreateChannels(0, 0);
3601 EXPECT_TRUE(SendInitiate());
3602 EXPECT_TRUE(SendAccept());
3603
3604 cricket::SendDataParams params;
3605 params.ssrc = 42;
3606 unsigned char data[] = {
3607 'f', 'o', 'o'
3608 };
jbaucheec21bd2016-03-20 06:15:43 -07003609 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003610 cricket::SendDataResult result;
3611 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3612 EXPECT_EQ(params.ssrc,
3613 media_channel1_->last_sent_data_params().ssrc);
3614 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3615}
3616
deadbeefbad5dad2017-01-17 18:32:35 -08003617#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3618
3619// Verifies some DCHECKs are in place.
3620// Uses VoiceChannel, but any BaseChannel subclass would work.
3621class BaseChannelDeathTest : public testing::Test {
3622 public:
3623 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003624 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3625 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3626 // RTCP mux not required, SRTP required.
Steve Anton8699a322017-11-06 15:53:33 -08003627 voice_channel_(rtc::Thread::Current(),
3628 rtc::Thread::Current(),
3629 rtc::Thread::Current(),
3630 &fake_media_engine_,
3631 rtc::MakeUnique<cricket::FakeVoiceMediaChannel>(
3632 nullptr,
3633 cricket::AudioOptions()),
3634 cricket::CN_AUDIO,
3635 false,
3636 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003637
3638 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003639 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003640 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3641 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003642 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003643};
3644
deadbeeff5346592017-01-24 21:51:21 -08003645TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003646 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3647 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003648 cricket::FakeDtlsTransport new_rtcp_transport(
3649 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3650 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003651}
3652
deadbeeff5346592017-01-24 21:51:21 -08003653TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003654 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3655 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003656 cricket::FakeDtlsTransport new_rtp_transport(
3657 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3658 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003659}
3660
deadbeeff5346592017-01-24 21:51:21 -08003661TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
Steve Anton8699a322017-11-06 15:53:33 -08003662 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3663 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeefbad5dad2017-01-17 18:32:35 -08003664 // Activate RTCP muxing, simulating offer/answer negotiation.
3665 cricket::AudioContentDescription content;
3666 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -08003667 ASSERT_TRUE(
3668 voice_channel_.SetLocalContent(&content, SdpType::kOffer, nullptr));
3669 ASSERT_TRUE(
3670 voice_channel_.SetRemoteContent(&content, SdpType::kAnswer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003671 cricket::FakeDtlsTransport new_rtp_transport(
3672 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3673 cricket::FakeDtlsTransport new_rtcp_transport(
3674 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003675 // After muxing is enabled, no RTCP transport should be passed in here.
3676 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003677 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3678 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003679}
3680
3681// This test will probably go away if/when we move the transport name out of
3682// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003683TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
Steve Anton8699a322017-11-06 15:53:33 -08003684 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3685 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003686 cricket::FakeDtlsTransport new_rtp_transport(
3687 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3688 cricket::FakeDtlsTransport new_rtcp_transport(
3689 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003690 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003691 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3692 "");
3693}
3694
3695// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003696// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003697TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003698 voice_channel_.Init_w(&fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3699 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003700 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003701 voice_channel_.SetTransports(
3702 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3703 static_cast<rtc::PacketTransportInternal*>(
3704 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003705 "");
3706}
3707
deadbeef5bd5ca32017-02-10 11:31:50 -08003708// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003709// DtlsTransportInternal.
3710TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
Steve Anton8699a322017-11-06 15:53:33 -08003711 voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3712 &fake_rtcp_dtls_transport_);
deadbeeff5346592017-01-24 21:51:21 -08003713 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3714 &fake_rtp_dtls_transport_),
3715 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003716}
3717
3718#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3719
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003720// TODO(pthatcher): TestSetReceiver?