blob: 6c4aa0f9ceb789a7ea1829150320b9c53e258cda [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>
12
Danil Chapovalov33b01f22016-05-11 19:55:27 +020013#include "webrtc/base/array_view.h"
14#include "webrtc/base/buffer.h"
nissec8ee8822017-01-18 07:20:55 -080015#include "webrtc/base/checks.h"
Taylor Brandstetter88532892016-08-01 14:17:27 -070016#include "webrtc/base/fakeclock.h"
buildbot@webrtc.org65b98d12014-08-07 22:09:08 +000017#include "webrtc/base/gunit.h"
buildbot@webrtc.org65b98d12014-08-07 22:09:08 +000018#include "webrtc/base/logging.h"
jbauchcb560652016-08-04 05:20:32 -070019#include "webrtc/base/sslstreamadapter.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakertp.h"
kjellandera96e2d72016-02-04 23:52:28 -080022#include "webrtc/media/base/mediachannel.h"
kjellandera96e2d72016-02-04 23:52:28 -080023#include "webrtc/media/base/testutils.h"
deadbeeff5346592017-01-24 21:51:21 -080024#include "webrtc/p2p/base/fakecandidatepair.h"
25#include "webrtc/p2p/base/fakedtlstransport.h"
26#include "webrtc/p2p/base/fakepackettransport.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010027#include "webrtc/pc/channel.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029using cricket::CA_OFFER;
30using cricket::CA_PRANSWER;
31using cricket::CA_ANSWER;
32using cricket::CA_UPDATE;
zhihuangb2cdd932017-01-19 16:54:25 -080033using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035using cricket::StreamParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036
Danil Chapovalov33b01f22016-05-11 19:55:27 +020037namespace {
38const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
39const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
40const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070041const cricket::VideoCodec kH264Codec(97, "H264");
42const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020043const cricket::DataCodec kGoogleDataCodec(101, "google-data");
44const uint32_t kSsrc1 = 0x1111;
45const uint32_t kSsrc2 = 0x2222;
46const uint32_t kSsrc3 = 0x3333;
47const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
deadbeefc6b6e092016-12-01 12:49:20 -080050const int kDefaultTimeout = 10000; // 10 seconds.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
deadbeefcbecd352015-09-23 11:50:27 -070053template <class ChannelT,
54 class MediaChannelT,
55 class ContentT,
56 class CodecT,
57 class MediaInfoT,
58 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059class Traits {
60 public:
61 typedef ChannelT Channel;
62 typedef MediaChannelT MediaChannel;
63 typedef ContentT Content;
64 typedef CodecT Codec;
65 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020066 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class VoiceTraits : public Traits<cricket::VoiceChannel,
70 cricket::FakeVoiceMediaChannel,
71 cricket::AudioContentDescription,
72 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070074 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class VideoTraits : public Traits<cricket::VideoChannel,
77 cricket::FakeVideoMediaChannel,
78 cricket::VideoContentDescription,
79 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070081 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
deadbeef953c2ce2017-01-09 14:53:41 -080083class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 cricket::FakeDataMediaChannel,
85 cricket::DataContentDescription,
86 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
deadbeef953c2ce2017-01-09 14:53:41 -080090// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091template<class T>
92class ChannelTest : public testing::Test, public sigslot::has_slots<> {
93 public:
deadbeefac22f702017-01-12 21:59:29 -080094 enum Flags {
95 RTCP_MUX = 0x1,
96 RTCP_MUX_REQUIRED = 0x2,
97 SECURE = 0x4,
98 SSRC_MUX = 0x8,
99 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800100 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800101 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700102 RAW_PACKET_TRANSPORT = 0x20,
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) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200122 CreateChannels(new typename T::MediaChannel(NULL, typename T::Options()),
123 new typename T::MediaChannel(NULL, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200126 void CreateChannels(typename T::MediaChannel* ch1,
127 typename T::MediaChannel* ch2,
128 int flags1,
129 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800130 // Network thread is started in CreateChannels, to allow the test to
131 // configure a fake clock before any threads are spawned and attempt to
132 // access the time.
133 if (network_thread_keeper_) {
134 network_thread_keeper_->Start();
135 }
deadbeefac22f702017-01-12 21:59:29 -0800136 // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
deadbeeff5346592017-01-24 21:51:21 -0800137 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
138 RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
139 // Make sure if using raw packet transports, they're used for both
140 // channels.
141 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200142 rtc::Thread* worker_thread = rtc::Thread::Current();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 media_channel1_ = ch1;
144 media_channel2_ = ch2;
deadbeef5bd5ca32017-02-10 11:31:50 -0800145 rtc::PacketTransportInternal* rtp1 = nullptr;
146 rtc::PacketTransportInternal* rtcp1 = nullptr;
147 rtc::PacketTransportInternal* rtp2 = nullptr;
148 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800149 // Based on flags, create fake DTLS or raw packet transports.
150 if (flags1 & RAW_PACKET_TRANSPORT) {
151 fake_rtp_packet_transport1_.reset(
152 new rtc::FakePacketTransport("channel1_rtp"));
153 rtp1 = fake_rtp_packet_transport1_.get();
154 if (!(flags1 & RTCP_MUX_REQUIRED)) {
155 fake_rtcp_packet_transport1_.reset(
156 new rtc::FakePacketTransport("channel1_rtcp"));
157 rtcp1 = fake_rtcp_packet_transport1_.get();
158 }
159 } else {
160 // Confirmed to work with KT_RSA and KT_ECDSA.
161 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
162 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
163 rtp1 = fake_rtp_dtls_transport1_.get();
164 if (!(flags1 & RTCP_MUX_REQUIRED)) {
165 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
166 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
167 rtcp1 = fake_rtcp_dtls_transport1_.get();
168 }
169 if (flags1 & DTLS) {
170 auto cert1 =
171 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
172 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
173 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
174 if (fake_rtcp_dtls_transport1_) {
175 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
176 }
177 }
178 }
179 // Based on flags, create fake DTLS or raw packet transports.
180 if (flags2 & RAW_PACKET_TRANSPORT) {
181 fake_rtp_packet_transport2_.reset(
182 new rtc::FakePacketTransport("channel2_rtp"));
183 rtp2 = fake_rtp_packet_transport2_.get();
184 if (!(flags2 & RTCP_MUX_REQUIRED)) {
185 fake_rtcp_packet_transport2_.reset(
186 new rtc::FakePacketTransport("channel2_rtcp"));
187 rtcp2 = fake_rtcp_packet_transport2_.get();
188 }
189 } else {
190 // Confirmed to work with KT_RSA and KT_ECDSA.
191 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
192 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
193 rtp2 = fake_rtp_dtls_transport2_.get();
194 if (!(flags2 & RTCP_MUX_REQUIRED)) {
195 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
196 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
197 rtcp2 = fake_rtcp_dtls_transport2_.get();
198 }
199 if (flags2 & DTLS) {
200 auto cert2 =
201 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
202 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
203 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
204 if (fake_rtcp_dtls_transport2_) {
205 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
206 }
207 }
208 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200209 channel1_.reset(
210 CreateChannel(worker_thread, network_thread_, &media_engine_, ch1,
deadbeeff5346592017-01-24 21:51:21 -0800211 fake_rtp_dtls_transport1_.get(),
212 fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200213 channel2_.reset(
214 CreateChannel(worker_thread, network_thread_, &media_engine_, ch2,
deadbeeff5346592017-01-24 21:51:21 -0800215 fake_rtp_dtls_transport2_.get(),
216 fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200217 channel1_->SignalMediaMonitor.connect(this,
218 &ChannelTest<T>::OnMediaMonitor1);
219 channel2_->SignalMediaMonitor.connect(this,
220 &ChannelTest<T>::OnMediaMonitor2);
deadbeefac22f702017-01-12 21:59:29 -0800221 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800222 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800223 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800224 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +0000225 if ((flags1 & DTLS) && (flags2 & DTLS)) {
226 flags1 = (flags1 & ~SECURE);
227 flags2 = (flags2 & ~SECURE);
228 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 CreateContent(flags1, kPcmuCodec, kH264Codec,
230 &local_media_content1_);
231 CreateContent(flags2, kPcmuCodec, kH264Codec,
232 &local_media_content2_);
233 CopyContent(local_media_content1_, &remote_media_content1_);
234 CopyContent(local_media_content2_, &remote_media_content2_);
235
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 // Add stream information (SSRC) to the local content but not to the remote
237 // content. This means that we per default know the SSRC of what we send but
238 // not what we receive.
239 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
240 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
241
242 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
243 if (flags1 & SSRC_MUX) {
244 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
245 }
246 if (flags2 & SSRC_MUX) {
247 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
248 }
249 }
deadbeefcbecd352015-09-23 11:50:27 -0700250 typename T::Channel* CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 rtc::Thread* worker_thread,
252 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700253 cricket::MediaEngineInterface* engine,
254 typename T::MediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -0800255 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
256 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800257 rtc::PacketTransportInternal* fake_rtp_packet_transport,
258 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -0700259 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800260 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -0800261 typename T::Channel* channel = new typename T::Channel(
zhihuangf5b251b2017-01-12 19:37:48 -0800262 worker_thread, network_thread, signaling_thread, engine, ch,
deadbeefac22f702017-01-12 21:59:29 -0800263 cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
264 (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -0800265 if (!channel->NeedsRtcpTransport()) {
266 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -0800267 }
deadbeeff5346592017-01-24 21:51:21 -0800268 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
269 fake_rtp_packet_transport,
270 fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000271 delete channel;
272 channel = NULL;
273 }
274 return channel;
275 }
276
deadbeeff5346592017-01-24 21:51:21 -0800277 void ConnectFakeTransports() {
278 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
279 bool asymmetric = false;
280 // Depending on test flags, could be using DTLS or raw packet transport.
281 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
282 fake_rtp_dtls_transport1_->SetDestination(
283 fake_rtp_dtls_transport2_.get(), asymmetric);
284 }
285 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
286 fake_rtcp_dtls_transport1_->SetDestination(
287 fake_rtcp_dtls_transport2_.get(), asymmetric);
288 }
289 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
290 fake_rtp_packet_transport1_->SetDestination(
291 fake_rtp_packet_transport2_.get(), asymmetric);
292 }
293 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
294 fake_rtcp_packet_transport1_->SetDestination(
295 fake_rtcp_packet_transport2_.get(), asymmetric);
296 }
297 });
298 }
299
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000300 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000301 bool result = channel1_->SetLocalContent(&local_media_content1_,
302 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000303 if (result) {
304 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000305 result = channel2_->SetRemoteContent(&remote_media_content1_,
306 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000307 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800308 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000309 result = channel2_->SetLocalContent(&local_media_content2_,
310 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000311 }
312 }
313 return result;
314 }
315
316 bool SendAccept() {
317 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000318 return channel1_->SetRemoteContent(&remote_media_content2_,
319 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320 }
321
322 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000323 bool result = channel1_->SetLocalContent(&local_media_content1_,
324 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000325 if (result) {
326 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000327 result = channel2_->SetRemoteContent(&remote_media_content1_,
328 CA_OFFER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 }
330 return result;
331 }
332
333 bool SendProvisionalAnswer() {
334 bool result = channel2_->SetLocalContent(&local_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 CA_PRANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336 if (result) {
337 channel2_->Enable(true);
338 result = channel1_->SetRemoteContent(&remote_media_content2_,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 CA_PRANSWER, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800340 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 }
342 return result;
343 }
344
345 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000346 bool result = channel2_->SetLocalContent(&local_media_content2_,
347 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 result = channel1_->SetRemoteContent(&remote_media_content2_,
350 CA_ANSWER, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 return result;
352 }
353
deadbeeff5346592017-01-24 21:51:21 -0800354 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 channel1_.reset();
356 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800357 fake_rtp_dtls_transport1_.reset();
358 fake_rtcp_dtls_transport1_.reset();
359 fake_rtp_dtls_transport2_.reset();
360 fake_rtcp_dtls_transport2_.reset();
361 fake_rtp_packet_transport1_.reset();
362 fake_rtcp_packet_transport1_.reset();
363 fake_rtp_packet_transport2_.reset();
364 fake_rtcp_packet_transport2_.reset();
365 if (network_thread_keeper_) {
366 network_thread_keeper_.reset();
367 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 return true;
369 }
370
371 bool AddStream1(int id) {
372 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
373 }
374 bool RemoveStream1(int id) {
375 return channel1_->RemoveRecvStream(id);
376 }
377
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200378 void SendRtp1() {
379 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
380 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200382 void SendRtp2() {
383 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
384 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200386 void SendRtcp1() {
387 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000388 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200389 void SendRtcp2() {
390 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 }
392 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200393 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
394 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
395 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200397 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
398 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
399 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200401 void SendCustomRtcp1(uint32_t ssrc) {
402 rtc::Buffer data = CreateRtcpData(ssrc);
403 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200405 void SendCustomRtcp2(uint32_t ssrc) {
406 rtc::Buffer data = CreateRtcpData(ssrc);
407 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200409
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200411 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
413 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
416 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
419 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
422 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200423 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200427 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
429 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200431 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 rtc::Buffer data = CreateRtcpData(ssrc);
433 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200435 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer data = CreateRtcpData(ssrc);
437 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
440 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::SetBE32(data.data() + 8, ssrc);
443 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000444 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000446 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 return data;
448 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
450 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 return data;
454 }
455
456 bool CheckNoRtp1() {
457 return media_channel1_->CheckNoRtp();
458 }
459 bool CheckNoRtp2() {
460 return media_channel2_->CheckNoRtp();
461 }
462 bool CheckNoRtcp1() {
463 return media_channel1_->CheckNoRtcp();
464 }
465 bool CheckNoRtcp2() {
466 return media_channel2_->CheckNoRtcp();
467 }
468
469 void CreateContent(int flags,
470 const cricket::AudioCodec& audio_codec,
471 const cricket::VideoCodec& video_codec,
472 typename T::Content* content) {
473 // overridden in specialized classes
474 }
475 void CopyContent(const typename T::Content& source,
476 typename T::Content* content) {
477 // overridden in specialized classes
478 }
479
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 // Creates a cricket::SessionDescription with one MediaContent and one stream.
481 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200482 cricket::SessionDescription* CreateSessionDescriptionWithStream(
483 uint32_t ssrc) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 typename T::Content content;
485 cricket::SessionDescription* sdesc = new cricket::SessionDescription();
486 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content);
487 AddLegacyStreamInContent(ssrc, 0, &content);
488 sdesc->AddContent("DUMMY_CONTENT_NAME",
489 cricket::NS_JINGLE_RTP, content.Copy());
490 return sdesc;
491 }
492
ossu292d6582016-03-17 02:31:13 -0700493 // Will manage the lifetime of a CallThread, making sure it's
494 // destroyed before this object goes out of scope.
495 class ScopedCallThread {
496 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200497 template <class FunctorT>
498 ScopedCallThread(const FunctorT& functor)
499 : thread_(rtc::Thread::Create()),
500 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700501 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700502 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700503 }
504
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200505 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700506
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200507 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700508
509 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200510 std::unique_ptr<rtc::Thread> thread_;
511 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700512 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
515 return false; // overridden in specialized classes
516 }
517
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200518 void OnMediaMonitor1(typename T::Channel* channel,
519 const typename T::MediaInfo& info) {
520 RTC_DCHECK_EQ(channel, channel1_.get());
521 media_info_callbacks1_++;
522 }
523 void OnMediaMonitor2(typename T::Channel* channel,
524 const typename T::MediaInfo& info) {
525 RTC_DCHECK_EQ(channel, channel2_.get());
526 media_info_callbacks2_++;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 }
deadbeeff5346592017-01-24 21:51:21 -0800528 void OnRtcpMuxFullyActive1(const std::string&) {
529 rtcp_mux_activated_callbacks1_++;
530 }
531 void OnRtcpMuxFullyActive2(const std::string&) {
532 rtcp_mux_activated_callbacks2_++;
533 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534
Honghai Zhangcc411c02016-03-29 17:27:21 -0700535 cricket::CandidatePairInterface* last_selected_candidate_pair() {
536 return last_selected_candidate_pair_;
537 }
538
Peter Boström0c4e06b2015-10-07 12:23:21 +0200539 void AddLegacyStreamInContent(uint32_t ssrc,
540 int flags,
541 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 // Base implementation.
543 }
544
545 // Tests that can be used by derived classes.
546
547 // Basic sanity check.
548 void TestInit() {
549 CreateChannels(0, 0);
550 EXPECT_FALSE(channel1_->secure());
551 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200552 if (verify_playout_) {
553 EXPECT_FALSE(media_channel1_->playout());
554 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 EXPECT_TRUE(media_channel1_->codecs().empty());
556 EXPECT_TRUE(media_channel1_->recv_streams().empty());
557 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
558 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
559 }
560
561 // Test that SetLocalContent and SetRemoteContent properly configure
562 // the codecs.
563 void TestSetContents() {
564 CreateChannels(0, 0);
565 typename T::Content content;
566 CreateContent(0, kPcmuCodec, kH264Codec, &content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000567 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000569 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 ASSERT_EQ(1U, media_channel1_->codecs().size());
571 EXPECT_TRUE(CodecMatches(content.codecs()[0],
572 media_channel1_->codecs()[0]));
573 }
574
575 // Test that SetLocalContent and SetRemoteContent properly deals
576 // with an empty offer.
577 void TestSetContentsNullOffer() {
578 CreateChannels(0, 0);
579 typename T::Content content;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000580 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 CreateContent(0, kPcmuCodec, kH264Codec, &content);
582 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000583 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 ASSERT_EQ(1U, media_channel1_->codecs().size());
585 EXPECT_TRUE(CodecMatches(content.codecs()[0],
586 media_channel1_->codecs()[0]));
587 }
588
589 // Test that SetLocalContent and SetRemoteContent properly set RTCP
590 // mux.
591 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800592 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 typename T::Content content;
594 CreateContent(0, kPcmuCodec, kH264Codec, &content);
595 // Both sides agree on mux. Should no longer be a separate RTCP channel.
596 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000597 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
598 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000600 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000602 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 }
604
605 // Test that SetLocalContent and SetRemoteContent properly set RTCP
606 // mux when a provisional answer is received.
607 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800608 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 typename T::Content content;
610 CreateContent(0, kPcmuCodec, kH264Codec, &content);
611 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000612 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
613 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800614 // Both sides agree on mux. Should signal RTCP mux as fully activated.
615 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000616 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800617 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 // Only initiator supports mux. Should still have a separate RTCP channel.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000619 EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 content.set_rtcp_mux(false);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000621 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
622 EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800623 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 }
625
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 // Test that SetRemoteContent properly deals with a content update.
627 void TestSetRemoteContentUpdate() {
628 CreateChannels(0, 0);
629 typename T::Content content;
deadbeefac22f702017-01-12 21:59:29 -0800630 CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 EXPECT_EQ(0U, media_channel1_->codecs().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000632 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
633 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 ASSERT_EQ(1U, media_channel1_->codecs().size());
635 EXPECT_TRUE(CodecMatches(content.codecs()[0],
636 media_channel1_->codecs()[0]));
637 // Now update with other codecs.
638 typename T::Content update_content;
639 update_content.set_partial(true);
640 CreateContent(0, kIsacCodec, kH264SvcCodec,
641 &update_content);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000642 EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 ASSERT_EQ(1U, media_channel1_->codecs().size());
644 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
645 media_channel1_->codecs()[0]));
646 // Now update without any codecs. This is ignored.
647 typename T::Content empty_content;
648 empty_content.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000649 EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 ASSERT_EQ(1U, media_channel1_->codecs().size());
651 EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
652 media_channel1_->codecs()[0]));
653 }
654
655 // Test that Add/RemoveStream properly forward to the media channel.
656 void TestStreams() {
657 CreateChannels(0, 0);
658 EXPECT_TRUE(AddStream1(1));
659 EXPECT_TRUE(AddStream1(2));
660 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
661 EXPECT_TRUE(RemoveStream1(2));
662 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
663 EXPECT_TRUE(RemoveStream1(1));
664 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
665 }
666
667 // Test that SetLocalContent properly handles adding and removing StreamParams
668 // to the local content description.
669 // This test uses the CA_UPDATE action that don't require a full
670 // MediaContentDescription to do an update.
671 void TestUpdateStreamsInLocalContent() {
672 cricket::StreamParams stream1;
673 stream1.groupid = "group1";
674 stream1.id = "stream1";
675 stream1.ssrcs.push_back(kSsrc1);
676 stream1.cname = "stream1_cname";
677
678 cricket::StreamParams stream2;
679 stream2.groupid = "group2";
680 stream2.id = "stream2";
681 stream2.ssrcs.push_back(kSsrc2);
682 stream2.cname = "stream2_cname";
683
684 cricket::StreamParams stream3;
685 stream3.groupid = "group3";
686 stream3.id = "stream3";
687 stream3.ssrcs.push_back(kSsrc3);
688 stream3.cname = "stream3_cname";
689
690 CreateChannels(0, 0);
691 typename T::Content content1;
692 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
693 content1.AddStream(stream1);
694 EXPECT_EQ(0u, media_channel1_->send_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000695 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
697 ASSERT_EQ(1u, media_channel1_->send_streams().size());
698 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
699
700 // Update the local streams by adding another sending stream.
701 // Use a partial updated session description.
702 typename T::Content content2;
703 content2.AddStream(stream2);
704 content2.AddStream(stream3);
705 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706 EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 ASSERT_EQ(3u, media_channel1_->send_streams().size());
708 EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
709 EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
710 EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
711
712 // Update the local streams by removing the first sending stream.
713 // This is done by removing all SSRCS for this particular stream.
714 typename T::Content content3;
715 stream1.ssrcs.clear();
716 content3.AddStream(stream1);
717 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000718 EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 ASSERT_EQ(2u, media_channel1_->send_streams().size());
720 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
721 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
722
723 // Update the local streams with a stream that does not change.
724 // THe update is ignored.
725 typename T::Content content4;
726 content4.AddStream(stream2);
727 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000728 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000729 ASSERT_EQ(2u, media_channel1_->send_streams().size());
730 EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
731 EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
732 }
733
734 // Test that SetRemoteContent properly handles adding and removing
735 // StreamParams to the remote content description.
736 // This test uses the CA_UPDATE action that don't require a full
737 // MediaContentDescription to do an update.
738 void TestUpdateStreamsInRemoteContent() {
739 cricket::StreamParams stream1;
740 stream1.id = "Stream1";
741 stream1.groupid = "1";
742 stream1.ssrcs.push_back(kSsrc1);
743 stream1.cname = "stream1_cname";
744
745 cricket::StreamParams stream2;
746 stream2.id = "Stream2";
747 stream2.groupid = "2";
748 stream2.ssrcs.push_back(kSsrc2);
749 stream2.cname = "stream2_cname";
750
751 cricket::StreamParams stream3;
752 stream3.id = "Stream3";
753 stream3.groupid = "3";
754 stream3.ssrcs.push_back(kSsrc3);
755 stream3.cname = "stream3_cname";
756
757 CreateChannels(0, 0);
758 typename T::Content content1;
759 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
760 content1.AddStream(stream1);
761 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
764 ASSERT_EQ(1u, media_channel1_->codecs().size());
765 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
766 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
767
768 // Update the remote streams by adding another sending stream.
769 // Use a partial updated session description.
770 typename T::Content content2;
771 content2.AddStream(stream2);
772 content2.AddStream(stream3);
773 content2.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000774 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 ASSERT_EQ(3u, media_channel1_->recv_streams().size());
776 EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
777 EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
778 EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
779
780 // Update the remote streams by removing the first stream.
781 // This is done by removing all SSRCS for this particular stream.
782 typename T::Content content3;
783 stream1.ssrcs.clear();
784 content3.AddStream(stream1);
785 content3.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000786 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
788 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
789 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
790
791 // Update the remote streams with a stream that does not change.
792 // The update is ignored.
793 typename T::Content content4;
794 content4.AddStream(stream2);
795 content4.set_partial(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000796 EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 ASSERT_EQ(2u, media_channel1_->recv_streams().size());
798 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
799 EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
800 }
801
802 // Test that SetLocalContent and SetRemoteContent properly
803 // handles adding and removing StreamParams when the action is a full
804 // CA_OFFER / CA_ANSWER.
805 void TestChangeStreamParamsInContent() {
806 cricket::StreamParams stream1;
807 stream1.groupid = "group1";
808 stream1.id = "stream1";
809 stream1.ssrcs.push_back(kSsrc1);
810 stream1.cname = "stream1_cname";
811
812 cricket::StreamParams stream2;
813 stream2.groupid = "group1";
814 stream2.id = "stream2";
815 stream2.ssrcs.push_back(kSsrc2);
816 stream2.cname = "stream2_cname";
817
818 // Setup a call where channel 1 send |stream1| to channel 2.
819 CreateChannels(0, 0);
820 typename T::Content content1;
821 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
822 content1.AddStream(stream1);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000823 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824 EXPECT_TRUE(channel1_->Enable(true));
825 EXPECT_EQ(1u, media_channel1_->send_streams().size());
826
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000827 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800829 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830
831 // Channel 2 do not send anything.
832 typename T::Content content2;
833 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000834 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000836 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837 EXPECT_TRUE(channel2_->Enable(true));
838 EXPECT_EQ(0u, media_channel2_->send_streams().size());
839
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200840 SendCustomRtp1(kSsrc1, 0);
841 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
843
844 // Let channel 2 update the content by sending |stream2| and enable SRTP.
845 typename T::Content content3;
846 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
847 content3.AddStream(stream2);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000848 EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849 ASSERT_EQ(1u, media_channel2_->send_streams().size());
850 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
851
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000852 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
854 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
855
856 // Channel 1 replies but stop sending stream1.
857 typename T::Content content4;
858 CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000859 EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860 EXPECT_EQ(0u, media_channel1_->send_streams().size());
861
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000862 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
864
865 EXPECT_TRUE(channel1_->secure());
866 EXPECT_TRUE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200867 SendCustomRtp2(kSsrc2, 0);
868 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
870 }
871
872 // Test that we only start playout and sending at the right times.
873 void TestPlayoutAndSendingStates() {
874 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200875 if (verify_playout_) {
876 EXPECT_FALSE(media_channel1_->playout());
877 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200879 if (verify_playout_) {
880 EXPECT_FALSE(media_channel2_->playout());
881 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 EXPECT_FALSE(media_channel2_->sending());
883 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200884 if (verify_playout_) {
885 EXPECT_FALSE(media_channel1_->playout());
886 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000888 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
889 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200890 if (verify_playout_) {
891 EXPECT_TRUE(media_channel1_->playout());
892 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000894 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
895 CA_OFFER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200896 if (verify_playout_) {
897 EXPECT_FALSE(media_channel2_->playout());
898 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000900 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
901 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200902 if (verify_playout_) {
903 EXPECT_FALSE(media_channel2_->playout());
904 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800906 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200907 if (verify_playout_) {
908 EXPECT_TRUE(media_channel1_->playout());
909 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200911 if (verify_playout_) {
912 EXPECT_FALSE(media_channel2_->playout());
913 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 EXPECT_FALSE(media_channel2_->sending());
915 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200916 if (verify_playout_) {
917 EXPECT_TRUE(media_channel2_->playout());
918 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000920 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
921 CA_ANSWER, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200922 if (verify_playout_) {
923 EXPECT_TRUE(media_channel1_->playout());
924 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925 EXPECT_TRUE(media_channel1_->sending());
926 }
927
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 // Test that changing the MediaContentDirection in the local and remote
929 // session description start playout and sending at the right time.
930 void TestMediaContentDirection() {
931 CreateChannels(0, 0);
932 typename T::Content content1;
933 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
934 typename T::Content content2;
935 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
936 // Set |content2| to be InActive.
937 content2.set_direction(cricket::MD_INACTIVE);
938
939 EXPECT_TRUE(channel1_->Enable(true));
940 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200941 if (verify_playout_) {
942 EXPECT_FALSE(media_channel1_->playout());
943 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200945 if (verify_playout_) {
946 EXPECT_FALSE(media_channel2_->playout());
947 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948 EXPECT_FALSE(media_channel2_->sending());
949
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000950 EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
951 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
952 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
953 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800954 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955
Peter Boström34fbfff2015-09-24 19:20:30 +0200956 if (verify_playout_) {
957 EXPECT_TRUE(media_channel1_->playout());
958 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200960 if (verify_playout_) {
961 EXPECT_FALSE(media_channel2_->playout()); // local InActive
962 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963 EXPECT_FALSE(media_channel2_->sending()); // local InActive
964
965 // Update |content2| to be RecvOnly.
966 content2.set_direction(cricket::MD_RECVONLY);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000967 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
968 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969
Peter Boström34fbfff2015-09-24 19:20:30 +0200970 if (verify_playout_) {
971 EXPECT_TRUE(media_channel1_->playout());
972 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200974 if (verify_playout_) {
975 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
976 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
978
979 // Update |content2| to be SendRecv.
980 content2.set_direction(cricket::MD_SENDRECV);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000981 EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
982 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983
Peter Boström34fbfff2015-09-24 19:20:30 +0200984 if (verify_playout_) {
985 EXPECT_TRUE(media_channel1_->playout());
986 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200988 if (verify_playout_) {
989 EXPECT_TRUE(media_channel2_->playout());
990 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 EXPECT_TRUE(media_channel2_->sending());
992 }
993
Honghai Zhangcc411c02016-03-29 17:27:21 -0700994 // Tests that when the transport channel signals a candidate pair change
995 // event, the media channel will receive a call on the network route change.
996 void TestNetworkRouteChanges() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200997 constexpr uint16_t kLocalNetId = 1;
998 constexpr uint16_t kRemoteNetId = 2;
999 constexpr int kLastPacketId = 100;
1000
Honghai Zhangcc411c02016-03-29 17:27:21 -07001001 CreateChannels(0, 0);
1002
Honghai Zhangcc411c02016-03-29 17:27:21 -07001003 typename T::MediaChannel* media_channel1 =
1004 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001005 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001006
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001007 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -08001008 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001009 // The transport channel becomes disconnected.
deadbeeff5346592017-01-24 21:51:21 -08001010 fake_rtp_dtls_transport1_->ice_transport()
1011 ->SignalSelectedCandidatePairChanged(
1012 fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001013 });
1014 WaitForThreads();
1015 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001016 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001017 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001018
deadbeeff5346592017-01-24 21:51:21 -08001019 network_thread_->Invoke<void>(RTC_FROM_HERE, [this, media_channel1,
1020 kLocalNetId, kRemoteNetId,
1021 kLastPacketId] {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001022 // The transport channel becomes connected.
1023 rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
1024 rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
deadbeeff5346592017-01-24 21:51:21 -08001025 auto candidate_pair = cricket::FakeCandidatePair::Create(
1026 local_address, kLocalNetId, remote_address, kRemoteNetId);
1027 fake_rtp_dtls_transport1_->ice_transport()
1028 ->SignalSelectedCandidatePairChanged(
1029 fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
1030 kLastPacketId, true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001031 });
1032 WaitForThreads();
1033 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -07001034 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001035 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -07001036 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001037 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -07001038 media_channel1->last_network_route().last_sent_packet_id);
michaelt79e05882016-11-08 02:50:09 -08001039 constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
1040 EXPECT_EQ(kTransportOverheadPerPacket,
1041 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -07001042 }
1043
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 // Test setting up a call.
1045 void TestCallSetup() {
1046 CreateChannels(0, 0);
1047 EXPECT_FALSE(channel1_->secure());
1048 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +02001049 if (verify_playout_) {
1050 EXPECT_TRUE(media_channel1_->playout());
1051 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 EXPECT_FALSE(media_channel1_->sending());
1053 EXPECT_TRUE(SendAccept());
1054 EXPECT_FALSE(channel1_->secure());
1055 EXPECT_TRUE(media_channel1_->sending());
1056 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +02001057 if (verify_playout_) {
1058 EXPECT_TRUE(media_channel2_->playout());
1059 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 EXPECT_TRUE(media_channel2_->sending());
1061 EXPECT_EQ(1U, media_channel2_->codecs().size());
1062 }
1063
1064 // Test that we don't crash if packets are sent during call teardown
1065 // when RTCP mux is enabled. This is a regression test against a specific
1066 // race condition that would only occur when a RTCP packet was sent during
1067 // teardown of a channel on which RTCP mux was enabled.
1068 void TestCallTeardownRtcpMux() {
1069 class LastWordMediaChannel : public T::MediaChannel {
1070 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001071 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001072 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -07001073 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
1074 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
1076 }
1077 };
1078 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
deadbeefac22f702017-01-12 21:59:29 -08001079 RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(SendInitiate());
1081 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001082 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 }
1084
1085 // Send voice RTP data to the other side and ensure it gets there.
1086 void SendRtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001087 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 EXPECT_TRUE(SendInitiate());
1089 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001090 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1091 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001092 SendRtp1();
1093 SendRtp2();
1094 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 EXPECT_TRUE(CheckRtp1());
1096 EXPECT_TRUE(CheckRtp2());
1097 EXPECT_TRUE(CheckNoRtp1());
1098 EXPECT_TRUE(CheckNoRtp2());
1099 }
1100
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001101 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -08001102 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001103 EXPECT_TRUE(SendInitiate());
1104 EXPECT_TRUE(SendAccept());
1105 SendRtp1();
1106 SendRtp2();
1107 SendRtcp1();
1108 SendRtcp2();
1109 // Do not wait, destroy channels.
1110 channel1_.reset(nullptr);
1111 channel2_.reset(nullptr);
1112 }
1113
deadbeefac22f702017-01-12 21:59:29 -08001114 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001116 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 EXPECT_TRUE(SendInitiate());
1118 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001119 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1120 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001121 SendRtcp1();
1122 SendRtcp2();
1123 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(CheckRtcp1());
1125 EXPECT_TRUE(CheckRtcp2());
1126 EXPECT_TRUE(CheckNoRtcp1());
1127 EXPECT_TRUE(CheckNoRtcp2());
1128 }
1129
1130 // Check that RTCP is transmitted if only the initiator supports mux.
1131 void SendRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001132 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 EXPECT_TRUE(SendInitiate());
1134 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001135 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1136 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001137 SendRtcp1();
1138 SendRtcp2();
1139 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(CheckRtcp1());
1141 EXPECT_TRUE(CheckRtcp2());
1142 EXPECT_TRUE(CheckNoRtcp1());
1143 EXPECT_TRUE(CheckNoRtcp2());
1144 }
1145
1146 // Check that RTP and RTCP are transmitted ok when both sides support mux.
1147 void SendRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001148 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001150 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1151 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1152 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001154 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1155 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001156 SendRtp1();
1157 SendRtp2();
1158 SendRtcp1();
1159 SendRtcp2();
1160 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_TRUE(CheckRtp1());
1162 EXPECT_TRUE(CheckRtp2());
1163 EXPECT_TRUE(CheckNoRtp1());
1164 EXPECT_TRUE(CheckNoRtp2());
1165 EXPECT_TRUE(CheckRtcp1());
1166 EXPECT_TRUE(CheckRtcp2());
1167 EXPECT_TRUE(CheckNoRtcp1());
1168 EXPECT_TRUE(CheckNoRtcp2());
1169 }
1170
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001171 // Check that RTP and RTCP are transmitted ok when both sides
1172 // support mux and one the offerer requires mux.
1173 void SendRequireRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001174 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001175 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001176 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1177 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001178 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001179 SendRtp1();
1180 SendRtp2();
1181 SendRtcp1();
1182 SendRtcp2();
1183 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001184 EXPECT_TRUE(CheckRtp1());
1185 EXPECT_TRUE(CheckRtp2());
1186 EXPECT_TRUE(CheckNoRtp1());
1187 EXPECT_TRUE(CheckNoRtp2());
1188 EXPECT_TRUE(CheckRtcp1());
1189 EXPECT_TRUE(CheckRtcp2());
1190 EXPECT_TRUE(CheckNoRtcp1());
1191 EXPECT_TRUE(CheckNoRtcp2());
1192 }
1193
1194 // Check that RTP and RTCP are transmitted ok when both sides
deadbeefac22f702017-01-12 21:59:29 -08001195 // support mux and only the answerer requires rtcp mux.
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001196 void SendRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001197 CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001198 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001199 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1200 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1201 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001202 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001203 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1204 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001205 SendRtp1();
1206 SendRtp2();
1207 SendRtcp1();
1208 SendRtcp2();
1209 WaitForThreads();
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001210 EXPECT_TRUE(CheckRtp1());
1211 EXPECT_TRUE(CheckRtp2());
1212 EXPECT_TRUE(CheckNoRtp1());
1213 EXPECT_TRUE(CheckNoRtp2());
1214 EXPECT_TRUE(CheckRtcp1());
1215 EXPECT_TRUE(CheckRtcp2());
1216 EXPECT_TRUE(CheckNoRtcp1());
1217 EXPECT_TRUE(CheckNoRtcp2());
1218 }
1219
1220 // Check that RTP and RTCP are transmitted ok when both sides
1221 // require mux.
1222 void SendRequireRtcpMuxToRequireRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001223 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001224 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001225 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1226 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001227 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001228 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
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 SendAccept fails if the answerer doesn't support mux
1245 // and the offerer requires it.
1246 void SendRequireRtcpMuxToNoRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001247 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001248 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001249 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1250 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07001251 EXPECT_FALSE(SendAccept());
1252 }
1253
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 // Check that RTCP data sent by the initiator before the accept is not muxed.
1255 void SendEarlyRtcpMuxToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001256 CreateChannels(RTCP_MUX, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001258 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1259 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260
1261 // RTCP can be sent before the call is accepted, if the transport is ready.
1262 // It should not be muxed though, as the remote side doesn't support mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001263 SendRtcp1();
1264 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 EXPECT_TRUE(CheckNoRtp2());
1266 EXPECT_TRUE(CheckRtcp2());
1267
1268 // Send RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001269 SendRtcp2();
1270 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_TRUE(CheckNoRtp1());
1272 EXPECT_TRUE(CheckRtcp1());
1273
1274 // Complete call setup and ensure everything is still OK.
1275 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001276 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001277 SendRtcp1();
1278 SendRtcp2();
1279 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001281 EXPECT_TRUE(CheckRtcp1());
1282 }
1283
1284
1285 // Check that RTCP data is not muxed until both sides have enabled muxing,
1286 // but that we properly demux before we get the accept message, since there
1287 // is a race between RTP data and the jingle accept.
1288 void SendEarlyRtcpMuxToRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001289 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001291 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1292 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293
1294 // RTCP can't be sent yet, since the RTCP transport isn't writable, and
1295 // we haven't yet received the accept that says we should mux.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001296 SendRtcp1();
1297 WaitForThreads();
1298 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001299
1300 // Send muxed RTCP packet from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001301 SendRtcp2();
1302 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001303 EXPECT_TRUE(CheckNoRtp1());
1304 EXPECT_TRUE(CheckRtcp1());
1305
1306 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001307 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001308 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001309 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1310 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001311 SendRtcp1();
1312 SendRtcp2();
1313 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001314 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(CheckRtcp1());
1316 }
1317
1318 // Test that we properly send SRTP with RTCP in both directions.
deadbeef7914b8c2017-04-21 03:23:33 -07001319 // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
deadbeef7914b8c2017-04-21 03:23:33 -07001321 RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
1322 RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323
deadbeefac22f702017-01-12 21:59:29 -08001324 int flags1 = SECURE | flags1_in;
1325 int flags2 = SECURE | flags2_in;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 bool dtls1 = !!(flags1_in & DTLS);
1327 bool dtls2 = !!(flags2_in & DTLS);
1328 CreateChannels(flags1, flags2);
1329 EXPECT_FALSE(channel1_->secure());
1330 EXPECT_FALSE(channel2_->secure());
1331 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001332 WaitForThreads();
1333 EXPECT_TRUE(channel1_->writable());
1334 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(SendAccept());
1336 EXPECT_TRUE(channel1_->secure());
1337 EXPECT_TRUE(channel2_->secure());
1338 EXPECT_EQ(dtls1 && dtls2, channel1_->secure_dtls());
1339 EXPECT_EQ(dtls1 && dtls2, channel2_->secure_dtls());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001340 SendRtp1();
1341 SendRtp2();
1342 SendRtcp1();
1343 SendRtcp2();
1344 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 EXPECT_TRUE(CheckRtp1());
1346 EXPECT_TRUE(CheckRtp2());
1347 EXPECT_TRUE(CheckNoRtp1());
1348 EXPECT_TRUE(CheckNoRtp2());
1349 EXPECT_TRUE(CheckRtcp1());
1350 EXPECT_TRUE(CheckRtcp2());
1351 EXPECT_TRUE(CheckNoRtcp1());
1352 EXPECT_TRUE(CheckNoRtcp2());
1353 }
1354
1355 // Test that we properly handling SRTP negotiating down to RTP.
1356 void SendSrtpToRtp() {
deadbeefac22f702017-01-12 21:59:29 -08001357 CreateChannels(SECURE, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_FALSE(channel1_->secure());
1359 EXPECT_FALSE(channel2_->secure());
1360 EXPECT_TRUE(SendInitiate());
1361 EXPECT_TRUE(SendAccept());
1362 EXPECT_FALSE(channel1_->secure());
1363 EXPECT_FALSE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001364 SendRtp1();
1365 SendRtp2();
1366 SendRtcp1();
1367 SendRtcp2();
1368 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(CheckRtp1());
1370 EXPECT_TRUE(CheckRtp2());
1371 EXPECT_TRUE(CheckNoRtp1());
1372 EXPECT_TRUE(CheckNoRtp2());
1373 EXPECT_TRUE(CheckRtcp1());
1374 EXPECT_TRUE(CheckRtcp2());
1375 EXPECT_TRUE(CheckNoRtcp1());
1376 EXPECT_TRUE(CheckNoRtcp2());
1377 }
1378
1379 // Test that we can send and receive early media when a provisional answer is
1380 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1381 void SendEarlyMediaUsingRtcpMuxSrtp() {
1382 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1383
deadbeefac22f702017-01-12 21:59:29 -08001384 CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
1385 SSRC_MUX | RTCP_MUX | SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 EXPECT_TRUE(SendOffer());
1387 EXPECT_TRUE(SendProvisionalAnswer());
1388 EXPECT_TRUE(channel1_->secure());
1389 EXPECT_TRUE(channel2_->secure());
deadbeeff5346592017-01-24 21:51:21 -08001390 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1391 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001392 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1393 SendCustomRtcp1(kSsrc1);
1394 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1395 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001396 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001397 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1398
1399 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001400 SendCustomRtcp2(kSsrc2);
1401 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1402 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1405
1406 // Complete call setup and ensure everything is still OK.
deadbeeff5346592017-01-24 21:51:21 -08001407 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
1408 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409 EXPECT_TRUE(SendFinalAnswer());
deadbeeff5346592017-01-24 21:51:21 -08001410 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1411 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
1412 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1413 EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414 EXPECT_TRUE(channel1_->secure());
1415 EXPECT_TRUE(channel2_->secure());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001416 SendCustomRtcp1(kSsrc1);
1417 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1418 SendCustomRtcp2(kSsrc2);
1419 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1420 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001423 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1425 }
1426
1427 // Test that we properly send RTP without SRTP from a thread.
1428 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001429 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 EXPECT_TRUE(SendInitiate());
1431 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001432 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1433 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1434 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1435 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1436 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1437 send_rtcp1.thread(),
1438 send_rtcp2.thread()};
1439 WaitForThreads(involved_threads);
1440 EXPECT_TRUE(CheckRtp1());
1441 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442 EXPECT_TRUE(CheckNoRtp1());
1443 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001444 EXPECT_TRUE(CheckRtcp1());
1445 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446 EXPECT_TRUE(CheckNoRtcp1());
1447 EXPECT_TRUE(CheckNoRtcp2());
1448 }
1449
1450 // Test that we properly send SRTP with RTCP from a thread.
1451 void SendSrtpToSrtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001452 CreateChannels(SECURE, SECURE);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001453 EXPECT_TRUE(SendInitiate());
1454 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001455 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1456 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1457 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1458 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1459 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1460 send_rtcp1.thread(),
1461 send_rtcp2.thread()};
1462 WaitForThreads(involved_threads);
1463 EXPECT_TRUE(CheckRtp1());
1464 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_TRUE(CheckNoRtp1());
1466 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001467 EXPECT_TRUE(CheckRtcp1());
1468 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 EXPECT_TRUE(CheckNoRtcp1());
1470 EXPECT_TRUE(CheckNoRtcp2());
1471 }
1472
1473 // Test that the mediachannel retains its sending state after the transport
1474 // becomes non-writable.
1475 void SendWithWritabilityLoss() {
deadbeefac22f702017-01-12 21:59:29 -08001476 CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477 EXPECT_TRUE(SendInitiate());
1478 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001479 EXPECT_FALSE(channel1_->NeedsRtcpTransport());
1480 EXPECT_FALSE(channel2_->NeedsRtcpTransport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001481 SendRtp1();
1482 SendRtp2();
1483 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484 EXPECT_TRUE(CheckRtp1());
1485 EXPECT_TRUE(CheckRtp2());
1486 EXPECT_TRUE(CheckNoRtp1());
1487 EXPECT_TRUE(CheckNoRtp2());
1488
wu@webrtc.org97077a32013-10-25 21:18:33 +00001489 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001490 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1491 fake_rtp_dtls_transport1_->SetWritable(false);
1492 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 SendRtp1();
1494 SendRtp2();
1495 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496 EXPECT_TRUE(CheckRtp1());
1497 EXPECT_TRUE(CheckNoRtp2());
1498
1499 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001500 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1501 fake_rtp_dtls_transport1_->SetWritable(true);
1502 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 SendRtp1();
1505 SendRtp2();
1506 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507 EXPECT_TRUE(CheckRtp1());
1508 EXPECT_TRUE(CheckRtp2());
1509 EXPECT_TRUE(CheckNoRtp1());
1510 EXPECT_TRUE(CheckNoRtp2());
1511
1512 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001513 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1514 bool asymmetric = true;
1515 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1516 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517 EXPECT_TRUE(media_channel1_->sending());
1518
wu@webrtc.org97077a32013-10-25 21:18:33 +00001519 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001520 SendRtp1();
1521 SendRtp2();
1522 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 EXPECT_TRUE(CheckRtp1());
1524 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001525 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526
1527 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001528 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001529 bool asymmetric = true;
1530 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1531 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001532 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001534 SendRtp1();
1535 SendRtp2();
1536 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 EXPECT_TRUE(CheckRtp1());
1538 EXPECT_TRUE(CheckRtp2());
1539 EXPECT_TRUE(CheckNoRtp1());
1540 EXPECT_TRUE(CheckNoRtp2());
1541 }
1542
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001543 void SendBundleToBundle(
1544 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1545 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001547 // Only pl_type1 was added to the bundle filter for both |channel1_|
1548 // and |channel2_|.
1549 int pl_type1 = pl_types[0];
1550 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001551 int flags = SSRC_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001552 if (secure) flags |= SECURE;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001553 if (rtcp_mux) {
1554 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001555 }
1556 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557 EXPECT_TRUE(SendInitiate());
deadbeeff5346592017-01-24 21:51:21 -08001558 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1559 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001561 EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
1562 EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001563 EXPECT_TRUE(channel1_->bundle_filter()->FindPayloadType(pl_type1));
1564 EXPECT_TRUE(channel2_->bundle_filter()->FindPayloadType(pl_type1));
1565 EXPECT_FALSE(channel1_->bundle_filter()->FindPayloadType(pl_type2));
1566 EXPECT_FALSE(channel2_->bundle_filter()->FindPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001567
1568 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001569 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1570 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1571 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001572 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001573 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1574 EXPECT_TRUE(CheckNoRtp1());
1575 EXPECT_TRUE(CheckNoRtp2());
1576
1577 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001578 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1579 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1580 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001581 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001582 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1583
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001584 SendCustomRtcp1(kSsrc1);
1585 SendCustomRtcp2(kSsrc2);
1586 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1588 EXPECT_TRUE(CheckNoRtcp1());
1589 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1590 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001592 SendCustomRtcp1(kSsrc2);
1593 SendCustomRtcp2(kSsrc1);
1594 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001595 // Bundle filter shouldn't filter out any RTCP.
1596 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1597 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 }
1599
deadbeefc6b6e092016-12-01 12:49:20 -08001600 // Test that the media monitor can be run and gives callbacks.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601 void TestMediaMonitor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 CreateChannels(0, 0);
1603 EXPECT_TRUE(SendInitiate());
1604 EXPECT_TRUE(SendAccept());
1605 channel1_->StartMediaMonitor(100);
1606 channel2_->StartMediaMonitor(100);
1607 // Ensure we get callbacks and stop.
deadbeefc6b6e092016-12-01 12:49:20 -08001608 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
1609 EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610 channel1_->StopMediaMonitor();
1611 channel2_->StopMediaMonitor();
1612 // Ensure a restart of a stopped monitor works.
1613 channel1_->StartMediaMonitor(100);
deadbeefc6b6e092016-12-01 12:49:20 -08001614 EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 channel1_->StopMediaMonitor();
1616 // Ensure stopping a stopped monitor is OK.
1617 channel1_->StopMediaMonitor();
1618 }
1619
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620 void TestSetContentFailure() {
1621 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622
Peter Thatchera6d24442015-07-09 21:26:36 -07001623 auto sdesc = cricket::SessionDescription();
1624 sdesc.AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
1625 new cricket::AudioContentDescription());
1626 sdesc.AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
1627 new cricket::VideoContentDescription());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628
Peter Thatchera6d24442015-07-09 21:26:36 -07001629 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 media_channel1_->set_fail_set_recv_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001631 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1632 &sdesc, cricket::CA_OFFER, &err));
1633 EXPECT_FALSE(channel1_->PushdownLocalDescription(
1634 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001637 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1638 &sdesc, cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 media_channel1_->set_fail_set_send_codecs(true);
Peter Thatchera6d24442015-07-09 21:26:36 -07001640 EXPECT_FALSE(channel1_->PushdownRemoteDescription(
1641 &sdesc, cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 }
1643
1644 void TestSendTwoOffers() {
1645 CreateChannels(0, 0);
1646
Peter Thatchera6d24442015-07-09 21:26:36 -07001647 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001648 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001649 CreateSessionDescriptionWithStream(1));
1650 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1651 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1653
kwiberg31022942016-03-11 14:18:21 -08001654 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001655 CreateSessionDescriptionWithStream(2));
1656 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1657 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1659 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1660 }
1661
1662 void TestReceiveTwoOffers() {
1663 CreateChannels(0, 0);
1664
Peter Thatchera6d24442015-07-09 21:26:36 -07001665 std::string err;
kwiberg31022942016-03-11 14:18:21 -08001666 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001667 CreateSessionDescriptionWithStream(1));
1668 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1669 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1671
kwiberg31022942016-03-11 14:18:21 -08001672 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001673 CreateSessionDescriptionWithStream(2));
1674 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1675 sdesc2.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1677 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1678 }
1679
1680 void TestSendPrAnswer() {
1681 CreateChannels(0, 0);
1682
Peter Thatchera6d24442015-07-09 21:26:36 -07001683 std::string err;
1684 // Receive offer
kwiberg31022942016-03-11 14:18:21 -08001685 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001686 CreateSessionDescriptionWithStream(1));
1687 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1688 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1690
Peter Thatchera6d24442015-07-09 21:26:36 -07001691 // Send PR answer
kwiberg31022942016-03-11 14:18:21 -08001692 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001693 CreateSessionDescriptionWithStream(2));
1694 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1695 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1697 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1698
Peter Thatchera6d24442015-07-09 21:26:36 -07001699 // Send answer
kwiberg31022942016-03-11 14:18:21 -08001700 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001701 CreateSessionDescriptionWithStream(3));
1702 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1703 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1705 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1706 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1707 }
1708
1709 void TestReceivePrAnswer() {
1710 CreateChannels(0, 0);
1711
Peter Thatchera6d24442015-07-09 21:26:36 -07001712 std::string err;
1713 // Send offer
kwiberg31022942016-03-11 14:18:21 -08001714 std::unique_ptr<cricket::SessionDescription> sdesc1(
Peter Thatchera6d24442015-07-09 21:26:36 -07001715 CreateSessionDescriptionWithStream(1));
1716 EXPECT_TRUE(channel1_->PushdownLocalDescription(
1717 sdesc1.get(), cricket::CA_OFFER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1719
Peter Thatchera6d24442015-07-09 21:26:36 -07001720 // Receive PR answer
kwiberg31022942016-03-11 14:18:21 -08001721 std::unique_ptr<cricket::SessionDescription> sdesc2(
Peter Thatchera6d24442015-07-09 21:26:36 -07001722 CreateSessionDescriptionWithStream(2));
1723 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1724 sdesc2.get(), cricket::CA_PRANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1726 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1727
Peter Thatchera6d24442015-07-09 21:26:36 -07001728 // Receive answer
kwiberg31022942016-03-11 14:18:21 -08001729 std::unique_ptr<cricket::SessionDescription> sdesc3(
Peter Thatchera6d24442015-07-09 21:26:36 -07001730 CreateSessionDescriptionWithStream(3));
1731 EXPECT_TRUE(channel1_->PushdownRemoteDescription(
1732 sdesc3.get(), cricket::CA_ANSWER, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1734 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1735 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1736 }
1737
1738 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001739 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_TRUE(SendInitiate());
1741 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -08001742 EXPECT_TRUE(channel1_->NeedsRtcpTransport());
1743 EXPECT_TRUE(channel2_->NeedsRtcpTransport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744
1745 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 // The sending message is only posted. channel2_ should be empty.
1748 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1750 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751
1752 // When channel1_ is deleted, the RTCP packet should be sent out to
1753 // channel2_.
1754 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001755 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756 EXPECT_TRUE(CheckRtcp2());
1757 }
1758
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001759 void TestSrtpError(int pl_type) {
solenberg5b14b422015-10-01 04:10:31 -07001760 struct SrtpErrorHandler : public sigslot::has_slots<> {
1761 SrtpErrorHandler() :
1762 mode_(cricket::SrtpFilter::UNPROTECT),
1763 error_(cricket::SrtpFilter::ERROR_NONE) {}
1764 void OnSrtpError(uint32 ssrc, cricket::SrtpFilter::Mode mode,
1765 cricket::SrtpFilter::Error error) {
1766 mode_ = mode;
1767 error_ = error;
1768 }
1769 cricket::SrtpFilter::Mode mode_;
1770 cricket::SrtpFilter::Error error_;
1771 } error_handler;
1772
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001773 // For Audio, only pl_type 0 is added to the bundle filter.
1774 // For Video, only pl_type 97 is added to the bundle filter.
1775 // So we need to pass in pl_type so that the packet can pass through
1776 // the bundle filter before it can be processed by the srtp filter.
1777 // The packet is not a valid srtp packet because it is too short.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778 static unsigned const char kBadPacket[] = {
1779 0x84, static_cast<unsigned char>(pl_type),
1780 0x00, 0x01,
1781 0x00, 0x00,
1782 0x00, 0x00,
1783 0x00, 0x00,
1784 0x00, 0x01};
Taylor Brandstetter88532892016-08-01 14:17:27 -07001785
1786 // Using fake clock because this tests that SRTP errors are signaled at
1787 // specific times based on set_signal_silent_time.
1788 rtc::ScopedFakeClock fake_clock;
deadbeeff5346592017-01-24 21:51:21 -08001789
1790 CreateChannels(SECURE, SECURE);
Taylor Brandstetter88532892016-08-01 14:17:27 -07001791 // Some code uses a time of 0 as a special value, so we must start with
1792 // a non-zero time.
1793 // TODO(deadbeef): Fix this.
1794 fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
1795
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 EXPECT_FALSE(channel1_->secure());
1797 EXPECT_FALSE(channel2_->secure());
1798 EXPECT_TRUE(SendInitiate());
1799 EXPECT_TRUE(SendAccept());
1800 EXPECT_TRUE(channel1_->secure());
1801 EXPECT_TRUE(channel2_->secure());
solenberg5629a1d2015-10-01 08:45:57 -07001802 channel2_->srtp_filter()->set_signal_silent_time(250);
solenberg5b14b422015-10-01 04:10:31 -07001803 channel2_->srtp_filter()->SignalSrtpError.connect(
1804 &error_handler, &SrtpErrorHandler::OnSrtpError);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805
1806 // Testing failures in sending packets.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001807 media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket),
1808 rtc::PacketOptions());
1809 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 // The first failure will trigger an error.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001811 EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_handler.error_);
solenberg5b14b422015-10-01 04:10:31 -07001812 EXPECT_EQ(cricket::SrtpFilter::PROTECT, error_handler.mode_);
1813 error_handler.error_ = cricket::SrtpFilter::ERROR_NONE;
solenberg5629a1d2015-10-01 08:45:57 -07001814 error_handler.mode_ = cricket::SrtpFilter::UNPROTECT;
1815 // The next 250 ms failures will not trigger an error.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001816 media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket),
1817 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 // Wait for a while to ensure no message comes in.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001819 WaitForThreads();
Taylor Brandstetter88532892016-08-01 14:17:27 -07001820 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(200));
solenberg5b14b422015-10-01 04:10:31 -07001821 EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_handler.error_);
solenberg5629a1d2015-10-01 08:45:57 -07001822 EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, error_handler.mode_);
1823 // Wait for a little more - the error will be triggered again.
Taylor Brandstetter88532892016-08-01 14:17:27 -07001824 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(200));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001825 media_channel2_->SendRtp(kBadPacket, sizeof(kBadPacket),
1826 rtc::PacketOptions());
1827 WaitForThreads();
1828 EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_handler.error_);
solenberg5b14b422015-10-01 04:10:31 -07001829 EXPECT_EQ(cricket::SrtpFilter::PROTECT, error_handler.mode_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830
1831 // Testing failures in receiving packets.
solenberg5b14b422015-10-01 04:10:31 -07001832 error_handler.error_ = cricket::SrtpFilter::ERROR_NONE;
solenberg5629a1d2015-10-01 08:45:57 -07001833 error_handler.mode_ = cricket::SrtpFilter::UNPROTECT;
solenberg5b14b422015-10-01 04:10:31 -07001834
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001835 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001836 fake_rtp_dtls_transport2_->SignalReadPacket(
1837 fake_rtp_dtls_transport2_.get(),
1838 reinterpret_cast<const char*>(kBadPacket), sizeof(kBadPacket),
1839 rtc::PacketTime(), 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001840 });
1841 EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_handler.error_);
solenberg5b14b422015-10-01 04:10:31 -07001842 EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, error_handler.mode_);
deadbeeff5346592017-01-24 21:51:21 -08001843 // Terminate channels/threads before the fake clock is destroyed.
1844 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 }
1846
zstein56162b92017-04-24 16:54:35 -07001847 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001848 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001849 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001850
zstein56162b92017-04-24 16:54:35 -07001851 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001852 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 EXPECT_TRUE(media_channel1_->ready_to_send());
1854
zstein56162b92017-04-24 16:54:35 -07001855 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001856 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 }
1859
zstein56162b92017-04-24 16:54:35 -07001860 void TestOnTransportReadyToSendWithRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -08001861 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 typename T::Content content;
1863 CreateContent(0, kPcmuCodec, kH264Codec, &content);
deadbeeff5346592017-01-24 21:51:21 -08001864 // Both sides agree on mux. Should signal that RTCP mux is fully active.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865 content.set_rtcp_mux(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001866 EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001867 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +00001868 EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
deadbeeff5346592017-01-24 21:51:21 -08001869 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
1870 cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871 EXPECT_FALSE(media_channel1_->ready_to_send());
1872 // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
1873 // should trigger the MediaChannel's OnReadyToSend.
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001874 network_thread_->Invoke<void>(RTC_FROM_HERE,
1875 [rtp] { rtp->SignalReadyToSend(rtp); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001876 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877 EXPECT_TRUE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878
zstein56162b92017-04-24 16:54:35 -07001879 // TODO(zstein): Find a way to test this without making
1880 // OnTransportReadyToSend public.
1881 network_thread_->Invoke<void>(
1882 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001883 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 EXPECT_FALSE(media_channel1_->ready_to_send());
1885 }
1886
skvladdc1c62c2016-03-16 19:07:43 -07001887 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1888 typename T::Content content;
1889 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1890 content.set_bandwidth(remote_limit);
1891 return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
1892 }
1893
deadbeefe702b302017-02-04 12:09:01 -08001894 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001895 webrtc::RtpParameters parameters;
1896 webrtc::RtpEncodingParameters encoding;
1897 encoding.max_bitrate_bps = limit;
1898 parameters.encodings.push_back(encoding);
1899 return parameters;
1900 }
1901
1902 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001903 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001904 EXPECT_EQ(1UL, parameters.encodings.size());
1905 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1906 }
1907
1908 void DefaultMaxBitrateIsUnlimited() {
1909 CreateChannels(0, 0);
1910 EXPECT_TRUE(
1911 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1912 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001913 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1914 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001915 }
1916
1917 void CanChangeMaxBitrate() {
1918 CreateChannels(0, 0);
1919 EXPECT_TRUE(
1920 channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
1921
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001922 EXPECT_TRUE(channel1_->SetRtpSendParameters(
deadbeefe702b302017-02-04 12:09:01 -08001923 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
1924 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1925 rtc::Optional<int>(1000));
1926 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1927 rtc::Optional<int>(1000));
skvladdc1c62c2016-03-16 19:07:43 -07001928 EXPECT_EQ(-1, media_channel1_->max_bps());
1929
deadbeefe702b302017-02-04 12:09:01 -08001930 EXPECT_TRUE(channel1_->SetRtpSendParameters(
1931 kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
1932 VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
1933 rtc::Optional<int>());
1934 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
1935 rtc::Optional<int>());
skvladdc1c62c2016-03-16 19:07:43 -07001936 EXPECT_EQ(-1, media_channel1_->max_bps());
1937 }
1938
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001940 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1941 static void ProcessThreadQueue(rtc::Thread* thread) {
1942 RTC_DCHECK(thread->IsCurrent());
1943 while (!thread->empty()) {
1944 thread->ProcessMessages(0);
1945 }
1946 }
1947 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1948 // |threads| and current thread post packets to network thread.
1949 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001950 thread->Invoke<void>(RTC_FROM_HERE,
1951 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001952 }
1953 ProcessThreadQueue(rtc::Thread::Current());
1954 // Network thread move them around and post back to worker = current thread.
1955 if (!network_thread_->IsCurrent()) {
1956 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001957 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958 }
1959 // Worker thread = current Thread process received messages.
1960 ProcessThreadQueue(rtc::Thread::Current());
1961 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001962 // TODO(pbos): Remove playout from all media channels and let renderers mute
1963 // themselves.
1964 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1966 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001967 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1968 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1969 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1970 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1971 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1972 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1973 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1974 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 cricket::FakeMediaEngine media_engine_;
1976 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001977 typename T::MediaChannel* media_channel1_ = nullptr;
1978 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001979 std::unique_ptr<typename T::Channel> channel1_;
1980 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001981 typename T::Content local_media_content1_;
1982 typename T::Content local_media_content2_;
1983 typename T::Content remote_media_content1_;
1984 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001986 rtc::Buffer rtp_packet_;
1987 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001988 int media_info_callbacks1_ = 0;
1989 int media_info_callbacks2_ = 0;
1990 int rtcp_mux_activated_callbacks1_ = 0;
1991 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001992 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993};
1994
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001995template<>
1996void ChannelTest<VoiceTraits>::CreateContent(
1997 int flags,
1998 const cricket::AudioCodec& audio_codec,
1999 const cricket::VideoCodec& video_codec,
2000 cricket::AudioContentDescription* audio) {
2001 audio->AddCodec(audio_codec);
2002 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
2003 if (flags & SECURE) {
2004 audio->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002005 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
2006 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 }
2008}
2009
2010template<>
2011void ChannelTest<VoiceTraits>::CopyContent(
2012 const cricket::AudioContentDescription& source,
2013 cricket::AudioContentDescription* audio) {
2014 *audio = source;
2015}
2016
2017template<>
2018bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
2019 const cricket::AudioCodec& c2) {
2020 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
2021 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
2022}
2023
Peter Boström0c4e06b2015-10-07 12:23:21 +02002024template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002025void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002026 uint32_t ssrc,
2027 int flags,
2028 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 audio->AddLegacyStream(ssrc);
2030}
2031
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002032class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002033 public:
solenberg1dd98f32015-09-10 01:57:14 -07002034 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002035 VoiceChannelSingleThreadTest()
2036 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
2037};
2038
2039class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
2040 public:
2041 typedef ChannelTest<VoiceTraits> Base;
2042 VoiceChannelDoubleThreadTest()
2043 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002044};
2045
2046// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07002047template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002049 rtc::Thread* worker_thread,
2050 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002051 cricket::MediaEngineInterface* engine,
2052 cricket::FakeVideoMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08002053 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
2054 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08002055 rtc::PacketTransportInternal* fake_rtp_packet_transport,
2056 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07002057 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002058 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef7af91dd2016-12-13 11:29:11 -08002059 cricket::VideoChannel* channel = new cricket::VideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08002060 worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
deadbeefac22f702017-01-12 21:59:29 -08002061 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08002062 if (!channel->NeedsRtcpTransport()) {
2063 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08002064 }
deadbeeff5346592017-01-24 21:51:21 -08002065 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
2066 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 delete channel;
2068 channel = NULL;
2069 }
2070 return channel;
2071}
2072
2073// override to add 0 parameter
2074template<>
2075bool ChannelTest<VideoTraits>::AddStream1(int id) {
2076 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
2077}
2078
2079template<>
2080void ChannelTest<VideoTraits>::CreateContent(
2081 int flags,
2082 const cricket::AudioCodec& audio_codec,
2083 const cricket::VideoCodec& video_codec,
2084 cricket::VideoContentDescription* video) {
2085 video->AddCodec(video_codec);
2086 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
2087 if (flags & SECURE) {
2088 video->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07002089 1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
2090 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 }
2092}
2093
2094template<>
2095void ChannelTest<VideoTraits>::CopyContent(
2096 const cricket::VideoContentDescription& source,
2097 cricket::VideoContentDescription* video) {
2098 *video = source;
2099}
2100
2101template<>
2102bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
2103 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07002104 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105}
2106
Peter Boström0c4e06b2015-10-07 12:23:21 +02002107template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002109 uint32_t ssrc,
2110 int flags,
2111 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112 video->AddLegacyStream(ssrc);
2113}
2114
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002115class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116 public:
solenberg1dd98f32015-09-10 01:57:14 -07002117 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002118 VideoChannelSingleThreadTest()
2119 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120};
2121
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002122class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
2123 public:
2124 typedef ChannelTest<VideoTraits> Base;
2125 VideoChannelDoubleThreadTest()
2126 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
2127};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002129// VoiceChannelSingleThreadTest
kjellander7c856582017-02-26 19:53:40 -08002130// Flaky on iOS Simualtor: bugs.webrtc.org/7247
2131#if defined(WEBRTC_IOS)
2132#define MAYBE_TestInit DISABLED_TestInit
2133#else
2134#define MAYBE_TestInit TestInit
2135#endif
2136TEST_F(VoiceChannelSingleThreadTest, MAYBE_TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 Base::TestInit();
2138 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2139 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
2140}
2141
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002142TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
2143 Base::TestDeinit();
2144}
2145
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002146TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147 Base::TestSetContents();
2148}
2149
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002150TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151 Base::TestSetContentsNullOffer();
2152}
2153
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002154TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002155 Base::TestSetContentsRtcpMux();
2156}
2157
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002158TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159 Base::TestSetContentsRtcpMux();
2160}
2161
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002162TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163 Base::TestSetRemoteContentUpdate();
2164}
2165
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002166TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 Base::TestStreams();
2168}
2169
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002170TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 Base::TestUpdateStreamsInLocalContent();
2172}
2173
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002174TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175 Base::TestUpdateStreamsInRemoteContent();
2176}
2177
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002178TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179 Base::TestChangeStreamParamsInContent();
2180}
2181
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 Base::TestPlayoutAndSendingStates();
2184}
2185
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002186TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002187 CreateChannels(0, 0);
2188 // Test that we can Mute the default channel even though the sending SSRC
2189 // is unknown.
2190 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
solenberg1dd98f32015-09-10 01:57:14 -07002191 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002192 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2193 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002194 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2195
2196 // Test that we can not mute an unknown SSRC.
solenbergdfc8f4f2015-10-01 02:31:10 -07002197 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002198
2199 SendInitiate();
2200 // After the local session description has been set, we can mute a stream
2201 // with its SSRC.
solenberg1dd98f32015-09-10 01:57:14 -07002202 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002203 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2204 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002205 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206}
2207
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002208TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 Base::TestMediaContentDirection();
2210}
2211
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002212TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002213 Base::TestNetworkRouteChanges();
2214}
2215
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002216TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002217 Base::TestCallSetup();
2218}
2219
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002220TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221 Base::TestCallTeardownRtcpMux();
2222}
2223
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002224TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225 Base::SendRtpToRtp();
2226}
2227
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002228TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229 Base::SendRtcpToRtcp();
2230}
2231
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002232TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002233 Base::SendRtcpMuxToRtcp();
2234}
2235
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002236TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237 Base::SendRtcpMuxToRtcpMux();
2238}
2239
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002240TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002241 Base::SendRequireRtcpMuxToRtcpMux();
2242}
2243
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002245 Base::SendRtcpMuxToRequireRtcpMux();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002249 Base::SendRequireRtcpMuxToRequireRtcpMux();
2250}
2251
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002252TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002253 Base::SendRequireRtcpMuxToNoRtcpMux();
2254}
2255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 Base::SendEarlyRtcpMuxToRtcp();
2258}
2259
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002260TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 Base::SendEarlyRtcpMuxToRtcpMux();
2262}
2263
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002264TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002265 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269 Base::SendSrtpToSrtp();
2270}
2271
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002272TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2274}
2275
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 Base::SendSrtpToSrtp(DTLS, 0);
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 Base::SendSrtpToSrtp(DTLS, DTLS);
2282}
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2286}
2287
deadbeeff5346592017-01-24 21:51:21 -08002288// Test using the channel with a raw packet interface, as opposed to a DTLS
2289// transport interface.
2290TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2291 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2292}
2293
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002294TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2296}
2297
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002298TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299 Base::SendRtpToRtpOnThread();
2300}
2301
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303 Base::SendSrtpToSrtpOnThread();
2304}
2305
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307 Base::SendWithWritabilityLoss();
2308}
2309
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002310TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311 Base::TestMediaMonitor();
2312}
2313
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314// Test that InsertDtmf properly forwards to the media channel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002315TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 CreateChannels(0, 0);
2317 EXPECT_TRUE(SendInitiate());
2318 EXPECT_TRUE(SendAccept());
2319 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2320
solenberg1d63dd02015-12-02 12:35:09 -08002321 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2322 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2323 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002325 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
solenberg1d63dd02015-12-02 12:35:09 -08002327 1, 3, 100));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002328 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
solenberg1d63dd02015-12-02 12:35:09 -08002329 2, 5, 110));
henrike@webrtc.org9de257d2013-07-17 14:42:53 +00002330 EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
solenberg1d63dd02015-12-02 12:35:09 -08002331 3, 7, 120));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332}
2333
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002334TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 Base::TestSetContentFailure();
2336}
2337
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002338TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 Base::TestSendTwoOffers();
2340}
2341
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002342TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343 Base::TestReceiveTwoOffers();
2344}
2345
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002346TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 Base::TestSendPrAnswer();
2348}
2349
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002350TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 Base::TestReceivePrAnswer();
2352}
2353
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002354TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 Base::TestFlushRtcp();
2356}
2357
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002358TEST_F(VoiceChannelSingleThreadTest, TestSrtpError) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002359 Base::TestSrtpError(kAudioPts[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360}
2361
zstein56162b92017-04-24 16:54:35 -07002362TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
2363 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364}
2365
zstein56162b92017-04-24 16:54:35 -07002366TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2367 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368}
2369
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370// Test that we can scale the output volume properly for 1:1 calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002371TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002372 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 EXPECT_TRUE(SendInitiate());
2374 EXPECT_TRUE(SendAccept());
solenberg4bac9c52015-10-09 02:32:53 -07002375 double volume;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376
solenberg4bac9c52015-10-09 02:32:53 -07002377 // Default is (1.0).
2378 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2379 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002381 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382
solenberg4bac9c52015-10-09 02:32:53 -07002383 // Set scale to (1.5).
2384 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2385 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2386 EXPECT_DOUBLE_EQ(1.5, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387
solenberg4bac9c52015-10-09 02:32:53 -07002388 // Set scale to (0).
2389 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2390 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2391 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392}
2393
2394// Test that we can scale the output volume properly for multiway calls.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002395TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002396 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 EXPECT_TRUE(SendInitiate());
2398 EXPECT_TRUE(SendAccept());
2399 EXPECT_TRUE(AddStream1(1));
2400 EXPECT_TRUE(AddStream1(2));
2401
solenberg4bac9c52015-10-09 02:32:53 -07002402 double volume;
2403 // Default is (1.0).
2404 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2405 EXPECT_DOUBLE_EQ(1.0, volume);
2406 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2407 EXPECT_DOUBLE_EQ(1.0, volume);
2408 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2409 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 // invalid ssrc.
solenberg4bac9c52015-10-09 02:32:53 -07002411 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412
solenberg4bac9c52015-10-09 02:32:53 -07002413 // Set scale to (1.5) for ssrc = 1.
2414 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2415 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2416 EXPECT_DOUBLE_EQ(1.5, volume);
2417 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2418 EXPECT_DOUBLE_EQ(1.0, volume);
2419 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2420 EXPECT_DOUBLE_EQ(1.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421
solenberg4bac9c52015-10-09 02:32:53 -07002422 // Set scale to (0) for all ssrcs.
2423 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2424 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2425 EXPECT_DOUBLE_EQ(0.0, volume);
2426 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2427 EXPECT_DOUBLE_EQ(0.0, volume);
2428 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2429 EXPECT_DOUBLE_EQ(0.0, volume);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430}
2431
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002432TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002433 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434}
2435
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002436TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002437 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002438}
2439
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002440TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002441 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002442}
2443
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002444TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002445 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446}
2447
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002448TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07002449 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07002450}
2451
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002452TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
skvlade0d46372016-04-07 22:59:22 -07002453 Base::CanChangeMaxBitrate();
skvladdc1c62c2016-03-16 19:07:43 -07002454}
2455
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002456// VoiceChannelDoubleThreadTest
2457TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2460 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002461}
2462
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002463TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
2464 Base::TestDeinit();
2465}
2466
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002467TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 Base::TestSetContents();
2469}
2470
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002471TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472 Base::TestSetContentsNullOffer();
2473}
2474
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002475TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002476 Base::TestSetContentsRtcpMux();
2477}
2478
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002479TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 Base::TestSetContentsRtcpMux();
2481}
2482
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002483TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 Base::TestSetRemoteContentUpdate();
2485}
2486
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002487TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 Base::TestStreams();
2489}
2490
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002491TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::TestUpdateStreamsInLocalContent();
2493}
2494
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002495TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 Base::TestUpdateStreamsInRemoteContent();
2497}
2498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002499TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::TestChangeStreamParamsInContent();
2501}
2502
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002503TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestPlayoutAndSendingStates();
2505}
2506
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002507TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
2508 CreateChannels(0, 0);
2509 // Test that we can Mute the default channel even though the sending SSRC
2510 // is unknown.
2511 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2512 EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
2513 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
2514 EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
2515 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2516
2517 // Test that we can not mute an unknown SSRC.
2518 EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2519
2520 SendInitiate();
2521 // After the local session description has been set, we can mute a stream
2522 // with its SSRC.
2523 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2524 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
2525 EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2526 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
2527}
2528
2529TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
2530 Base::TestMediaContentDirection();
2531}
2532
2533TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
2534 Base::TestNetworkRouteChanges();
2535}
2536
2537TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
2538 Base::TestCallSetup();
2539}
2540
2541TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2542 Base::TestCallTeardownRtcpMux();
2543}
2544
2545TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
2546 Base::SendRtpToRtp();
2547}
2548
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002549TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
2550 Base::SendRtcpToRtcp();
2551}
2552
2553TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
2554 Base::SendRtcpMuxToRtcp();
2555}
2556
2557TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
2558 Base::SendRtcpMuxToRtcpMux();
2559}
2560
2561TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
2562 Base::SendRequireRtcpMuxToRtcpMux();
2563}
2564
2565TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
2566 Base::SendRtcpMuxToRequireRtcpMux();
2567}
2568
2569TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
2570 Base::SendRequireRtcpMuxToRequireRtcpMux();
2571}
2572
2573TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
2574 Base::SendRequireRtcpMuxToNoRtcpMux();
2575}
2576
2577TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
2578 Base::SendEarlyRtcpMuxToRtcp();
2579}
2580
2581TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
2582 Base::SendEarlyRtcpMuxToRtcpMux();
2583}
2584
2585TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
2586 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2587}
2588
2589TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
2590 Base::SendSrtpToSrtp();
2591}
2592
2593TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
2594 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2595}
2596
2597TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002598 Base::SendSrtpToSrtp(DTLS, 0);
2599}
2600
2601TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002602 Base::SendSrtpToSrtp(DTLS, DTLS);
2603}
2604
2605TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002606 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2607}
2608
deadbeeff5346592017-01-24 21:51:21 -08002609// Test using the channel with a raw packet interface, as opposed to a DTLS
2610// transport interface.
2611TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2612 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2613}
2614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002615TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2616 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2617}
2618
2619TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2620 Base::SendRtpToRtpOnThread();
2621}
2622
2623TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
2624 Base::SendSrtpToSrtpOnThread();
2625}
2626
2627TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
2628 Base::SendWithWritabilityLoss();
2629}
2630
2631TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
2632 Base::TestMediaMonitor();
2633}
2634
2635// Test that InsertDtmf properly forwards to the media channel.
2636TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
2637 CreateChannels(0, 0);
2638 EXPECT_TRUE(SendInitiate());
2639 EXPECT_TRUE(SendAccept());
2640 EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
2641
2642 EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
2643 EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
2644 EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
2645
2646 ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
2647 EXPECT_TRUE(
2648 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
2649 EXPECT_TRUE(
2650 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
2651 EXPECT_TRUE(
2652 CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
2653}
2654
2655TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
2656 Base::TestSetContentFailure();
2657}
2658
2659TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
2660 Base::TestSendTwoOffers();
2661}
2662
2663TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
2664 Base::TestReceiveTwoOffers();
2665}
2666
2667TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
2668 Base::TestSendPrAnswer();
2669}
2670
2671TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
2672 Base::TestReceivePrAnswer();
2673}
2674
2675TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
2676 Base::TestFlushRtcp();
2677}
2678
2679TEST_F(VoiceChannelDoubleThreadTest, TestSrtpError) {
2680 Base::TestSrtpError(kAudioPts[0]);
2681}
2682
zstein56162b92017-04-24 16:54:35 -07002683TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2684 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002685}
2686
zstein56162b92017-04-24 16:54:35 -07002687TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
2688 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002689}
2690
2691// Test that we can scale the output volume properly for 1:1 calls.
2692TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
deadbeefac22f702017-01-12 21:59:29 -08002693 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002694 EXPECT_TRUE(SendInitiate());
2695 EXPECT_TRUE(SendAccept());
2696 double volume;
2697
2698 // Default is (1.0).
2699 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2700 EXPECT_DOUBLE_EQ(1.0, volume);
2701 // invalid ssrc.
2702 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2703
2704 // Set scale to (1.5).
2705 EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
2706 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2707 EXPECT_DOUBLE_EQ(1.5, volume);
2708
2709 // Set scale to (0).
2710 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2711 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2712 EXPECT_DOUBLE_EQ(0.0, volume);
2713}
2714
2715// Test that we can scale the output volume properly for multiway calls.
2716TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
deadbeefac22f702017-01-12 21:59:29 -08002717 CreateChannels(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002718 EXPECT_TRUE(SendInitiate());
2719 EXPECT_TRUE(SendAccept());
2720 EXPECT_TRUE(AddStream1(1));
2721 EXPECT_TRUE(AddStream1(2));
2722
2723 double volume;
2724 // Default is (1.0).
2725 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2726 EXPECT_DOUBLE_EQ(1.0, volume);
2727 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2728 EXPECT_DOUBLE_EQ(1.0, volume);
2729 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2730 EXPECT_DOUBLE_EQ(1.0, volume);
2731 // invalid ssrc.
2732 EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
2733
2734 // Set scale to (1.5) for ssrc = 1.
2735 EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
2736 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2737 EXPECT_DOUBLE_EQ(1.5, volume);
2738 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2739 EXPECT_DOUBLE_EQ(1.0, volume);
2740 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2741 EXPECT_DOUBLE_EQ(1.0, volume);
2742
2743 // Set scale to (0) for all ssrcs.
2744 EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
2745 EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
2746 EXPECT_DOUBLE_EQ(0.0, volume);
2747 EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
2748 EXPECT_DOUBLE_EQ(0.0, volume);
2749 EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
2750 EXPECT_DOUBLE_EQ(0.0, volume);
2751}
2752
2753TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
2754 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
2755}
2756
2757TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
2758 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
2759}
2760
2761TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2762 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
2763}
2764
2765TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2766 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
2767}
2768
2769TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2770 Base::DefaultMaxBitrateIsUnlimited();
2771}
2772
2773TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
2774 Base::CanChangeMaxBitrate();
2775}
2776
2777// VideoChannelSingleThreadTest
2778TEST_F(VideoChannelSingleThreadTest, TestInit) {
2779 Base::TestInit();
2780}
2781
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002782TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
2783 Base::TestDeinit();
2784}
2785
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002786TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
2787 Base::TestSetContents();
2788}
2789
2790TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2791 Base::TestSetContentsNullOffer();
2792}
2793
2794TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2795 Base::TestSetContentsRtcpMux();
2796}
2797
2798TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2799 Base::TestSetContentsRtcpMux();
2800}
2801
2802TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
2803 Base::TestSetRemoteContentUpdate();
2804}
2805
2806TEST_F(VideoChannelSingleThreadTest, TestStreams) {
2807 Base::TestStreams();
2808}
2809
2810TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
2811 Base::TestUpdateStreamsInLocalContent();
2812}
2813
2814TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
2815 Base::TestUpdateStreamsInRemoteContent();
2816}
2817
2818TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2819 Base::TestChangeStreamParamsInContent();
2820}
2821
2822TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2823 Base::TestPlayoutAndSendingStates();
2824}
2825
2826TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
solenberg1dd98f32015-09-10 01:57:14 -07002827 CreateChannels(0, 0);
2828 // Test that we can Mute the default channel even though the sending SSRC
2829 // is unknown.
2830 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002831 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002832 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07002833 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002834 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2835 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002836 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002837 SendInitiate();
2838 // After the local session description has been set, we can mute a stream
2839 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07002840 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
solenbergdfc8f4f2015-10-01 02:31:10 -07002841 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07002842 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
solenberg1dd98f32015-09-10 01:57:14 -07002843 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002844}
2845
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002846TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 Base::TestMediaContentDirection();
2848}
2849
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002850TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002851 Base::TestNetworkRouteChanges();
2852}
2853
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002854TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 Base::TestCallSetup();
2856}
2857
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002858TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002859 Base::TestCallTeardownRtcpMux();
2860}
2861
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002862TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863 Base::SendRtpToRtp();
2864}
2865
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002866TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002867 Base::SendRtcpToRtcp();
2868}
2869
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002870TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002871 Base::SendRtcpMuxToRtcp();
2872}
2873
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002874TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 Base::SendRtcpMuxToRtcpMux();
2876}
2877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002878TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002879 Base::SendRequireRtcpMuxToRtcpMux();
2880}
2881
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002882TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002883 Base::SendRtcpMuxToRequireRtcpMux();
2884}
2885
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002886TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002887 Base::SendRequireRtcpMuxToRequireRtcpMux();
2888}
2889
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002890TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
Peter Thatcheraf55ccc2015-05-21 07:48:41 -07002891 Base::SendRequireRtcpMuxToNoRtcpMux();
2892}
2893
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002894TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002895 Base::SendEarlyRtcpMuxToRtcp();
2896}
2897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002898TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899 Base::SendEarlyRtcpMuxToRtcpMux();
2900}
2901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002902TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 Base::SendSrtpToSrtp();
2904}
2905
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002906TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 Base::SendSrtpToSrtp();
2908}
2909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002910TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 Base::SendSrtpToSrtp(DTLS, 0);
2912}
2913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002914TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 Base::SendSrtpToSrtp(DTLS, DTLS);
2916}
2917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002918TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
2920}
2921
deadbeeff5346592017-01-24 21:51:21 -08002922// Test using the channel with a raw packet interface, as opposed to a DTLS
2923// transport interface.
2924TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
2925 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
2926}
2927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002928TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
2930}
2931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002932TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2934}
2935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002936TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 Base::SendRtpToRtpOnThread();
2938}
2939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002940TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 Base::SendSrtpToSrtpOnThread();
2942}
2943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002944TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945 Base::SendWithWritabilityLoss();
2946}
2947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002948TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949 Base::TestMediaMonitor();
2950}
2951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002952TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 Base::TestSetContentFailure();
2954}
2955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002956TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 Base::TestSendTwoOffers();
2958}
2959
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002960TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 Base::TestReceiveTwoOffers();
2962}
2963
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002964TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002965 Base::TestSendPrAnswer();
2966}
2967
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002968TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969 Base::TestReceivePrAnswer();
2970}
2971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002972TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973 Base::TestFlushRtcp();
2974}
2975
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002976TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002977 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978}
2979
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002980TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002981 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002982}
2983
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002984TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002985 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002986}
2987
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002988TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002989 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002990}
2991
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002992TEST_F(VideoChannelSingleThreadTest, TestSrtpError) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002993 Base::TestSrtpError(kVideoPts[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994}
2995
zstein56162b92017-04-24 16:54:35 -07002996TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2997 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998}
2999
zstein56162b92017-04-24 16:54:35 -07003000TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3001 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002}
3003
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003004TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07003005 Base::DefaultMaxBitrateIsUnlimited();
3006}
3007
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003008TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07003009 Base::CanChangeMaxBitrate();
3010}
3011
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003012// VideoChannelDoubleThreadTest
3013TEST_F(VideoChannelDoubleThreadTest, TestInit) {
3014 Base::TestInit();
3015}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003017TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
3018 Base::TestDeinit();
3019}
3020
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003021TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
3022 Base::TestSetContents();
3023}
3024
3025TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
3026 Base::TestSetContentsNullOffer();
3027}
3028
3029TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
3030 Base::TestSetContentsRtcpMux();
3031}
3032
3033TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
3034 Base::TestSetContentsRtcpMux();
3035}
3036
3037TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
3038 Base::TestSetRemoteContentUpdate();
3039}
3040
3041TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
3042 Base::TestStreams();
3043}
3044
3045TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
3046 Base::TestUpdateStreamsInLocalContent();
3047}
3048
3049TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
3050 Base::TestUpdateStreamsInRemoteContent();
3051}
3052
3053TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
3054 Base::TestChangeStreamParamsInContent();
3055}
3056
3057TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
3058 Base::TestPlayoutAndSendingStates();
3059}
3060
3061TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
3062 CreateChannels(0, 0);
3063 // Test that we can Mute the default channel even though the sending SSRC
3064 // is unknown.
3065 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003066 EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003067 EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
deadbeef5a4a75a2016-06-02 16:23:38 -07003068 EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003069 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3070 // Test that we can not mute an unknown SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003071 EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003072 SendInitiate();
3073 // After the local session description has been set, we can mute a stream
3074 // with its SSRC.
deadbeef5a4a75a2016-06-02 16:23:38 -07003075 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003076 EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
deadbeef5a4a75a2016-06-02 16:23:38 -07003077 EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003078 EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
3079}
3080
3081TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
3082 Base::TestMediaContentDirection();
3083}
3084
3085TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
3086 Base::TestNetworkRouteChanges();
3087}
3088
3089TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
3090 Base::TestCallSetup();
3091}
3092
3093TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
3094 Base::TestCallTeardownRtcpMux();
3095}
3096
3097TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
3098 Base::SendRtpToRtp();
3099}
3100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003101TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
3102 Base::SendRtcpToRtcp();
3103}
3104
3105TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
3106 Base::SendRtcpMuxToRtcp();
3107}
3108
3109TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
3110 Base::SendRtcpMuxToRtcpMux();
3111}
3112
3113TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
3114 Base::SendRequireRtcpMuxToRtcpMux();
3115}
3116
3117TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
3118 Base::SendRtcpMuxToRequireRtcpMux();
3119}
3120
3121TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
3122 Base::SendRequireRtcpMuxToRequireRtcpMux();
3123}
3124
3125TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
3126 Base::SendRequireRtcpMuxToNoRtcpMux();
3127}
3128
3129TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
3130 Base::SendEarlyRtcpMuxToRtcp();
3131}
3132
3133TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
3134 Base::SendEarlyRtcpMuxToRtcpMux();
3135}
3136
3137TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
3138 Base::SendSrtpToSrtp();
3139}
3140
3141TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
3142 Base::SendSrtpToSrtp();
3143}
3144
3145TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003146 Base::SendSrtpToSrtp(DTLS, 0);
3147}
3148
3149TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003150 Base::SendSrtpToSrtp(DTLS, DTLS);
3151}
3152
3153TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003154 Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
3155}
3156
deadbeeff5346592017-01-24 21:51:21 -08003157// Test using the channel with a raw packet interface, as opposed to a DTLS
3158// transport interface.
3159TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
3160 Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
3161}
3162
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003163TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
3164 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3165}
3166
3167TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
3168 Base::SendEarlyMediaUsingRtcpMuxSrtp();
3169}
3170
3171TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
3172 Base::SendRtpToRtpOnThread();
3173}
3174
3175TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
3176 Base::SendSrtpToSrtpOnThread();
3177}
3178
3179TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
3180 Base::SendWithWritabilityLoss();
3181}
3182
3183TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
3184 Base::TestMediaMonitor();
3185}
3186
3187TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
3188 Base::TestSetContentFailure();
3189}
3190
3191TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
3192 Base::TestSendTwoOffers();
3193}
3194
3195TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
3196 Base::TestReceiveTwoOffers();
3197}
3198
3199TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
3200 Base::TestSendPrAnswer();
3201}
3202
3203TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
3204 Base::TestReceivePrAnswer();
3205}
3206
3207TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
3208 Base::TestFlushRtcp();
3209}
3210
3211TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
3212 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
3213}
3214
3215TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
3216 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
3217}
3218
3219TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
3220 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
3221}
3222
3223TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
3224 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
3225}
3226
3227TEST_F(VideoChannelDoubleThreadTest, TestSrtpError) {
3228 Base::TestSrtpError(kVideoPts[0]);
3229}
3230
zstein56162b92017-04-24 16:54:35 -07003231TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3232 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003233}
3234
zstein56162b92017-04-24 16:54:35 -07003235TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3236 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003237}
3238
3239TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
3240 Base::DefaultMaxBitrateIsUnlimited();
3241}
3242
3243TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
3244 Base::CanChangeMaxBitrate();
3245}
3246
deadbeef953c2ce2017-01-09 14:53:41 -08003247// RtpDataChannelSingleThreadTest
3248class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003249 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003250 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003251 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003252 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
3253};
3254
deadbeef953c2ce2017-01-09 14:53:41 -08003255// RtpDataChannelDoubleThreadTest
3256class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003257 public:
3258 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08003259 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003260 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003261};
3262
3263// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07003264template <>
deadbeef953c2ce2017-01-09 14:53:41 -08003265cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003266 rtc::Thread* worker_thread,
3267 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07003268 cricket::MediaEngineInterface* engine,
3269 cricket::FakeDataMediaChannel* ch,
deadbeeff5346592017-01-24 21:51:21 -08003270 cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
3271 cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -08003272 rtc::PacketTransportInternal* fake_rtp_packet_transport,
3273 rtc::PacketTransportInternal* fake_rtcp_packet_transport,
jbauchcb560652016-08-04 05:20:32 -07003274 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08003275 rtc::Thread* signaling_thread = rtc::Thread::Current();
deadbeef953c2ce2017-01-09 14:53:41 -08003276 cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
zhihuangf5b251b2017-01-12 19:37:48 -08003277 worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
deadbeefac22f702017-01-12 21:59:29 -08003278 (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
deadbeeff5346592017-01-24 21:51:21 -08003279 if (!channel->NeedsRtcpTransport()) {
3280 fake_rtcp_dtls_transport = nullptr;
zhihuangf5b251b2017-01-12 19:37:48 -08003281 }
deadbeeff5346592017-01-24 21:51:21 -08003282 if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
3283 fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003284 delete channel;
3285 channel = NULL;
3286 }
3287 return channel;
3288}
3289
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003290template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003291void ChannelTest<DataTraits>::CreateContent(
3292 int flags,
3293 const cricket::AudioCodec& audio_codec,
3294 const cricket::VideoCodec& video_codec,
3295 cricket::DataContentDescription* data) {
3296 data->AddCodec(kGoogleDataCodec);
3297 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
3298 if (flags & SECURE) {
3299 data->AddCrypto(cricket::CryptoParams(
Guo-wei Shieh456696a2015-09-30 21:48:54 -07003300 1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
3301 "inline:" + rtc::CreateRandomString(40), std::string()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003302 }
3303}
3304
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003305template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003306void ChannelTest<DataTraits>::CopyContent(
3307 const cricket::DataContentDescription& source,
3308 cricket::DataContentDescription* data) {
3309 *data = source;
3310}
3311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003312template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003313bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
3314 const cricket::DataCodec& c2) {
3315 return c1.name == c2.name;
3316}
3317
Peter Boström0c4e06b2015-10-07 12:23:21 +02003318template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003319void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02003320 uint32_t ssrc,
3321 int flags,
3322 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003323 data->AddLegacyStream(ssrc);
3324}
3325
deadbeef953c2ce2017-01-09 14:53:41 -08003326TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003327 Base::TestInit();
3328 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3329}
3330
deadbeef953c2ce2017-01-09 14:53:41 -08003331TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003332 Base::TestDeinit();
3333}
3334
deadbeef953c2ce2017-01-09 14:53:41 -08003335TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003336 Base::TestSetContents();
3337}
3338
deadbeef953c2ce2017-01-09 14:53:41 -08003339TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003340 Base::TestSetContentsNullOffer();
3341}
3342
deadbeef953c2ce2017-01-09 14:53:41 -08003343TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003344 Base::TestSetContentsRtcpMux();
3345}
3346
deadbeef953c2ce2017-01-09 14:53:41 -08003347TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003348 Base::TestSetRemoteContentUpdate();
3349}
3350
deadbeef953c2ce2017-01-09 14:53:41 -08003351TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003352 Base::TestStreams();
3353}
3354
deadbeef953c2ce2017-01-09 14:53:41 -08003355TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003356 Base::TestUpdateStreamsInLocalContent();
3357}
3358
deadbeef953c2ce2017-01-09 14:53:41 -08003359TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003360 Base::TestUpdateStreamsInRemoteContent();
3361}
3362
deadbeef953c2ce2017-01-09 14:53:41 -08003363TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003364 Base::TestChangeStreamParamsInContent();
3365}
3366
deadbeef953c2ce2017-01-09 14:53:41 -08003367TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003368 Base::TestPlayoutAndSendingStates();
3369}
3370
deadbeef953c2ce2017-01-09 14:53:41 -08003371TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003372 Base::TestMediaContentDirection();
3373}
3374
deadbeef953c2ce2017-01-09 14:53:41 -08003375TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003376 Base::TestCallSetup();
3377}
3378
deadbeef953c2ce2017-01-09 14:53:41 -08003379TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003380 Base::TestCallTeardownRtcpMux();
3381}
3382
zstein56162b92017-04-24 16:54:35 -07003383TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
3384 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003385}
3386
zstein56162b92017-04-24 16:54:35 -07003387TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3388 Base::TestOnTransportReadyToSendWithRtcpMux();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003389}
3390
deadbeef953c2ce2017-01-09 14:53:41 -08003391TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003392 Base::SendRtpToRtp();
3393}
3394
deadbeef953c2ce2017-01-09 14:53:41 -08003395TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003396 Base::SendRtcpToRtcp();
3397}
3398
deadbeef953c2ce2017-01-09 14:53:41 -08003399TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003400 Base::SendRtcpMuxToRtcp();
3401}
3402
deadbeef953c2ce2017-01-09 14:53:41 -08003403TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003404 Base::SendRtcpMuxToRtcpMux();
3405}
3406
deadbeef953c2ce2017-01-09 14:53:41 -08003407TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003408 Base::SendEarlyRtcpMuxToRtcp();
3409}
3410
deadbeef953c2ce2017-01-09 14:53:41 -08003411TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003412 Base::SendEarlyRtcpMuxToRtcpMux();
3413}
3414
deadbeef953c2ce2017-01-09 14:53:41 -08003415TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003416 Base::SendSrtpToSrtp();
3417}
3418
deadbeef953c2ce2017-01-09 14:53:41 -08003419TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003420 Base::SendSrtpToSrtp();
3421}
3422
deadbeef953c2ce2017-01-09 14:53:41 -08003423TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003424 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3425}
3426
deadbeef953c2ce2017-01-09 14:53:41 -08003427TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003428 Base::SendRtpToRtpOnThread();
3429}
3430
deadbeef953c2ce2017-01-09 14:53:41 -08003431TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003432 Base::SendSrtpToSrtpOnThread();
3433}
3434
deadbeef953c2ce2017-01-09 14:53:41 -08003435TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003436 Base::SendWithWritabilityLoss();
3437}
3438
deadbeef953c2ce2017-01-09 14:53:41 -08003439TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003440 Base::TestMediaMonitor();
3441}
3442
deadbeef953c2ce2017-01-09 14:53:41 -08003443TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003444 CreateChannels(0, 0);
3445 EXPECT_TRUE(SendInitiate());
3446 EXPECT_TRUE(SendAccept());
3447
3448 cricket::SendDataParams params;
3449 params.ssrc = 42;
3450 unsigned char data[] = {'f', 'o', 'o'};
3451 rtc::CopyOnWriteBuffer payload(data, 3);
3452 cricket::SendDataResult result;
3453 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3454 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
3455 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3456}
3457
deadbeef953c2ce2017-01-09 14:53:41 -08003458TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003459 Base::TestInit();
3460 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
3461}
3462
deadbeef953c2ce2017-01-09 14:53:41 -08003463TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02003464 Base::TestDeinit();
3465}
3466
deadbeef953c2ce2017-01-09 14:53:41 -08003467TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003468 Base::TestSetContents();
3469}
3470
deadbeef953c2ce2017-01-09 14:53:41 -08003471TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003472 Base::TestSetContentsNullOffer();
3473}
3474
deadbeef953c2ce2017-01-09 14:53:41 -08003475TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003476 Base::TestSetContentsRtcpMux();
3477}
3478
deadbeef953c2ce2017-01-09 14:53:41 -08003479TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003480 Base::TestSetRemoteContentUpdate();
3481}
3482
deadbeef953c2ce2017-01-09 14:53:41 -08003483TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003484 Base::TestStreams();
3485}
3486
deadbeef953c2ce2017-01-09 14:53:41 -08003487TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003488 Base::TestUpdateStreamsInLocalContent();
3489}
3490
deadbeef953c2ce2017-01-09 14:53:41 -08003491TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003492 Base::TestUpdateStreamsInRemoteContent();
3493}
3494
deadbeef953c2ce2017-01-09 14:53:41 -08003495TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003496 Base::TestChangeStreamParamsInContent();
3497}
3498
deadbeef953c2ce2017-01-09 14:53:41 -08003499TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003500 Base::TestPlayoutAndSendingStates();
3501}
3502
deadbeef953c2ce2017-01-09 14:53:41 -08003503TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003504 Base::TestMediaContentDirection();
3505}
3506
deadbeef953c2ce2017-01-09 14:53:41 -08003507TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003508 Base::TestCallSetup();
3509}
3510
deadbeef953c2ce2017-01-09 14:53:41 -08003511TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003512 Base::TestCallTeardownRtcpMux();
3513}
3514
zstein56162b92017-04-24 16:54:35 -07003515TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
3516 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003517}
3518
zstein56162b92017-04-24 16:54:35 -07003519TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
3520 Base::TestOnTransportReadyToSendWithRtcpMux();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003521}
3522
deadbeef953c2ce2017-01-09 14:53:41 -08003523TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003524 Base::SendRtpToRtp();
3525}
3526
deadbeef953c2ce2017-01-09 14:53:41 -08003527TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003528 Base::SendRtcpToRtcp();
3529}
3530
deadbeef953c2ce2017-01-09 14:53:41 -08003531TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003532 Base::SendRtcpMuxToRtcp();
3533}
3534
deadbeef953c2ce2017-01-09 14:53:41 -08003535TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003536 Base::SendRtcpMuxToRtcpMux();
3537}
3538
deadbeef953c2ce2017-01-09 14:53:41 -08003539TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003540 Base::SendEarlyRtcpMuxToRtcp();
3541}
3542
deadbeef953c2ce2017-01-09 14:53:41 -08003543TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003544 Base::SendEarlyRtcpMuxToRtcpMux();
3545}
3546
deadbeef953c2ce2017-01-09 14:53:41 -08003547TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003548 Base::SendSrtpToSrtp();
3549}
3550
deadbeef953c2ce2017-01-09 14:53:41 -08003551TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003552 Base::SendSrtpToSrtp();
3553}
3554
deadbeef953c2ce2017-01-09 14:53:41 -08003555TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003556 Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
3557}
3558
deadbeef953c2ce2017-01-09 14:53:41 -08003559TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003560 Base::SendRtpToRtpOnThread();
3561}
3562
deadbeef953c2ce2017-01-09 14:53:41 -08003563TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003564 Base::SendSrtpToSrtpOnThread();
3565}
3566
deadbeef953c2ce2017-01-09 14:53:41 -08003567TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003568 Base::SendWithWritabilityLoss();
3569}
3570
deadbeef953c2ce2017-01-09 14:53:41 -08003571TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02003572 Base::TestMediaMonitor();
3573}
3574
deadbeef953c2ce2017-01-09 14:53:41 -08003575TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003576 CreateChannels(0, 0);
3577 EXPECT_TRUE(SendInitiate());
3578 EXPECT_TRUE(SendAccept());
3579
3580 cricket::SendDataParams params;
3581 params.ssrc = 42;
3582 unsigned char data[] = {
3583 'f', 'o', 'o'
3584 };
jbaucheec21bd2016-03-20 06:15:43 -07003585 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003586 cricket::SendDataResult result;
3587 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
3588 EXPECT_EQ(params.ssrc,
3589 media_channel1_->last_sent_data_params().ssrc);
3590 EXPECT_EQ("foo", media_channel1_->last_sent_data());
3591}
3592
deadbeefbad5dad2017-01-17 18:32:35 -08003593#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3594
3595// Verifies some DCHECKs are in place.
3596// Uses VoiceChannel, but any BaseChannel subclass would work.
3597class BaseChannelDeathTest : public testing::Test {
3598 public:
3599 BaseChannelDeathTest()
deadbeeff5346592017-01-24 21:51:21 -08003600 : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
3601 fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
3602 // RTCP mux not required, SRTP required.
deadbeefbad5dad2017-01-17 18:32:35 -08003603 voice_channel_(
3604 rtc::Thread::Current(),
3605 rtc::Thread::Current(),
3606 rtc::Thread::Current(),
3607 &fake_media_engine_,
3608 new cricket::FakeVoiceMediaChannel(nullptr,
3609 cricket::AudioOptions()),
3610 cricket::CN_AUDIO,
3611 false,
deadbeeff5346592017-01-24 21:51:21 -08003612 true) {}
deadbeefbad5dad2017-01-17 18:32:35 -08003613
3614 protected:
deadbeefbad5dad2017-01-17 18:32:35 -08003615 cricket::FakeMediaEngine fake_media_engine_;
deadbeeff5346592017-01-24 21:51:21 -08003616 cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
3617 cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
deadbeefbad5dad2017-01-17 18:32:35 -08003618 cricket::VoiceChannel voice_channel_;
deadbeefbad5dad2017-01-17 18:32:35 -08003619};
3620
deadbeeff5346592017-01-24 21:51:21 -08003621TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
3622 ASSERT_TRUE(voice_channel_.Init_w(
3623 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3624 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3625 cricket::FakeDtlsTransport new_rtcp_transport(
3626 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
3627 EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003628}
3629
deadbeeff5346592017-01-24 21:51:21 -08003630TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
3631 ASSERT_TRUE(voice_channel_.Init_w(
3632 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3633 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3634 cricket::FakeDtlsTransport new_rtp_transport(
3635 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3636 EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
deadbeefbad5dad2017-01-17 18:32:35 -08003637}
3638
deadbeeff5346592017-01-24 21:51:21 -08003639TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
3640 ASSERT_TRUE(voice_channel_.Init_w(
3641 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3642 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
deadbeefbad5dad2017-01-17 18:32:35 -08003643 // Activate RTCP muxing, simulating offer/answer negotiation.
3644 cricket::AudioContentDescription content;
3645 content.set_rtcp_mux(true);
3646 ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
3647 ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -08003648 cricket::FakeDtlsTransport new_rtp_transport(
3649 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3650 cricket::FakeDtlsTransport new_rtcp_transport(
3651 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003652 // After muxing is enabled, no RTCP transport should be passed in here.
3653 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003654 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3655 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003656}
3657
3658// This test will probably go away if/when we move the transport name out of
3659// the transport classes and into their parent classes.
deadbeeff5346592017-01-24 21:51:21 -08003660TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
3661 ASSERT_TRUE(voice_channel_.Init_w(
3662 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3663 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3664 cricket::FakeDtlsTransport new_rtp_transport(
3665 "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
3666 cricket::FakeDtlsTransport new_rtcp_transport(
3667 "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
deadbeefbad5dad2017-01-17 18:32:35 -08003668 EXPECT_DEATH(
deadbeeff5346592017-01-24 21:51:21 -08003669 voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
3670 "");
3671}
3672
3673// Not expected to support going from DtlsTransportInternal to
deadbeef5bd5ca32017-02-10 11:31:50 -08003674// PacketTransportInternal.
deadbeeff5346592017-01-24 21:51:21 -08003675TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
3676 ASSERT_TRUE(voice_channel_.Init_w(
3677 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
3678 &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
3679 EXPECT_DEATH(
deadbeef5bd5ca32017-02-10 11:31:50 -08003680 voice_channel_.SetTransports(
3681 static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
3682 static_cast<rtc::PacketTransportInternal*>(
3683 &fake_rtp_dtls_transport_)),
deadbeeff5346592017-01-24 21:51:21 -08003684 "");
3685}
3686
deadbeef5bd5ca32017-02-10 11:31:50 -08003687// Not expected to support going from PacketTransportInternal to
deadbeeff5346592017-01-24 21:51:21 -08003688// DtlsTransportInternal.
3689TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
3690 ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
3691 &fake_rtcp_dtls_transport_));
3692 EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
3693 &fake_rtp_dtls_transport_),
3694 "");
deadbeefbad5dad2017-01-17 18:32:35 -08003695}
3696
3697#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
3698
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003699// TODO(pthatcher): TestSetReceiver?