blob: 0d8fdc3ed40c3ebc4b3d0b053b9be2333bb77e19 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010012#include <utility>
kwiberg31022942016-03-11 14:18:21 -080013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/array_view.h"
15#include "media/base/fakemediaengine.h"
16#include "media/base/fakertp.h"
17#include "media/base/mediachannel.h"
18#include "media/base/testutils.h"
19#include "p2p/base/fakecandidatepair.h"
20#include "p2p/base/fakedtlstransport.h"
21#include "p2p/base/fakepackettransport.h"
22#include "pc/channel.h"
23#include "rtc_base/buffer.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/fakeclock.h"
26#include "rtc_base/gunit.h"
27#include "rtc_base/logging.h"
28#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
zhihuangb2cdd932017-01-19 16:54:25 -080030using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080033using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080034using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Danil Chapovalov33b01f22016-05-11 19:55:27 +020036namespace {
37const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
38const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070040const cricket::VideoCodec kH264Codec(97, "H264");
41const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020042const cricket::DataCodec kGoogleDataCodec(101, "google-data");
43const uint32_t kSsrc1 = 0x1111;
44const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070045const uint32_t kSsrc3 = 0x3333;
46const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020047const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010050
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,
deadbeefac22f702017-01-12 21:59:29 -080096 SSRC_MUX = 0x8,
97 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080098 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080099 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700100 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800101 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
Peter Boström34fbfff2015-09-24 19:20:30 +0200103 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200104 rtc::ArrayView<const uint8_t> rtp_data,
105 rtc::ArrayView<const uint8_t> rtcp_data,
106 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200107 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800109 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200110 if (network_is_worker == NetworkIsWorker::Yes) {
111 network_thread_ = rtc::Thread::Current();
112 } else {
113 network_thread_keeper_ = rtc::Thread::Create();
114 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 network_thread_ = network_thread_keeper_.get();
116 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800120 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
121 nullptr, typename T::Options()),
122 rtc::MakeUnique<typename T::MediaChannel>(
123 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Steve Anton8699a322017-11-06 15:53:33 -0800126 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
127 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 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 }
Zhi Huange830e682018-03-30 10:48:35 -0700136
deadbeeff5346592017-01-24 21:51:21 -0800137 // Make sure if using raw packet transports, they're used for both
138 // channels.
139 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200140 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800141 media_channel1_ = ch1.get();
142 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800143 rtc::PacketTransportInternal* rtp1 = nullptr;
144 rtc::PacketTransportInternal* rtcp1 = nullptr;
145 rtc::PacketTransportInternal* rtp2 = nullptr;
146 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800147 // Based on flags, create fake DTLS or raw packet transports.
148 if (flags1 & RAW_PACKET_TRANSPORT) {
149 fake_rtp_packet_transport1_.reset(
150 new rtc::FakePacketTransport("channel1_rtp"));
151 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700152 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800153 fake_rtcp_packet_transport1_.reset(
154 new rtc::FakePacketTransport("channel1_rtcp"));
155 rtcp1 = fake_rtcp_packet_transport1_.get();
156 }
157 } else {
158 // Confirmed to work with KT_RSA and KT_ECDSA.
159 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
160 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
161 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700162 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800163 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
164 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
165 rtcp1 = fake_rtcp_dtls_transport1_.get();
166 }
167 if (flags1 & DTLS) {
168 auto cert1 =
169 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
170 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
171 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
172 if (fake_rtcp_dtls_transport1_) {
173 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
174 }
175 }
176 }
177 // Based on flags, create fake DTLS or raw packet transports.
178 if (flags2 & RAW_PACKET_TRANSPORT) {
179 fake_rtp_packet_transport2_.reset(
180 new rtc::FakePacketTransport("channel2_rtp"));
181 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700182 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800183 fake_rtcp_packet_transport2_.reset(
184 new rtc::FakePacketTransport("channel2_rtcp"));
185 rtcp2 = fake_rtcp_packet_transport2_.get();
186 }
187 } else {
188 // Confirmed to work with KT_RSA and KT_ECDSA.
189 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
190 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
191 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700192 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800193 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
194 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
195 rtcp2 = fake_rtcp_dtls_transport2_.get();
196 }
197 if (flags2 & DTLS) {
198 auto cert2 =
199 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
200 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
201 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
202 if (fake_rtcp_dtls_transport2_) {
203 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
204 }
205 }
206 }
Zhi Huange830e682018-03-30 10:48:35 -0700207 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
208 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
209 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
210 flags1);
211 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
212 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
213 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
214 flags2);
215
216 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
217 std::move(ch1), rtp_transport1_.get(), flags1);
218 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
219 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800220 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800221 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800222 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800223 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000224 CreateContent(flags1, kPcmuCodec, kH264Codec,
225 &local_media_content1_);
226 CreateContent(flags2, kPcmuCodec, kH264Codec,
227 &local_media_content2_);
228 CopyContent(local_media_content1_, &remote_media_content1_);
229 CopyContent(local_media_content2_, &remote_media_content2_);
230
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 // Add stream information (SSRC) to the local content but not to the remote
232 // content. This means that we per default know the SSRC of what we send but
233 // not what we receive.
234 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
235 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
236
237 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
238 if (flags1 & SSRC_MUX) {
239 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
240 }
241 if (flags2 & SSRC_MUX) {
242 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
243 }
244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200246 rtc::Thread* worker_thread,
247 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700248 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800249 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700250 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700251 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800252 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800253 auto channel = rtc::MakeUnique<typename T::Channel>(
254 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -0700255 cricket::CN_AUDIO, (flags & DTLS) != 0, rtc::CryptoOptions());
256 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000257 return channel;
258 }
259
Zhi Huange830e682018-03-30 10:48:35 -0700260 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
261 rtc::PacketTransportInternal* rtp_packet_transport,
262 rtc::PacketTransportInternal* rtcp_packet_transport,
263 DtlsTransportInternal* rtp_dtls_transport,
264 DtlsTransportInternal* rtcp_dtls_transport,
265 int flags) {
266 if (flags & RTCP_MUX) {
267 rtcp_packet_transport = nullptr;
268 rtcp_dtls_transport = nullptr;
269 }
270
271 if (flags & DTLS) {
272 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
273 } else {
274 if (flags & RAW_PACKET_TRANSPORT) {
275 return CreateUnencryptedTransport(rtp_packet_transport,
276 rtcp_packet_transport);
277 } else {
278 return CreateUnencryptedTransport(rtp_dtls_transport,
279 rtcp_dtls_transport);
280 }
281 }
282 }
283
284 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
285 rtc::PacketTransportInternal* rtp_packet_transport,
286 rtc::PacketTransportInternal* rtcp_packet_transport) {
Zhi Huange830e682018-03-30 10:48:35 -0700287 auto rtp_transport =
Zhi Huang365381f2018-04-13 16:44:34 -0700288 rtc::MakeUnique<webrtc::RtpTransport>(rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700289
290 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
291 if (rtcp_packet_transport) {
292 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
293 }
294 return rtp_transport;
295 }
296
297 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
298 cricket::DtlsTransportInternal* rtp_dtls_transport,
299 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Zhi Huang365381f2018-04-13 16:44:34 -0700300 auto dtls_srtp_transport = rtc::MakeUnique<webrtc::DtlsSrtpTransport>(
301 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700302
303 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
304 rtcp_dtls_transport);
305 return dtls_srtp_transport;
306 }
307
deadbeeff5346592017-01-24 21:51:21 -0800308 void ConnectFakeTransports() {
309 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
310 bool asymmetric = false;
311 // Depending on test flags, could be using DTLS or raw packet transport.
312 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
313 fake_rtp_dtls_transport1_->SetDestination(
314 fake_rtp_dtls_transport2_.get(), asymmetric);
315 }
316 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
317 fake_rtcp_dtls_transport1_->SetDestination(
318 fake_rtcp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
321 fake_rtp_packet_transport1_->SetDestination(
322 fake_rtp_packet_transport2_.get(), asymmetric);
323 }
324 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
325 fake_rtcp_packet_transport1_->SetDestination(
326 fake_rtcp_packet_transport2_.get(), asymmetric);
327 }
328 });
329 }
330
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000332 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800333 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 if (result) {
335 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800337 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800339 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800341 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 }
343 }
344 return result;
345 }
346
347 bool SendAccept() {
348 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800350 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 }
352
353 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000354 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800355 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356 if (result) {
357 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 }
361 return result;
362 }
363
364 bool SendProvisionalAnswer() {
365 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800366 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 if (result) {
368 channel2_->Enable(true);
369 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800370 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800371 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372 }
373 return result;
374 }
375
376 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000377 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800378 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000380 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800381 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000382 return result;
383 }
384
deadbeeff5346592017-01-24 21:51:21 -0800385 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 channel1_.reset();
387 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800388 fake_rtp_dtls_transport1_.reset();
389 fake_rtcp_dtls_transport1_.reset();
390 fake_rtp_dtls_transport2_.reset();
391 fake_rtcp_dtls_transport2_.reset();
392 fake_rtp_packet_transport1_.reset();
393 fake_rtcp_packet_transport1_.reset();
394 fake_rtp_packet_transport2_.reset();
395 fake_rtcp_packet_transport2_.reset();
396 if (network_thread_keeper_) {
397 network_thread_keeper_.reset();
398 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 return true;
400 }
401
402 bool AddStream1(int id) {
403 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
404 }
405 bool RemoveStream1(int id) {
406 return channel1_->RemoveRecvStream(id);
407 }
408
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200409 void SendRtp1() {
410 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
411 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendRtp2() {
414 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
415 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendRtcp1() {
418 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendRtcp2() {
421 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
423 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200424 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
425 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
426 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
429 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
430 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 void SendCustomRtcp1(uint32_t ssrc) {
433 rtc::Buffer data = CreateRtcpData(ssrc);
434 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 void SendCustomRtcp2(uint32_t ssrc) {
437 rtc::Buffer data = CreateRtcpData(ssrc);
438 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 }
444 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
447 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200454 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200455 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
456 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200458 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200459 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
460 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200462 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200463 rtc::Buffer data = CreateRtcpData(ssrc);
464 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200466 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200467 rtc::Buffer data = CreateRtcpData(ssrc);
468 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
471 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::SetBE32(data.data() + 8, ssrc);
474 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000475 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000477 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 return data;
479 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200480 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
481 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 return data;
485 }
486
487 bool CheckNoRtp1() {
488 return media_channel1_->CheckNoRtp();
489 }
490 bool CheckNoRtp2() {
491 return media_channel2_->CheckNoRtp();
492 }
493 bool CheckNoRtcp1() {
494 return media_channel1_->CheckNoRtcp();
495 }
496 bool CheckNoRtcp2() {
497 return media_channel2_->CheckNoRtcp();
498 }
499
500 void CreateContent(int flags,
501 const cricket::AudioCodec& audio_codec,
502 const cricket::VideoCodec& video_codec,
503 typename T::Content* content) {
504 // overridden in specialized classes
505 }
506 void CopyContent(const typename T::Content& source,
507 typename T::Content* content) {
508 // overridden in specialized classes
509 }
510
Steve Anton18ee1d52017-09-11 11:32:35 -0700511 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700513 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
514 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700515 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700516 AddLegacyStreamInContent(ssrc, 0, content);
517 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 }
519
ossu292d6582016-03-17 02:31:13 -0700520 // Will manage the lifetime of a CallThread, making sure it's
521 // destroyed before this object goes out of scope.
522 class ScopedCallThread {
523 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700525 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200526 : thread_(rtc::Thread::Create()),
527 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700528 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700529 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700530 }
531
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200532 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700533
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200534 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700535
536 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200537 std::unique_ptr<rtc::Thread> thread_;
538 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700539 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
542 return false; // overridden in specialized classes
543 }
544
deadbeeff5346592017-01-24 21:51:21 -0800545 void OnRtcpMuxFullyActive1(const std::string&) {
546 rtcp_mux_activated_callbacks1_++;
547 }
548 void OnRtcpMuxFullyActive2(const std::string&) {
549 rtcp_mux_activated_callbacks2_++;
550 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551
Honghai Zhangcc411c02016-03-29 17:27:21 -0700552 cricket::CandidatePairInterface* last_selected_candidate_pair() {
553 return last_selected_candidate_pair_;
554 }
555
Peter Boström0c4e06b2015-10-07 12:23:21 +0200556 void AddLegacyStreamInContent(uint32_t ssrc,
557 int flags,
558 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 // Base implementation.
560 }
561
562 // Tests that can be used by derived classes.
563
564 // Basic sanity check.
565 void TestInit() {
566 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700567 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200569 if (verify_playout_) {
570 EXPECT_FALSE(media_channel1_->playout());
571 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_TRUE(media_channel1_->codecs().empty());
573 EXPECT_TRUE(media_channel1_->recv_streams().empty());
574 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
575 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
576 }
577
578 // Test that SetLocalContent and SetRemoteContent properly configure
579 // the codecs.
580 void TestSetContents() {
581 CreateChannels(0, 0);
582 typename T::Content content;
583 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800584 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800586 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587 ASSERT_EQ(1U, media_channel1_->codecs().size());
588 EXPECT_TRUE(CodecMatches(content.codecs()[0],
589 media_channel1_->codecs()[0]));
590 }
591
592 // Test that SetLocalContent and SetRemoteContent properly deals
593 // with an empty offer.
594 void TestSetContentsNullOffer() {
595 CreateChannels(0, 0);
596 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800597 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800600 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 ASSERT_EQ(1U, media_channel1_->codecs().size());
602 EXPECT_TRUE(CodecMatches(content.codecs()[0],
603 media_channel1_->codecs()[0]));
604 }
605
606 // Test that SetLocalContent and SetRemoteContent properly set RTCP
607 // mux.
608 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800609 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 typename T::Content content;
611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 // Both sides agree on mux. Should no longer be a separate RTCP channel.
613 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800614 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
615 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800617 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800619 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 }
621
622 // Test that SetLocalContent and SetRemoteContent properly set RTCP
623 // mux when a provisional answer is received.
624 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800625 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 typename T::Content content;
627 CreateContent(0, kPcmuCodec, kH264Codec, &content);
628 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800629 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
630 EXPECT_TRUE(
631 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800632 // Both sides agree on mux. Should signal RTCP mux as fully activated.
633 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800634 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800635 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800637 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800639 EXPECT_TRUE(
640 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
641 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800642 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 }
644
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Test that Add/RemoveStream properly forward to the media channel.
646 void TestStreams() {
647 CreateChannels(0, 0);
648 EXPECT_TRUE(AddStream1(1));
649 EXPECT_TRUE(AddStream1(2));
650 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
651 EXPECT_TRUE(RemoveStream1(2));
652 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
653 EXPECT_TRUE(RemoveStream1(1));
654 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
655 }
656
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 // Test that SetLocalContent and SetRemoteContent properly
658 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800659 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 void TestChangeStreamParamsInContent() {
661 cricket::StreamParams stream1;
662 stream1.groupid = "group1";
663 stream1.id = "stream1";
664 stream1.ssrcs.push_back(kSsrc1);
665 stream1.cname = "stream1_cname";
666
667 cricket::StreamParams stream2;
668 stream2.groupid = "group1";
669 stream2.id = "stream2";
670 stream2.ssrcs.push_back(kSsrc2);
671 stream2.cname = "stream2_cname";
672
673 // Setup a call where channel 1 send |stream1| to channel 2.
674 CreateChannels(0, 0);
675 typename T::Content content1;
676 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
677 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800678 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_TRUE(channel1_->Enable(true));
680 EXPECT_EQ(1u, media_channel1_->send_streams().size());
681
Steve Anton3828c062017-12-06 10:34:51 -0800682 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800684 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
686 // Channel 2 do not send anything.
687 typename T::Content content2;
688 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800689 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_TRUE(channel2_->Enable(true));
693 EXPECT_EQ(0u, media_channel2_->send_streams().size());
694
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200695 SendCustomRtp1(kSsrc1, 0);
696 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
698
699 // Let channel 2 update the content by sending |stream2| and enable SRTP.
700 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700701 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800703 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 ASSERT_EQ(1u, media_channel2_->send_streams().size());
705 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
706
Steve Anton3828c062017-12-06 10:34:51 -0800707 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
709 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
710
711 // Channel 1 replies but stop sending stream1.
712 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700713 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800714 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_EQ(0u, media_channel1_->send_streams().size());
716
Steve Anton3828c062017-12-06 10:34:51 -0800717 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
719
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200720 SendCustomRtp2(kSsrc2, 0);
721 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
723 }
724
725 // Test that we only start playout and sending at the right times.
726 void TestPlayoutAndSendingStates() {
727 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200728 if (verify_playout_) {
729 EXPECT_FALSE(media_channel1_->playout());
730 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 if (verify_playout_) {
733 EXPECT_FALSE(media_channel2_->playout());
734 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_FALSE(media_channel2_->sending());
736 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
738 EXPECT_FALSE(media_channel1_->playout());
739 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000741 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800742 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200743 if (verify_playout_) {
744 EXPECT_TRUE(media_channel1_->playout());
745 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000747 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800748 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200749 if (verify_playout_) {
750 EXPECT_FALSE(media_channel2_->playout());
751 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000753 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800754 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
756 EXPECT_FALSE(media_channel2_->playout());
757 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800759 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200760 if (verify_playout_) {
761 EXPECT_TRUE(media_channel1_->playout());
762 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200764 if (verify_playout_) {
765 EXPECT_FALSE(media_channel2_->playout());
766 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_FALSE(media_channel2_->sending());
768 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 if (verify_playout_) {
770 EXPECT_TRUE(media_channel2_->playout());
771 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000773 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800774 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200775 if (verify_playout_) {
776 EXPECT_TRUE(media_channel1_->playout());
777 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 EXPECT_TRUE(media_channel1_->sending());
779 }
780
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 // Test that changing the MediaContentDirection in the local and remote
782 // session description start playout and sending at the right time.
783 void TestMediaContentDirection() {
784 CreateChannels(0, 0);
785 typename T::Content content1;
786 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
787 typename T::Content content2;
788 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
789 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800790 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
792 EXPECT_TRUE(channel1_->Enable(true));
793 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200794 if (verify_playout_) {
795 EXPECT_FALSE(media_channel1_->playout());
796 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
799 EXPECT_FALSE(media_channel2_->playout());
800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 EXPECT_FALSE(media_channel2_->sending());
802
Steve Anton3828c062017-12-06 10:34:51 -0800803 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
804 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
805 EXPECT_TRUE(
806 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
807 EXPECT_TRUE(
808 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800809 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810
Peter Boström34fbfff2015-09-24 19:20:30 +0200811 if (verify_playout_) {
812 EXPECT_TRUE(media_channel1_->playout());
813 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200815 if (verify_playout_) {
816 EXPECT_FALSE(media_channel2_->playout()); // local InActive
817 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818 EXPECT_FALSE(media_channel2_->sending()); // local InActive
819
820 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800821 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800822 EXPECT_TRUE(
823 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
824 EXPECT_TRUE(
825 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826
Peter Boström34fbfff2015-09-24 19:20:30 +0200827 if (verify_playout_) {
828 EXPECT_TRUE(media_channel1_->playout());
829 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200831 if (verify_playout_) {
832 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
833 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
835
836 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800837 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800838 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
839 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000840
Peter Boström34fbfff2015-09-24 19:20:30 +0200841 if (verify_playout_) {
842 EXPECT_TRUE(media_channel1_->playout());
843 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200845 if (verify_playout_) {
846 EXPECT_TRUE(media_channel2_->playout());
847 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848 EXPECT_TRUE(media_channel2_->sending());
849 }
850
Honghai Zhangcc411c02016-03-29 17:27:21 -0700851 // Tests that when the transport channel signals a candidate pair change
852 // event, the media channel will receive a call on the network route change.
853 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700854 static constexpr uint16_t kLocalNetId = 1;
855 static constexpr uint16_t kRemoteNetId = 2;
856 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800857 // Ipv4(20) + UDP(8).
858 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800859 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200860
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800861 CreateChannels(DTLS, DTLS);
862 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700863
Honghai Zhangcc411c02016-03-29 17:27:21 -0700864 typename T::MediaChannel* media_channel1 =
865 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200866 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700867
Zhi Huang942bc2e2017-11-13 13:26:07 -0800868 // Need to wait for the threads before calling
869 // |set_num_network_route_changes| because the network route would be set
870 // when creating the channel.
871 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200872 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800873 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800874 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200875 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800876 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
877
878 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200879 });
880 WaitForThreads();
881 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700882 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200883 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700884
eladalon05b07bb2017-08-24 07:40:16 -0700885 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800886 rtc::NetworkRoute network_route;
887 network_route.connected = true;
888 network_route.local_network_id = kLocalNetId;
889 network_route.remote_network_id = kRemoteNetId;
890 network_route.last_sent_packet_id = kLastPacketId;
891 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800893 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
894
895 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200896 });
897 WaitForThreads();
898 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -0700899 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200900 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700901 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200902 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700903 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800904 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800905 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700906 }
907
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000908 // Test setting up a call.
909 void TestCallSetup() {
910 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700911 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200913 if (verify_playout_) {
914 EXPECT_TRUE(media_channel1_->playout());
915 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 EXPECT_FALSE(media_channel1_->sending());
917 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700918 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 EXPECT_TRUE(media_channel1_->sending());
920 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200921 if (verify_playout_) {
922 EXPECT_TRUE(media_channel2_->playout());
923 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000924 EXPECT_TRUE(media_channel2_->sending());
925 EXPECT_EQ(1U, media_channel2_->codecs().size());
926 }
927
928 // Test that we don't crash if packets are sent during call teardown
929 // when RTCP mux is enabled. This is a regression test against a specific
930 // race condition that would only occur when a RTCP packet was sent during
931 // teardown of a channel on which RTCP mux was enabled.
932 void TestCallTeardownRtcpMux() {
933 class LastWordMediaChannel : public T::MediaChannel {
934 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700937 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
938 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
940 }
941 };
Steve Anton8699a322017-11-06 15:53:33 -0800942 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
943 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_TRUE(SendInitiate());
945 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800946 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 }
948
949 // Send voice RTP data to the other side and ensure it gets there.
950 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700951 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 EXPECT_TRUE(SendInitiate());
953 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700954 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
955 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200956 SendRtp1();
957 SendRtp2();
958 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_TRUE(CheckRtp1());
960 EXPECT_TRUE(CheckRtp2());
961 EXPECT_TRUE(CheckNoRtp1());
962 EXPECT_TRUE(CheckNoRtp2());
963 }
964
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200965 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800966 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200967 EXPECT_TRUE(SendInitiate());
968 EXPECT_TRUE(SendAccept());
969 SendRtp1();
970 SendRtp2();
971 SendRtcp1();
972 SendRtcp2();
973 // Do not wait, destroy channels.
974 channel1_.reset(nullptr);
975 channel2_.reset(nullptr);
976 }
977
deadbeefac22f702017-01-12 21:59:29 -0800978 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800980 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981 EXPECT_TRUE(SendInitiate());
982 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700983 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
984 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200985 SendRtcp1();
986 SendRtcp2();
987 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 EXPECT_TRUE(CheckRtcp1());
989 EXPECT_TRUE(CheckRtcp2());
990 EXPECT_TRUE(CheckNoRtcp1());
991 EXPECT_TRUE(CheckNoRtcp2());
992 }
993
Zhi Huange830e682018-03-30 10:48:35 -0700994 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
995 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700996 EXPECT_FALSE(channel1_->srtp_active());
997 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200999 WaitForThreads();
1000 EXPECT_TRUE(channel1_->writable());
1001 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001003 EXPECT_TRUE(channel1_->srtp_active());
1004 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001005 SendRtp1();
1006 SendRtp2();
1007 SendRtcp1();
1008 SendRtcp2();
1009 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 EXPECT_TRUE(CheckRtp1());
1011 EXPECT_TRUE(CheckRtp2());
1012 EXPECT_TRUE(CheckNoRtp1());
1013 EXPECT_TRUE(CheckNoRtp2());
1014 EXPECT_TRUE(CheckRtcp1());
1015 EXPECT_TRUE(CheckRtcp2());
1016 EXPECT_TRUE(CheckNoRtcp1());
1017 EXPECT_TRUE(CheckNoRtcp2());
1018 }
1019
1020 // Test that we can send and receive early media when a provisional answer is
1021 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1022 void SendEarlyMediaUsingRtcpMuxSrtp() {
1023 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1024
Zhi Huange830e682018-03-30 10:48:35 -07001025 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(SendOffer());
1027 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001028 EXPECT_TRUE(channel1_->srtp_active());
1029 EXPECT_TRUE(channel2_->srtp_active());
Zhi Huange830e682018-03-30 10:48:35 -07001030 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1031 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001032 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1033 SendCustomRtcp1(kSsrc1);
1034 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1035 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1038
1039 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001040 SendCustomRtcp2(kSsrc2);
1041 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1042 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1045
1046 // Complete call setup and ensure everything is still OK.
1047 EXPECT_TRUE(SendFinalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001048 EXPECT_TRUE(channel1_->srtp_active());
1049 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001050 SendCustomRtcp1(kSsrc1);
1051 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1052 SendCustomRtcp2(kSsrc2);
1053 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1054 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1059 }
1060
1061 // Test that we properly send RTP without SRTP from a thread.
1062 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001063 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064 EXPECT_TRUE(SendInitiate());
1065 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001066 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1067 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1068 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1069 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1070 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1071 send_rtcp1.thread(),
1072 send_rtcp2.thread()};
1073 WaitForThreads(involved_threads);
1074 EXPECT_TRUE(CheckRtp1());
1075 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 EXPECT_TRUE(CheckNoRtp1());
1077 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 EXPECT_TRUE(CheckRtcp1());
1079 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(CheckNoRtcp1());
1081 EXPECT_TRUE(CheckNoRtcp2());
1082 }
1083
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 // Test that the mediachannel retains its sending state after the transport
1085 // becomes non-writable.
1086 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001087 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 EXPECT_TRUE(SendInitiate());
1089 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001090 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1091 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
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
wu@webrtc.org97077a32013-10-25 21:18:33 +00001100 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001101 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1102 fake_rtp_dtls_transport1_->SetWritable(false);
1103 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001104 SendRtp1();
1105 SendRtp2();
1106 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 EXPECT_TRUE(CheckRtp1());
1108 EXPECT_TRUE(CheckNoRtp2());
1109
1110 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001111 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1112 fake_rtp_dtls_transport1_->SetWritable(true);
1113 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001115 SendRtp1();
1116 SendRtp2();
1117 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_TRUE(CheckRtp1());
1119 EXPECT_TRUE(CheckRtp2());
1120 EXPECT_TRUE(CheckNoRtp1());
1121 EXPECT_TRUE(CheckNoRtp2());
1122
1123 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001124 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1125 bool asymmetric = true;
1126 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1127 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(media_channel1_->sending());
1129
wu@webrtc.org97077a32013-10-25 21:18:33 +00001130 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001131 SendRtp1();
1132 SendRtp2();
1133 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_TRUE(CheckRtp1());
1135 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001136 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137
1138 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001139 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001140 bool asymmetric = true;
1141 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1142 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001143 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001145 SendRtp1();
1146 SendRtp2();
1147 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_TRUE(CheckRtp1());
1149 EXPECT_TRUE(CheckRtp2());
1150 EXPECT_TRUE(CheckNoRtp1());
1151 EXPECT_TRUE(CheckNoRtp2());
1152 }
1153
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001154 void SendBundleToBundle(
1155 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1156 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001158 // Only pl_type1 was added to the bundle filter for both |channel1_|
1159 // and |channel2_|.
1160 int pl_type1 = pl_types[0];
1161 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001162 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001163 if (secure)
1164 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001165 if (rtcp_mux) {
1166 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001167 }
1168 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001171
1172 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001173 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1174 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1175 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001176 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001177 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1178 EXPECT_TRUE(CheckNoRtp1());
1179 EXPECT_TRUE(CheckNoRtp2());
1180
Zhi Huang365381f2018-04-13 16:44:34 -07001181 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1182 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001183 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001184 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1185 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001186
Zhi Huange830e682018-03-30 10:48:35 -07001187 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001188 SendCustomRtcp1(kSsrc1);
1189 SendCustomRtcp2(kSsrc2);
1190 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1192 EXPECT_TRUE(CheckNoRtcp1());
1193 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1194 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001196 SendCustomRtcp1(kSsrc2);
1197 SendCustomRtcp2(kSsrc1);
1198 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001199 // Bundle filter shouldn't filter out any RTCP.
1200 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1201 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001202 }
1203
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 void TestSetContentFailure() {
1205 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206
Peter Thatchera6d24442015-07-09 21:26:36 -07001207 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001208 std::unique_ptr<typename T::Content> content(
1209 CreateMediaContentWithStream(1));
1210
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001212 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001213 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001214 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001215 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001218 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001219 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001220
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001221 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001222 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001223 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 }
1225
1226 void TestSendTwoOffers() {
1227 CreateChannels(0, 0);
1228
Peter Thatchera6d24442015-07-09 21:26:36 -07001229 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001230 std::unique_ptr<typename T::Content> content1(
1231 CreateMediaContentWithStream(1));
1232 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001233 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1235
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 std::unique_ptr<typename T::Content> content2(
1237 CreateMediaContentWithStream(2));
1238 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001239 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1241 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1242 }
1243
1244 void TestReceiveTwoOffers() {
1245 CreateChannels(0, 0);
1246
Peter Thatchera6d24442015-07-09 21:26:36 -07001247 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001248 std::unique_ptr<typename T::Content> content1(
1249 CreateMediaContentWithStream(1));
1250 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001251 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001252 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1253
Steve Anton18ee1d52017-09-11 11:32:35 -07001254 std::unique_ptr<typename T::Content> content2(
1255 CreateMediaContentWithStream(2));
1256 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001257 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1259 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1260 }
1261
1262 void TestSendPrAnswer() {
1263 CreateChannels(0, 0);
1264
Peter Thatchera6d24442015-07-09 21:26:36 -07001265 std::string err;
1266 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001267 std::unique_ptr<typename T::Content> content1(
1268 CreateMediaContentWithStream(1));
1269 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001270 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1272
Peter Thatchera6d24442015-07-09 21:26:36 -07001273 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001274 std::unique_ptr<typename T::Content> content2(
1275 CreateMediaContentWithStream(2));
1276 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001277 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1279 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1280
Peter Thatchera6d24442015-07-09 21:26:36 -07001281 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001282 std::unique_ptr<typename T::Content> content3(
1283 CreateMediaContentWithStream(3));
1284 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001285 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1287 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1288 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1289 }
1290
1291 void TestReceivePrAnswer() {
1292 CreateChannels(0, 0);
1293
Peter Thatchera6d24442015-07-09 21:26:36 -07001294 std::string err;
1295 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001296 std::unique_ptr<typename T::Content> content1(
1297 CreateMediaContentWithStream(1));
1298 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001299 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1301
Peter Thatchera6d24442015-07-09 21:26:36 -07001302 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001303 std::unique_ptr<typename T::Content> content2(
1304 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001305 EXPECT_TRUE(
1306 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1308 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1309
Peter Thatchera6d24442015-07-09 21:26:36 -07001310 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001311 std::unique_ptr<typename T::Content> content3(
1312 CreateMediaContentWithStream(3));
1313 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001314 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1316 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1317 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1318 }
1319
1320 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001321 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 EXPECT_TRUE(SendInitiate());
1323 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001324 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1325 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326
1327 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001328 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329 // The sending message is only posted. channel2_ should be empty.
1330 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001331 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1332 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001333
1334 // When channel1_ is deleted, the RTCP packet should be sent out to
1335 // channel2_.
1336 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001337 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001338 EXPECT_TRUE(CheckRtcp2());
1339 }
1340
zstein56162b92017-04-24 16:54:35 -07001341 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001342 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001344
zstein56162b92017-04-24 16:54:35 -07001345 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347 EXPECT_TRUE(media_channel1_->ready_to_send());
1348
zstein56162b92017-04-24 16:54:35 -07001349 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001350 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 }
1353
skvladdc1c62c2016-03-16 19:07:43 -07001354 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1355 typename T::Content content;
1356 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1357 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001358 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001359 }
1360
deadbeefe702b302017-02-04 12:09:01 -08001361 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001362 webrtc::RtpParameters parameters;
1363 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001364 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001365 parameters.encodings.push_back(encoding);
1366 return parameters;
1367 }
1368
1369 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001370 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001371 EXPECT_EQ(1UL, parameters.encodings.size());
1372 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1373 }
1374
1375 void DefaultMaxBitrateIsUnlimited() {
1376 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001377 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1378 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001379 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001380 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001381 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001382 }
1383
Zhi Huange830e682018-03-30 10:48:35 -07001384 // Test that when a channel gets new RtpTransport with a call to
1385 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1386 // with the options on the new one.
1387
Steve Anton8a63f782017-10-23 13:08:53 -07001388 // For example, audio and video may use separate socket options, but initially
1389 // be unbundled, then later become bundled. When this happens, their preferred
1390 // socket options should be merged to the underlying transport they share.
1391 void SocketOptionsMergedOnSetTransport() {
1392 constexpr int kSndBufSize = 4000;
1393 constexpr int kRcvBufSize = 8000;
1394
Zhi Huange830e682018-03-30 10:48:35 -07001395 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001396
1397 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1398 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1399 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1400 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1401
Zhi Huange830e682018-03-30 10:48:35 -07001402 new_rtp_transport_ = CreateDtlsSrtpTransport(
1403 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1404 static_cast<DtlsTransportInternal*>(
1405 channel2_->rtcp_packet_transport()));
1406 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001407
1408 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001409 ASSERT_TRUE(
1410 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1411 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001412 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001413 ASSERT_TRUE(
1414 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1415 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001416 EXPECT_EQ(kRcvBufSize, option_val);
1417 }
1418
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001420 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1421 static void ProcessThreadQueue(rtc::Thread* thread) {
1422 RTC_DCHECK(thread->IsCurrent());
1423 while (!thread->empty()) {
1424 thread->ProcessMessages(0);
1425 }
1426 }
1427 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1428 // |threads| and current thread post packets to network thread.
1429 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001430 thread->Invoke<void>(RTC_FROM_HERE,
1431 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001432 }
1433 ProcessThreadQueue(rtc::Thread::Current());
1434 // Network thread move them around and post back to worker = current thread.
1435 if (!network_thread_->IsCurrent()) {
1436 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001437 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 }
1439 // Worker thread = current Thread process received messages.
1440 ProcessThreadQueue(rtc::Thread::Current());
1441 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001442 // TODO(pbos): Remove playout from all media channels and let renderers mute
1443 // themselves.
1444 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001445 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1446 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001447 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1448 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1449 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1450 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1451 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1452 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1453 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1454 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001455 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1456 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1457 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 cricket::FakeMediaEngine media_engine_;
1459 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001460 typename T::MediaChannel* media_channel1_ = nullptr;
1461 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001462 std::unique_ptr<typename T::Channel> channel1_;
1463 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464 typename T::Content local_media_content1_;
1465 typename T::Content local_media_content2_;
1466 typename T::Content remote_media_content1_;
1467 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001469 rtc::Buffer rtp_packet_;
1470 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001471 int rtcp_mux_activated_callbacks1_ = 0;
1472 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001473 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001474};
1475
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476template<>
1477void ChannelTest<VoiceTraits>::CreateContent(
1478 int flags,
1479 const cricket::AudioCodec& audio_codec,
1480 const cricket::VideoCodec& video_codec,
1481 cricket::AudioContentDescription* audio) {
1482 audio->AddCodec(audio_codec);
1483 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484}
1485
1486template<>
1487void ChannelTest<VoiceTraits>::CopyContent(
1488 const cricket::AudioContentDescription& source,
1489 cricket::AudioContentDescription* audio) {
1490 *audio = source;
1491}
1492
1493template<>
1494bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1495 const cricket::AudioCodec& c2) {
1496 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1497 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
1498}
1499
Peter Boström0c4e06b2015-10-07 12:23:21 +02001500template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001502 uint32_t ssrc,
1503 int flags,
1504 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505 audio->AddLegacyStream(ssrc);
1506}
1507
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001508class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509 public:
solenberg1dd98f32015-09-10 01:57:14 -07001510 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511 VoiceChannelSingleThreadTest()
1512 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1513};
1514
1515class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1516 public:
1517 typedef ChannelTest<VoiceTraits> Base;
1518 VoiceChannelDoubleThreadTest()
1519 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520};
1521
jbauch5869f502017-06-29 12:31:36 -07001522class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
1523 : public ChannelTest<VoiceTraits> {
1524 public:
1525 typedef ChannelTest<VoiceTraits> Base;
1526 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
1527 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1528 NetworkIsWorker::Yes) {}
1529};
1530
1531class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
1532 : public ChannelTest<VoiceTraits> {
1533 public:
1534 typedef ChannelTest<VoiceTraits> Base;
1535 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
1536 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1537 NetworkIsWorker::No) {}
1538};
1539
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001541template <>
Steve Anton8699a322017-11-06 15:53:33 -08001542std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001543 rtc::Thread* worker_thread,
1544 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001545 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001546 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001547 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001548 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001549 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08001550 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
1551 worker_thread, network_thread, signaling_thread, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -07001552 cricket::CN_VIDEO, (flags & DTLS) != 0, rtc::CryptoOptions());
1553 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 return channel;
1555}
1556
1557// override to add 0 parameter
1558template<>
1559bool ChannelTest<VideoTraits>::AddStream1(int id) {
1560 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1561}
1562
1563template<>
1564void ChannelTest<VideoTraits>::CreateContent(
1565 int flags,
1566 const cricket::AudioCodec& audio_codec,
1567 const cricket::VideoCodec& video_codec,
1568 cricket::VideoContentDescription* video) {
1569 video->AddCodec(video_codec);
1570 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571}
1572
1573template<>
1574void ChannelTest<VideoTraits>::CopyContent(
1575 const cricket::VideoContentDescription& source,
1576 cricket::VideoContentDescription* video) {
1577 *video = source;
1578}
1579
1580template<>
1581bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1582 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001583 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584}
1585
Peter Boström0c4e06b2015-10-07 12:23:21 +02001586template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001588 uint32_t ssrc,
1589 int flags,
1590 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 video->AddLegacyStream(ssrc);
1592}
1593
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001594class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595 public:
solenberg1dd98f32015-09-10 01:57:14 -07001596 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001597 VideoChannelSingleThreadTest()
1598 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599};
1600
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001601class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1602 public:
1603 typedef ChannelTest<VideoTraits> Base;
1604 VideoChannelDoubleThreadTest()
1605 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1606};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001608TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 Base::TestInit();
1610 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1611 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1612}
1613
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001614TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1615 Base::TestDeinit();
1616}
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 Base::TestSetContents();
1620}
1621
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 Base::TestSetContentsNullOffer();
1624}
1625
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 Base::TestSetContentsRtcpMux();
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 Base::TestSetContentsRtcpMux();
1632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::TestStreams();
1636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 Base::TestChangeStreamParamsInContent();
1640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 Base::TestPlayoutAndSendingStates();
1644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 Base::TestMediaContentDirection();
1648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001651 Base::TestNetworkRouteChanges();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::TestCallSetup();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::TestCallTeardownRtcpMux();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::SendRtpToRtp();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::SendRtcpToRtcp();
1668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001671 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001675 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::SendRtpToRtpOnThread();
1684}
1685
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 Base::SendWithWritabilityLoss();
1689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692 Base::TestSetContentFailure();
1693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 Base::TestSendTwoOffers();
1697}
1698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001699TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 Base::TestReceiveTwoOffers();
1701}
1702
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 Base::TestSendPrAnswer();
1705}
1706
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001707TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708 Base::TestReceivePrAnswer();
1709}
1710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 Base::TestFlushRtcp();
1713}
1714
zstein56162b92017-04-24 16:54:35 -07001715TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1716 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717}
1718
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001719TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001720 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721}
1722
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001723TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001724 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001725}
1726
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001727TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001728 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001729}
1730
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001731TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001732 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733}
1734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001735TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001736 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001737}
1738
Steve Anton8a63f782017-10-23 13:08:53 -07001739TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1740 Base::SocketOptionsMergedOnSetTransport();
1741}
1742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743// VoiceChannelDoubleThreadTest
1744TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1747 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748}
1749
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001750TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1751 Base::TestDeinit();
1752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 Base::TestSetContents();
1756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 Base::TestSetContentsNullOffer();
1760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 Base::TestSetContentsRtcpMux();
1764}
1765
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001766TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 Base::TestSetContentsRtcpMux();
1768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 Base::TestStreams();
1772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 Base::TestChangeStreamParamsInContent();
1776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 Base::TestPlayoutAndSendingStates();
1780}
1781
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1783 Base::TestMediaContentDirection();
1784}
1785
1786TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1787 Base::TestNetworkRouteChanges();
1788}
1789
1790TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1791 Base::TestCallSetup();
1792}
1793
1794TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1795 Base::TestCallTeardownRtcpMux();
1796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1799 Base::SendRtpToRtp();
1800}
1801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1803 Base::SendRtcpToRtcp();
1804}
1805
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001807 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808}
1809
1810TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001811 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001812}
1813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1815 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1816}
1817
1818TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1819 Base::SendRtpToRtpOnThread();
1820}
1821
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001822TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1823 Base::SendWithWritabilityLoss();
1824}
1825
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001826TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1827 Base::TestSetContentFailure();
1828}
1829
1830TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1831 Base::TestSendTwoOffers();
1832}
1833
1834TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1835 Base::TestReceiveTwoOffers();
1836}
1837
1838TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1839 Base::TestSendPrAnswer();
1840}
1841
1842TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1843 Base::TestReceivePrAnswer();
1844}
1845
1846TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1847 Base::TestFlushRtcp();
1848}
1849
zstein56162b92017-04-24 16:54:35 -07001850TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1851 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001852}
1853
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001854TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1855 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1856}
1857
1858TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1859 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1860}
1861
1862TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1863 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1864}
1865
1866TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1867 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1868}
1869
1870TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1871 Base::DefaultMaxBitrateIsUnlimited();
1872}
1873
Steve Anton8a63f782017-10-23 13:08:53 -07001874TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1875 Base::SocketOptionsMergedOnSetTransport();
1876}
1877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878// VideoChannelSingleThreadTest
1879TEST_F(VideoChannelSingleThreadTest, TestInit) {
1880 Base::TestInit();
1881}
1882
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001883TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1884 Base::TestDeinit();
1885}
1886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001887TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1888 Base::TestSetContents();
1889}
1890
1891TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1892 Base::TestSetContentsNullOffer();
1893}
1894
1895TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1896 Base::TestSetContentsRtcpMux();
1897}
1898
1899TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1900 Base::TestSetContentsRtcpMux();
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1904 Base::TestStreams();
1905}
1906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001907TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1908 Base::TestChangeStreamParamsInContent();
1909}
1910
1911TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1912 Base::TestPlayoutAndSendingStates();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 Base::TestMediaContentDirection();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001920 Base::TestNetworkRouteChanges();
1921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 Base::TestCallSetup();
1925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928 Base::TestCallTeardownRtcpMux();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 Base::SendRtpToRtp();
1933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 Base::SendRtcpToRtcp();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001940 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001944 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945}
1946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 Base::SendRtpToRtpOnThread();
1953}
1954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 Base::SendWithWritabilityLoss();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960 Base::TestSetContentFailure();
1961}
1962
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 Base::TestSendTwoOffers();
1965}
1966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 Base::TestReceiveTwoOffers();
1969}
1970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 Base::TestSendPrAnswer();
1973}
1974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 Base::TestReceivePrAnswer();
1977}
1978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 Base::TestFlushRtcp();
1981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001984 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985}
1986
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001987TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001988 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001989}
1990
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001992 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001993}
1994
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001995TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001996 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997}
1998
zstein56162b92017-04-24 16:54:35 -07001999TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2000 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001}
2002
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002003TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002004 Base::DefaultMaxBitrateIsUnlimited();
2005}
2006
Steve Anton8a63f782017-10-23 13:08:53 -07002007TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2008 Base::SocketOptionsMergedOnSetTransport();
2009}
2010
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002011// VideoChannelDoubleThreadTest
2012TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2013 Base::TestInit();
2014}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002016TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2017 Base::TestDeinit();
2018}
2019
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002020TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2021 Base::TestSetContents();
2022}
2023
2024TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2025 Base::TestSetContentsNullOffer();
2026}
2027
2028TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2029 Base::TestSetContentsRtcpMux();
2030}
2031
2032TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2033 Base::TestSetContentsRtcpMux();
2034}
2035
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002036TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2037 Base::TestStreams();
2038}
2039
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002040TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2041 Base::TestChangeStreamParamsInContent();
2042}
2043
2044TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2045 Base::TestPlayoutAndSendingStates();
2046}
2047
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002048TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2049 Base::TestMediaContentDirection();
2050}
2051
2052TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2053 Base::TestNetworkRouteChanges();
2054}
2055
2056TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2057 Base::TestCallSetup();
2058}
2059
2060TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2061 Base::TestCallTeardownRtcpMux();
2062}
2063
2064TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2065 Base::SendRtpToRtp();
2066}
2067
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002068TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2069 Base::SendRtcpToRtcp();
2070}
2071
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002072TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002073 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002074}
2075
2076TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002077 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002078}
2079
2080TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2081 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2082}
2083
2084TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2085 Base::SendRtpToRtpOnThread();
2086}
2087
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002088TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2089 Base::SendWithWritabilityLoss();
2090}
2091
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002092TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2093 Base::TestSetContentFailure();
2094}
2095
2096TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2097 Base::TestSendTwoOffers();
2098}
2099
2100TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2101 Base::TestReceiveTwoOffers();
2102}
2103
2104TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2105 Base::TestSendPrAnswer();
2106}
2107
2108TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2109 Base::TestReceivePrAnswer();
2110}
2111
2112TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2113 Base::TestFlushRtcp();
2114}
2115
2116TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2117 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2118}
2119
2120TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2121 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2122}
2123
2124TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2125 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2126}
2127
2128TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2129 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2130}
2131
zstein56162b92017-04-24 16:54:35 -07002132TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2133 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002134}
2135
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002136TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2137 Base::DefaultMaxBitrateIsUnlimited();
2138}
2139
Steve Anton8a63f782017-10-23 13:08:53 -07002140TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2141 Base::SocketOptionsMergedOnSetTransport();
2142}
2143
deadbeef953c2ce2017-01-09 14:53:41 -08002144// RtpDataChannelSingleThreadTest
2145class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002148 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2150};
2151
deadbeef953c2ce2017-01-09 14:53:41 -08002152// RtpDataChannelDoubleThreadTest
2153class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002154 public:
2155 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002156 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002157 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002158};
2159
2160// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002161template <>
Steve Anton8699a322017-11-06 15:53:33 -08002162std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002163 rtc::Thread* worker_thread,
2164 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002165 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002166 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002167 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002168 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002169 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002170 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
2171 worker_thread, network_thread, signaling_thread, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -07002172 cricket::CN_DATA, (flags & DTLS) != 0, rtc::CryptoOptions());
2173 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174 return channel;
2175}
2176
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002177template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178void ChannelTest<DataTraits>::CreateContent(
2179 int flags,
2180 const cricket::AudioCodec& audio_codec,
2181 const cricket::VideoCodec& video_codec,
2182 cricket::DataContentDescription* data) {
2183 data->AddCodec(kGoogleDataCodec);
2184 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185}
2186
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002187template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188void ChannelTest<DataTraits>::CopyContent(
2189 const cricket::DataContentDescription& source,
2190 cricket::DataContentDescription* data) {
2191 *data = source;
2192}
2193
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002194template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2196 const cricket::DataCodec& c2) {
2197 return c1.name == c2.name;
2198}
2199
Peter Boström0c4e06b2015-10-07 12:23:21 +02002200template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002202 uint32_t ssrc,
2203 int flags,
2204 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002205 data->AddLegacyStream(ssrc);
2206}
2207
deadbeef953c2ce2017-01-09 14:53:41 -08002208TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 Base::TestInit();
2210 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2211}
2212
deadbeef953c2ce2017-01-09 14:53:41 -08002213TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002214 Base::TestDeinit();
2215}
2216
deadbeef953c2ce2017-01-09 14:53:41 -08002217TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 Base::TestSetContents();
2219}
2220
deadbeef953c2ce2017-01-09 14:53:41 -08002221TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 Base::TestSetContentsNullOffer();
2223}
2224
deadbeef953c2ce2017-01-09 14:53:41 -08002225TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226 Base::TestSetContentsRtcpMux();
2227}
2228
deadbeef953c2ce2017-01-09 14:53:41 -08002229TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 Base::TestStreams();
2231}
2232
deadbeef953c2ce2017-01-09 14:53:41 -08002233TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002234 Base::TestChangeStreamParamsInContent();
2235}
2236
deadbeef953c2ce2017-01-09 14:53:41 -08002237TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238 Base::TestPlayoutAndSendingStates();
2239}
2240
deadbeef953c2ce2017-01-09 14:53:41 -08002241TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242 Base::TestMediaContentDirection();
2243}
2244
deadbeef953c2ce2017-01-09 14:53:41 -08002245TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 Base::TestCallSetup();
2247}
2248
deadbeef953c2ce2017-01-09 14:53:41 -08002249TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 Base::TestCallTeardownRtcpMux();
2251}
2252
zstein56162b92017-04-24 16:54:35 -07002253TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2254 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255}
2256
deadbeef953c2ce2017-01-09 14:53:41 -08002257TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002258 Base::SendRtpToRtp();
2259}
2260
deadbeef953c2ce2017-01-09 14:53:41 -08002261TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002262 Base::SendRtcpToRtcp();
2263}
2264
deadbeef953c2ce2017-01-09 14:53:41 -08002265TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266 Base::SendRtpToRtpOnThread();
2267}
2268
deadbeef953c2ce2017-01-09 14:53:41 -08002269TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270 Base::SendWithWritabilityLoss();
2271}
2272
Steve Anton8a63f782017-10-23 13:08:53 -07002273TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2274 Base::SocketOptionsMergedOnSetTransport();
2275}
2276
deadbeef953c2ce2017-01-09 14:53:41 -08002277TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002278 CreateChannels(0, 0);
2279 EXPECT_TRUE(SendInitiate());
2280 EXPECT_TRUE(SendAccept());
2281
2282 cricket::SendDataParams params;
2283 params.ssrc = 42;
2284 unsigned char data[] = {'f', 'o', 'o'};
2285 rtc::CopyOnWriteBuffer payload(data, 3);
2286 cricket::SendDataResult result;
2287 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2288 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2289 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2290}
2291
deadbeef953c2ce2017-01-09 14:53:41 -08002292TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002293 Base::TestInit();
2294 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2295}
2296
deadbeef953c2ce2017-01-09 14:53:41 -08002297TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002298 Base::TestDeinit();
2299}
2300
deadbeef953c2ce2017-01-09 14:53:41 -08002301TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302 Base::TestSetContents();
2303}
2304
deadbeef953c2ce2017-01-09 14:53:41 -08002305TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306 Base::TestSetContentsNullOffer();
2307}
2308
deadbeef953c2ce2017-01-09 14:53:41 -08002309TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002310 Base::TestSetContentsRtcpMux();
2311}
2312
deadbeef953c2ce2017-01-09 14:53:41 -08002313TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002314 Base::TestStreams();
2315}
2316
deadbeef953c2ce2017-01-09 14:53:41 -08002317TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002318 Base::TestChangeStreamParamsInContent();
2319}
2320
deadbeef953c2ce2017-01-09 14:53:41 -08002321TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002322 Base::TestPlayoutAndSendingStates();
2323}
2324
deadbeef953c2ce2017-01-09 14:53:41 -08002325TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002326 Base::TestMediaContentDirection();
2327}
2328
deadbeef953c2ce2017-01-09 14:53:41 -08002329TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002330 Base::TestCallSetup();
2331}
2332
deadbeef953c2ce2017-01-09 14:53:41 -08002333TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002334 Base::TestCallTeardownRtcpMux();
2335}
2336
zstein56162b92017-04-24 16:54:35 -07002337TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2338 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002339}
2340
deadbeef953c2ce2017-01-09 14:53:41 -08002341TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002342 Base::SendRtpToRtp();
2343}
2344
deadbeef953c2ce2017-01-09 14:53:41 -08002345TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002346 Base::SendRtcpToRtcp();
2347}
2348
deadbeef953c2ce2017-01-09 14:53:41 -08002349TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002350 Base::SendRtpToRtpOnThread();
2351}
2352
deadbeef953c2ce2017-01-09 14:53:41 -08002353TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002354 Base::SendWithWritabilityLoss();
2355}
2356
Steve Anton8a63f782017-10-23 13:08:53 -07002357TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2358 Base::SocketOptionsMergedOnSetTransport();
2359}
2360
deadbeef953c2ce2017-01-09 14:53:41 -08002361TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 CreateChannels(0, 0);
2363 EXPECT_TRUE(SendInitiate());
2364 EXPECT_TRUE(SendAccept());
2365
2366 cricket::SendDataParams params;
2367 params.ssrc = 42;
2368 unsigned char data[] = {
2369 'f', 'o', 'o'
2370 };
jbaucheec21bd2016-03-20 06:15:43 -07002371 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 cricket::SendDataResult result;
2373 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2374 EXPECT_EQ(params.ssrc,
2375 media_channel1_->last_sent_data_params().ssrc);
2376 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2377}
2378
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379// TODO(pthatcher): TestSetReceiver?