blob: 5d4d4c7f9e004e56d5ecb8af207680b9da926337 [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"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "p2p/base/fakecandidatepair.h"
19#include "p2p/base/fakedtlstransport.h"
20#include "p2p/base/fakepackettransport.h"
21#include "pc/channel.h"
22#include "rtc_base/buffer.h"
23#include "rtc_base/checks.h"
24#include "rtc_base/fakeclock.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/logging.h"
27#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
zhihuangb2cdd932017-01-19 16:54:25 -080029using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080032using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080033using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034
Danil Chapovalov33b01f22016-05-11 19:55:27 +020035namespace {
36const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
37const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
38const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070039const cricket::VideoCodec kH264Codec(97, "H264");
40const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020041const cricket::DataCodec kGoogleDataCodec(101, "google-data");
42const uint32_t kSsrc1 = 0x1111;
43const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070044const uint32_t kSsrc3 = 0x3333;
45const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020046const int kAudioPts[] = {0, 8};
47const int kVideoPts[] = {97, 99};
48enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010049
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
deadbeefcbecd352015-09-23 11:50:27 -070052template <class ChannelT,
53 class MediaChannelT,
54 class ContentT,
55 class CodecT,
56 class MediaInfoT,
57 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class Traits {
59 public:
60 typedef ChannelT Channel;
61 typedef MediaChannelT MediaChannel;
62 typedef ContentT Content;
63 typedef CodecT Codec;
64 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020065 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066};
67
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068class VoiceTraits : public Traits<cricket::VoiceChannel,
69 cricket::FakeVoiceMediaChannel,
70 cricket::AudioContentDescription,
71 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020072 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070073 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
75class VideoTraits : public Traits<cricket::VideoChannel,
76 cricket::FakeVideoMediaChannel,
77 cricket::VideoContentDescription,
78 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070080 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081
deadbeef953c2ce2017-01-09 14:53:41 -080082class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 cricket::FakeDataMediaChannel,
84 cricket::DataContentDescription,
85 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
deadbeef953c2ce2017-01-09 14:53:41 -080089// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +020090template <class T>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091class ChannelTest : public testing::Test, public sigslot::has_slots<> {
92 public:
deadbeefac22f702017-01-12 21:59:29 -080093 enum Flags {
94 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -080095 SSRC_MUX = 0x8,
96 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080097 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080098 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -070099 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800100 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101
Peter Boström34fbfff2015-09-24 19:20:30 +0200102 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200103 rtc::ArrayView<const uint8_t> rtp_data,
104 rtc::ArrayView<const uint8_t> rtcp_data,
105 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200106 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200107 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800108 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200109 if (network_is_worker == NetworkIsWorker::Yes) {
110 network_thread_ = rtc::Thread::Current();
111 } else {
112 network_thread_keeper_ = rtc::Thread::Create();
113 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 network_thread_ = network_thread_keeper_.get();
115 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200116 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200119 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800120 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200121 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800122 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Steve Anton8699a322017-11-06 15:53:33 -0800125 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
126 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 int flags1,
128 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800129 // Network thread is started in CreateChannels, to allow the test to
130 // configure a fake clock before any threads are spawned and attempt to
131 // access the time.
132 if (network_thread_keeper_) {
133 network_thread_keeper_->Start();
134 }
Zhi Huange830e682018-03-30 10:48:35 -0700135
deadbeeff5346592017-01-24 21:51:21 -0800136 // Make sure if using raw packet transports, they're used for both
137 // channels.
138 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200139 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800140 media_channel1_ = ch1.get();
141 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800142 rtc::PacketTransportInternal* rtp1 = nullptr;
143 rtc::PacketTransportInternal* rtcp1 = nullptr;
144 rtc::PacketTransportInternal* rtp2 = nullptr;
145 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800146 // Based on flags, create fake DTLS or raw packet transports.
147 if (flags1 & RAW_PACKET_TRANSPORT) {
148 fake_rtp_packet_transport1_.reset(
149 new rtc::FakePacketTransport("channel1_rtp"));
150 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700151 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800152 fake_rtcp_packet_transport1_.reset(
153 new rtc::FakePacketTransport("channel1_rtcp"));
154 rtcp1 = fake_rtcp_packet_transport1_.get();
155 }
156 } else {
157 // Confirmed to work with KT_RSA and KT_ECDSA.
158 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
159 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
160 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700161 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800162 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
163 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
164 rtcp1 = fake_rtcp_dtls_transport1_.get();
165 }
166 if (flags1 & DTLS) {
167 auto cert1 =
168 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
169 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
170 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
171 if (fake_rtcp_dtls_transport1_) {
172 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
173 }
174 }
175 }
176 // Based on flags, create fake DTLS or raw packet transports.
177 if (flags2 & RAW_PACKET_TRANSPORT) {
178 fake_rtp_packet_transport2_.reset(
179 new rtc::FakePacketTransport("channel2_rtp"));
180 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700181 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800182 fake_rtcp_packet_transport2_.reset(
183 new rtc::FakePacketTransport("channel2_rtcp"));
184 rtcp2 = fake_rtcp_packet_transport2_.get();
185 }
186 } else {
187 // Confirmed to work with KT_RSA and KT_ECDSA.
188 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
189 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
190 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700191 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800192 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
193 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
194 rtcp2 = fake_rtcp_dtls_transport2_.get();
195 }
196 if (flags2 & DTLS) {
197 auto cert2 =
198 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
199 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
200 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
201 if (fake_rtcp_dtls_transport2_) {
202 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
203 }
204 }
205 }
Zhi Huange830e682018-03-30 10:48:35 -0700206 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
207 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
208 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
209 flags1);
210 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
211 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
212 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
213 flags2);
214
215 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
216 std::move(ch1), rtp_transport1_.get(), flags1);
217 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
218 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800219 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800220 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800221 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800222 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200223 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
224 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000225 CopyContent(local_media_content1_, &remote_media_content1_);
226 CopyContent(local_media_content2_, &remote_media_content2_);
227
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228 // Add stream information (SSRC) to the local content but not to the remote
229 // content. This means that we per default know the SSRC of what we send but
230 // not what we receive.
231 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
232 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
233
234 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
235 if (flags1 & SSRC_MUX) {
236 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
237 }
238 if (flags2 & SSRC_MUX) {
239 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
240 }
241 }
Steve Anton8699a322017-11-06 15:53:33 -0800242 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200243 rtc::Thread* worker_thread,
244 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700245 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800246 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700247 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700248 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800249 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200250 auto channel = absl::make_unique<typename T::Channel>(
Steve Anton8699a322017-11-06 15:53:33 -0800251 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700252 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700253 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000254 return channel;
255 }
256
Zhi Huange830e682018-03-30 10:48:35 -0700257 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
258 rtc::PacketTransportInternal* rtp_packet_transport,
259 rtc::PacketTransportInternal* rtcp_packet_transport,
260 DtlsTransportInternal* rtp_dtls_transport,
261 DtlsTransportInternal* rtcp_dtls_transport,
262 int flags) {
263 if (flags & RTCP_MUX) {
264 rtcp_packet_transport = nullptr;
265 rtcp_dtls_transport = nullptr;
266 }
267
268 if (flags & DTLS) {
269 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
270 } else {
271 if (flags & RAW_PACKET_TRANSPORT) {
272 return CreateUnencryptedTransport(rtp_packet_transport,
273 rtcp_packet_transport);
274 } else {
275 return CreateUnencryptedTransport(rtp_dtls_transport,
276 rtcp_dtls_transport);
277 }
278 }
279 }
280
281 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
282 rtc::PacketTransportInternal* rtp_packet_transport,
283 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200284 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
285 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700286
287 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
288 if (rtcp_packet_transport) {
289 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
290 }
291 return rtp_transport;
292 }
293
294 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
295 cricket::DtlsTransportInternal* rtp_dtls_transport,
296 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200297 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700298 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700299
300 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
301 rtcp_dtls_transport);
302 return dtls_srtp_transport;
303 }
304
deadbeeff5346592017-01-24 21:51:21 -0800305 void ConnectFakeTransports() {
306 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
307 bool asymmetric = false;
308 // Depending on test flags, could be using DTLS or raw packet transport.
309 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
310 fake_rtp_dtls_transport1_->SetDestination(
311 fake_rtp_dtls_transport2_.get(), asymmetric);
312 }
313 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
314 fake_rtcp_dtls_transport1_->SetDestination(
315 fake_rtcp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
318 fake_rtp_packet_transport1_->SetDestination(
319 fake_rtp_packet_transport2_.get(), asymmetric);
320 }
321 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
322 fake_rtcp_packet_transport1_->SetDestination(
323 fake_rtcp_packet_transport2_.get(), asymmetric);
324 }
325 });
326 }
327
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000328 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000329 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800330 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331 if (result) {
332 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800334 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800336 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800338 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 }
340 }
341 return result;
342 }
343
344 bool SendAccept() {
345 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000346 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800347 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 }
349
350 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800352 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 if (result) {
354 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800356 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 }
358 return result;
359 }
360
361 bool SendProvisionalAnswer() {
362 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 if (result) {
365 channel2_->Enable(true);
366 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800367 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800368 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 }
370 return result;
371 }
372
373 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000374 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800375 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000377 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800378 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 return result;
380 }
381
deadbeeff5346592017-01-24 21:51:21 -0800382 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 channel1_.reset();
384 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800385 fake_rtp_dtls_transport1_.reset();
386 fake_rtcp_dtls_transport1_.reset();
387 fake_rtp_dtls_transport2_.reset();
388 fake_rtcp_dtls_transport2_.reset();
389 fake_rtp_packet_transport1_.reset();
390 fake_rtcp_packet_transport1_.reset();
391 fake_rtp_packet_transport2_.reset();
392 fake_rtcp_packet_transport2_.reset();
393 if (network_thread_keeper_) {
394 network_thread_keeper_.reset();
395 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 return true;
397 }
398
399 bool AddStream1(int id) {
400 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
401 }
Yves Gerey665174f2018-06-19 15:03:05 +0200402 bool RemoveStream1(int id) { return channel1_->RemoveRecvStream(id); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200404 void SendRtp1() {
405 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
406 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp2() {
409 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
410 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtcp1() {
413 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendRtcp2() {
416 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
418 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtcp1(uint32_t ssrc) {
428 rtc::Buffer data = CreateRtcpData(ssrc);
429 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtcp2(uint32_t ssrc) {
432 rtc::Buffer data = CreateRtcpData(ssrc);
433 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
439 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
442 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200449 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
451 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200453 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
455 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtcpData(ssrc);
459 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtcpData(ssrc);
463 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
466 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::SetBE32(data.data() + 8, ssrc);
469 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000470 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000472 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 return data;
474 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
476 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200478 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
481
Yves Gerey665174f2018-06-19 15:03:05 +0200482 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
483 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
484 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
485 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486
487 void CreateContent(int flags,
488 const cricket::AudioCodec& audio_codec,
489 const cricket::VideoCodec& video_codec,
490 typename T::Content* content) {
491 // overridden in specialized classes
492 }
493 void CopyContent(const typename T::Content& source,
494 typename T::Content* content) {
495 // overridden in specialized classes
496 }
497
Steve Anton18ee1d52017-09-11 11:32:35 -0700498 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700500 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
501 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700502 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700503 AddLegacyStreamInContent(ssrc, 0, content);
504 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 }
506
ossu292d6582016-03-17 02:31:13 -0700507 // Will manage the lifetime of a CallThread, making sure it's
508 // destroyed before this object goes out of scope.
509 class ScopedCallThread {
510 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200511 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700512 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200513 : thread_(rtc::Thread::Create()),
514 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700515 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700516 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700517 }
518
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200519 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700520
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200521 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700522
523 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 std::unique_ptr<rtc::Thread> thread_;
525 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700526 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
529 return false; // overridden in specialized classes
530 }
531
deadbeeff5346592017-01-24 21:51:21 -0800532 void OnRtcpMuxFullyActive1(const std::string&) {
533 rtcp_mux_activated_callbacks1_++;
534 }
535 void OnRtcpMuxFullyActive2(const std::string&) {
536 rtcp_mux_activated_callbacks2_++;
537 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538
Honghai Zhangcc411c02016-03-29 17:27:21 -0700539 cricket::CandidatePairInterface* last_selected_candidate_pair() {
540 return last_selected_candidate_pair_;
541 }
542
Peter Boström0c4e06b2015-10-07 12:23:21 +0200543 void AddLegacyStreamInContent(uint32_t ssrc,
544 int flags,
545 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 // Base implementation.
547 }
548
549 // Tests that can be used by derived classes.
550
551 // Basic sanity check.
552 void TestInit() {
553 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700554 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200556 if (verify_playout_) {
557 EXPECT_FALSE(media_channel1_->playout());
558 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 EXPECT_TRUE(media_channel1_->codecs().empty());
560 EXPECT_TRUE(media_channel1_->recv_streams().empty());
561 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
562 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
563 }
564
565 // Test that SetLocalContent and SetRemoteContent properly configure
566 // the codecs.
567 void TestSetContents() {
568 CreateChannels(0, 0);
569 typename T::Content content;
570 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800571 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800573 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200575 EXPECT_TRUE(
576 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 }
578
Johannes Kron9190b822018-10-29 11:22:05 +0100579 // Test that SetLocalContent and SetRemoteContent properly configure
580 // extmap-allow-mixed.
581 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
582 // For a caller, SetLocalContent() is called first with an offer and next
583 // SetRemoteContent() is called with the answer.
584 CreateChannels(0, 0);
585 typename T::Content content;
586 CreateContent(0, kPcmuCodec, kH264Codec, &content);
587 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
588 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
589 content.set_extmap_allow_mixed_enum(offer_enum);
590 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
591 content.set_extmap_allow_mixed_enum(answer_enum);
592 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
593 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
594 }
595 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
596 // For a callee, SetRemoteContent() is called first with an offer and next
597 // SetLocalContent() is called with the answer.
598 CreateChannels(0, 0);
599 typename T::Content content;
600 CreateContent(0, kPcmuCodec, kH264Codec, &content);
601 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
602 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
603 content.set_extmap_allow_mixed_enum(offer_enum);
604 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
605 content.set_extmap_allow_mixed_enum(answer_enum);
606 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
607 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
608 }
609
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 // Test that SetLocalContent and SetRemoteContent properly deals
611 // with an empty offer.
612 void TestSetContentsNullOffer() {
613 CreateChannels(0, 0);
614 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800615 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 CreateContent(0, kPcmuCodec, kH264Codec, &content);
617 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200620 EXPECT_TRUE(
621 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 }
623
624 // Test that SetLocalContent and SetRemoteContent properly set RTCP
625 // mux.
626 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800627 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 typename T::Content content;
629 CreateContent(0, kPcmuCodec, kH264Codec, &content);
630 // Both sides agree on mux. Should no longer be a separate RTCP channel.
631 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800632 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
633 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800635 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800637 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 }
639
640 // Test that SetLocalContent and SetRemoteContent properly set RTCP
641 // mux when a provisional answer is received.
642 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800643 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 typename T::Content content;
645 CreateContent(0, kPcmuCodec, kH264Codec, &content);
646 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
648 EXPECT_TRUE(
649 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800650 // Both sides agree on mux. Should signal RTCP mux as fully activated.
651 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800652 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800653 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800655 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800657 EXPECT_TRUE(
658 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
659 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800660 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 }
662
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 // Test that Add/RemoveStream properly forward to the media channel.
664 void TestStreams() {
665 CreateChannels(0, 0);
666 EXPECT_TRUE(AddStream1(1));
667 EXPECT_TRUE(AddStream1(2));
668 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
669 EXPECT_TRUE(RemoveStream1(2));
670 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
671 EXPECT_TRUE(RemoveStream1(1));
672 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
673 }
674
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 // Test that SetLocalContent and SetRemoteContent properly
676 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800677 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 void TestChangeStreamParamsInContent() {
679 cricket::StreamParams stream1;
680 stream1.groupid = "group1";
681 stream1.id = "stream1";
682 stream1.ssrcs.push_back(kSsrc1);
683 stream1.cname = "stream1_cname";
684
685 cricket::StreamParams stream2;
686 stream2.groupid = "group1";
687 stream2.id = "stream2";
688 stream2.ssrcs.push_back(kSsrc2);
689 stream2.cname = "stream2_cname";
690
691 // Setup a call where channel 1 send |stream1| to channel 2.
692 CreateChannels(0, 0);
693 typename T::Content content1;
694 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
695 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800696 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_TRUE(channel1_->Enable(true));
698 EXPECT_EQ(1u, media_channel1_->send_streams().size());
699
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800702 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703
704 // Channel 2 do not send anything.
705 typename T::Content content2;
706 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800707 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800709 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_TRUE(channel2_->Enable(true));
711 EXPECT_EQ(0u, media_channel2_->send_streams().size());
712
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200713 SendCustomRtp1(kSsrc1, 0);
714 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
716
717 // Let channel 2 update the content by sending |stream2| and enable SRTP.
718 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700719 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800721 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 ASSERT_EQ(1u, media_channel2_->send_streams().size());
723 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
724
Steve Anton3828c062017-12-06 10:34:51 -0800725 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
727 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
728
729 // Channel 1 replies but stop sending stream1.
730 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700731 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800732 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_EQ(0u, media_channel1_->send_streams().size());
734
Steve Anton3828c062017-12-06 10:34:51 -0800735 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
737
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200738 SendCustomRtp2(kSsrc2, 0);
739 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
741 }
742
743 // Test that we only start playout and sending at the right times.
744 void TestPlayoutAndSendingStates() {
745 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200746 if (verify_playout_) {
747 EXPECT_FALSE(media_channel1_->playout());
748 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200750 if (verify_playout_) {
751 EXPECT_FALSE(media_channel2_->playout());
752 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_FALSE(media_channel2_->sending());
754 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
756 EXPECT_FALSE(media_channel1_->playout());
757 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000759 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800760 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
762 EXPECT_TRUE(media_channel1_->playout());
763 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000765 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800766 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
768 EXPECT_FALSE(media_channel2_->playout());
769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000771 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800772 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_FALSE(media_channel2_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800777 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_TRUE(media_channel1_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
783 EXPECT_FALSE(media_channel2_->playout());
784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_FALSE(media_channel2_->sending());
786 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
788 EXPECT_TRUE(media_channel2_->playout());
789 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000791 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800792 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200793 if (verify_playout_) {
794 EXPECT_TRUE(media_channel1_->playout());
795 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 EXPECT_TRUE(media_channel1_->sending());
797 }
798
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799 // Test that changing the MediaContentDirection in the local and remote
800 // session description start playout and sending at the right time.
801 void TestMediaContentDirection() {
802 CreateChannels(0, 0);
803 typename T::Content content1;
804 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
805 typename T::Content content2;
806 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
807 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800808 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
810 EXPECT_TRUE(channel1_->Enable(true));
811 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200812 if (verify_playout_) {
813 EXPECT_FALSE(media_channel1_->playout());
814 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200816 if (verify_playout_) {
817 EXPECT_FALSE(media_channel2_->playout());
818 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819 EXPECT_FALSE(media_channel2_->sending());
820
Steve Anton3828c062017-12-06 10:34:51 -0800821 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
822 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
823 EXPECT_TRUE(
824 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
825 EXPECT_TRUE(
826 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800827 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828
Peter Boström34fbfff2015-09-24 19:20:30 +0200829 if (verify_playout_) {
830 EXPECT_TRUE(media_channel1_->playout());
831 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000832 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200833 if (verify_playout_) {
834 EXPECT_FALSE(media_channel2_->playout()); // local InActive
835 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000836 EXPECT_FALSE(media_channel2_->sending()); // local InActive
837
838 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800839 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800840 EXPECT_TRUE(
841 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
842 EXPECT_TRUE(
843 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844
Peter Boström34fbfff2015-09-24 19:20:30 +0200845 if (verify_playout_) {
846 EXPECT_TRUE(media_channel1_->playout());
847 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200849 if (verify_playout_) {
850 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
851 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
853
854 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800855 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800856 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
857 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858
Peter Boström34fbfff2015-09-24 19:20:30 +0200859 if (verify_playout_) {
860 EXPECT_TRUE(media_channel1_->playout());
861 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200863 if (verify_playout_) {
864 EXPECT_TRUE(media_channel2_->playout());
865 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000866 EXPECT_TRUE(media_channel2_->sending());
867 }
868
Honghai Zhangcc411c02016-03-29 17:27:21 -0700869 // Tests that when the transport channel signals a candidate pair change
870 // event, the media channel will receive a call on the network route change.
871 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700872 static constexpr uint16_t kLocalNetId = 1;
873 static constexpr uint16_t kRemoteNetId = 2;
874 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800875 // Ipv4(20) + UDP(8).
876 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800877 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200878
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800879 CreateChannels(DTLS, DTLS);
880 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700881
Honghai Zhangcc411c02016-03-29 17:27:21 -0700882 typename T::MediaChannel* media_channel1 =
883 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700885
Zhi Huang942bc2e2017-11-13 13:26:07 -0800886 // Need to wait for the threads before calling
887 // |set_num_network_route_changes| because the network route would be set
888 // when creating the channel.
889 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200890 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800891 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800892 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200893 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800894 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
895
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200896 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200897 });
898 WaitForThreads();
899 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700900 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700902
eladalon05b07bb2017-08-24 07:40:16 -0700903 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800904 rtc::NetworkRoute network_route;
905 network_route.connected = true;
906 network_route.local_network_id = kLocalNetId;
907 network_route.remote_network_id = kRemoteNetId;
908 network_route.last_sent_packet_id = kLastPacketId;
909 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200910 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800911 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
912
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200913 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200914 });
915 WaitForThreads();
916 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Steve Antonea1bb352018-07-23 10:12:37 -0700917 rtc::NetworkRoute expected_network_route;
918 expected_network_route.connected = true;
919 expected_network_route.local_network_id = kLocalNetId;
920 expected_network_route.remote_network_id = kRemoteNetId;
921 expected_network_route.last_sent_packet_id = kLastPacketId;
Honghai Zhangcc411c02016-03-29 17:27:21 -0700922 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200923 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700924 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800925 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800926 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700927 }
928
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 // Test setting up a call.
930 void TestCallSetup() {
931 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700932 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200934 if (verify_playout_) {
935 EXPECT_TRUE(media_channel1_->playout());
936 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937 EXPECT_FALSE(media_channel1_->sending());
938 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700939 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 EXPECT_TRUE(media_channel1_->sending());
941 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200942 if (verify_playout_) {
943 EXPECT_TRUE(media_channel2_->playout());
944 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945 EXPECT_TRUE(media_channel2_->sending());
946 EXPECT_EQ(1U, media_channel2_->codecs().size());
947 }
948
949 // Test that we don't crash if packets are sent during call teardown
950 // when RTCP mux is enabled. This is a regression test against a specific
951 // race condition that would only occur when a RTCP packet was sent during
952 // teardown of a channel on which RTCP mux was enabled.
953 void TestCallTeardownRtcpMux() {
954 class LastWordMediaChannel : public T::MediaChannel {
955 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200956 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000957 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700958 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
959 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
961 }
962 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200963 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
964 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
965 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 EXPECT_TRUE(SendInitiate());
967 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800968 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969 }
970
971 // Send voice RTP data to the other side and ensure it gets there.
972 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700973 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000974 EXPECT_TRUE(SendInitiate());
975 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700976 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
977 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200978 SendRtp1();
979 SendRtp2();
980 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981 EXPECT_TRUE(CheckRtp1());
982 EXPECT_TRUE(CheckRtp2());
983 EXPECT_TRUE(CheckNoRtp1());
984 EXPECT_TRUE(CheckNoRtp2());
985 }
986
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200987 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800988 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200989 EXPECT_TRUE(SendInitiate());
990 EXPECT_TRUE(SendAccept());
991 SendRtp1();
992 SendRtp2();
993 SendRtcp1();
994 SendRtcp2();
995 // Do not wait, destroy channels.
996 channel1_.reset(nullptr);
997 channel2_.reset(nullptr);
998 }
999
deadbeefac22f702017-01-12 21:59:29 -08001000 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001002 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 EXPECT_TRUE(SendInitiate());
1004 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001005 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1006 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001007 SendRtcp1();
1008 SendRtcp2();
1009 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 EXPECT_TRUE(CheckRtcp1());
1011 EXPECT_TRUE(CheckRtcp2());
1012 EXPECT_TRUE(CheckNoRtcp1());
1013 EXPECT_TRUE(CheckNoRtcp2());
1014 }
1015
Zhi Huange830e682018-03-30 10:48:35 -07001016 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1017 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001018 EXPECT_FALSE(channel1_->srtp_active());
1019 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001021 WaitForThreads();
1022 EXPECT_TRUE(channel1_->writable());
1023 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001025 EXPECT_TRUE(channel1_->srtp_active());
1026 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001027 SendRtp1();
1028 SendRtp2();
1029 SendRtcp1();
1030 SendRtcp2();
1031 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(CheckRtp1());
1033 EXPECT_TRUE(CheckRtp2());
1034 EXPECT_TRUE(CheckNoRtp1());
1035 EXPECT_TRUE(CheckNoRtp2());
1036 EXPECT_TRUE(CheckRtcp1());
1037 EXPECT_TRUE(CheckRtcp2());
1038 EXPECT_TRUE(CheckNoRtcp1());
1039 EXPECT_TRUE(CheckNoRtcp2());
1040 }
1041
1042 // Test that we can send and receive early media when a provisional answer is
1043 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1044 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001045 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046
Yves Gerey665174f2018-06-19 15:03:05 +02001047 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1048 EXPECT_TRUE(SendOffer());
1049 EXPECT_TRUE(SendProvisionalAnswer());
1050 EXPECT_TRUE(channel1_->srtp_active());
1051 EXPECT_TRUE(channel2_->srtp_active());
1052 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1053 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1054 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1055 SendCustomRtcp1(kSsrc1);
1056 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1057 WaitForThreads();
1058 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1059 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060
Yves Gerey665174f2018-06-19 15:03:05 +02001061 // Send packets from callee and verify that it is received.
1062 SendCustomRtcp2(kSsrc2);
1063 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1064 WaitForThreads();
1065 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1066 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067
Yves Gerey665174f2018-06-19 15:03:05 +02001068 // Complete call setup and ensure everything is still OK.
1069 EXPECT_TRUE(SendFinalAnswer());
1070 EXPECT_TRUE(channel1_->srtp_active());
1071 EXPECT_TRUE(channel2_->srtp_active());
1072 SendCustomRtcp1(kSsrc1);
1073 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1074 SendCustomRtcp2(kSsrc2);
1075 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1076 WaitForThreads();
1077 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1078 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1079 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1080 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001081 }
1082
1083 // Test that we properly send RTP without SRTP from a thread.
1084 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001085 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(SendInitiate());
1087 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001088 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1089 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1090 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1091 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1092 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1093 send_rtcp1.thread(),
1094 send_rtcp2.thread()};
1095 WaitForThreads(involved_threads);
1096 EXPECT_TRUE(CheckRtp1());
1097 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(CheckNoRtp1());
1099 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001100 EXPECT_TRUE(CheckRtcp1());
1101 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 EXPECT_TRUE(CheckNoRtcp1());
1103 EXPECT_TRUE(CheckNoRtcp2());
1104 }
1105
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 // Test that the mediachannel retains its sending state after the transport
1107 // becomes non-writable.
1108 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001109 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_TRUE(SendInitiate());
1111 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001112 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1113 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001114 SendRtp1();
1115 SendRtp2();
1116 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 EXPECT_TRUE(CheckRtp1());
1118 EXPECT_TRUE(CheckRtp2());
1119 EXPECT_TRUE(CheckNoRtp1());
1120 EXPECT_TRUE(CheckNoRtp2());
1121
wu@webrtc.org97077a32013-10-25 21:18:33 +00001122 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001123 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1124 fake_rtp_dtls_transport1_->SetWritable(false);
1125 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001126 SendRtp1();
1127 SendRtp2();
1128 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 EXPECT_TRUE(CheckRtp1());
1130 EXPECT_TRUE(CheckNoRtp2());
1131
1132 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001133 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1134 fake_rtp_dtls_transport1_->SetWritable(true);
1135 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001137 SendRtp1();
1138 SendRtp2();
1139 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(CheckRtp1());
1141 EXPECT_TRUE(CheckRtp2());
1142 EXPECT_TRUE(CheckNoRtp1());
1143 EXPECT_TRUE(CheckNoRtp2());
1144
1145 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001146 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1147 bool asymmetric = true;
1148 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1149 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_TRUE(media_channel1_->sending());
1151
wu@webrtc.org97077a32013-10-25 21:18:33 +00001152 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001153 SendRtp1();
1154 SendRtp2();
1155 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 EXPECT_TRUE(CheckRtp1());
1157 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001158 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159
1160 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001161 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001162 bool asymmetric = true;
1163 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1164 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001165 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001167 SendRtp1();
1168 SendRtp2();
1169 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(CheckRtp1());
1171 EXPECT_TRUE(CheckRtp2());
1172 EXPECT_TRUE(CheckNoRtp1());
1173 EXPECT_TRUE(CheckNoRtp2());
1174 }
1175
Yves Gerey665174f2018-06-19 15:03:05 +02001176 void SendBundleToBundle(const int* pl_types,
1177 int len,
1178 bool rtcp_mux,
1179 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001180 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001182 // Only pl_type1 was added to the bundle filter for both |channel1_|
1183 // and |channel2_|.
1184 int pl_type1 = pl_types[0];
1185 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001186 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001187 if (secure)
1188 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001189 if (rtcp_mux) {
1190 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001191 }
1192 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001195
1196 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001197 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1198 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1199 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001200 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001201 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1202 EXPECT_TRUE(CheckNoRtp1());
1203 EXPECT_TRUE(CheckNoRtp2());
1204
Zhi Huang365381f2018-04-13 16:44:34 -07001205 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1206 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001207 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001208 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1209 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001210
Zhi Huange830e682018-03-30 10:48:35 -07001211 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001212 SendCustomRtcp1(kSsrc1);
1213 SendCustomRtcp2(kSsrc2);
1214 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1216 EXPECT_TRUE(CheckNoRtcp1());
1217 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1218 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001219
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001220 SendCustomRtcp1(kSsrc2);
1221 SendCustomRtcp2(kSsrc1);
1222 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001223 // Bundle filter shouldn't filter out any RTCP.
1224 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1225 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 }
1227
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 void TestSetContentFailure() {
1229 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230
Peter Thatchera6d24442015-07-09 21:26:36 -07001231 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001232 std::unique_ptr<typename T::Content> content(
1233 CreateMediaContentWithStream(1));
1234
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001237 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001238 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001239 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001242 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001243 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001244
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001246 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001247 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 }
1249
1250 void TestSendTwoOffers() {
1251 CreateChannels(0, 0);
1252
Peter Thatchera6d24442015-07-09 21:26:36 -07001253 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001254 std::unique_ptr<typename T::Content> content1(
1255 CreateMediaContentWithStream(1));
1256 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001257 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1259
Steve Anton18ee1d52017-09-11 11:32:35 -07001260 std::unique_ptr<typename T::Content> content2(
1261 CreateMediaContentWithStream(2));
1262 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001263 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001264 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1265 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1266 }
1267
1268 void TestReceiveTwoOffers() {
1269 CreateChannels(0, 0);
1270
Peter Thatchera6d24442015-07-09 21:26:36 -07001271 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001272 std::unique_ptr<typename T::Content> content1(
1273 CreateMediaContentWithStream(1));
1274 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001275 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001276 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1277
Steve Anton18ee1d52017-09-11 11:32:35 -07001278 std::unique_ptr<typename T::Content> content2(
1279 CreateMediaContentWithStream(2));
1280 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001281 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001282 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1283 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1284 }
1285
1286 void TestSendPrAnswer() {
1287 CreateChannels(0, 0);
1288
Peter Thatchera6d24442015-07-09 21:26:36 -07001289 std::string err;
1290 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001291 std::unique_ptr<typename T::Content> content1(
1292 CreateMediaContentWithStream(1));
1293 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001294 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001295 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1296
Peter Thatchera6d24442015-07-09 21:26:36 -07001297 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001298 std::unique_ptr<typename T::Content> content2(
1299 CreateMediaContentWithStream(2));
1300 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001301 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1303 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1304
Peter Thatchera6d24442015-07-09 21:26:36 -07001305 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001306 std::unique_ptr<typename T::Content> content3(
1307 CreateMediaContentWithStream(3));
1308 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001309 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001310 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1311 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1312 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1313 }
1314
1315 void TestReceivePrAnswer() {
1316 CreateChannels(0, 0);
1317
Peter Thatchera6d24442015-07-09 21:26:36 -07001318 std::string err;
1319 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001320 std::unique_ptr<typename T::Content> content1(
1321 CreateMediaContentWithStream(1));
1322 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001323 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1325
Peter Thatchera6d24442015-07-09 21:26:36 -07001326 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001327 std::unique_ptr<typename T::Content> content2(
1328 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001329 EXPECT_TRUE(
1330 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1332 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1333
Peter Thatchera6d24442015-07-09 21:26:36 -07001334 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001335 std::unique_ptr<typename T::Content> content3(
1336 CreateMediaContentWithStream(3));
1337 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001338 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001339 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1340 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1341 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1342 }
1343
1344 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001345 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346 EXPECT_TRUE(SendInitiate());
1347 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001348 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1349 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001350
1351 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001352 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353 // The sending message is only posted. channel2_ should be empty.
1354 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001355 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1356 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357
1358 // When channel1_ is deleted, the RTCP packet should be sent out to
1359 // channel2_.
1360 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001361 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001362 EXPECT_TRUE(CheckRtcp2());
1363 }
1364
zstein56162b92017-04-24 16:54:35 -07001365 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001366 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001368
zstein56162b92017-04-24 16:54:35 -07001369 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001370 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 EXPECT_TRUE(media_channel1_->ready_to_send());
1372
zstein56162b92017-04-24 16:54:35 -07001373 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001374 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001375 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 }
1377
skvladdc1c62c2016-03-16 19:07:43 -07001378 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1379 typename T::Content content;
1380 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1381 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001382 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001383 }
1384
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001385 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001386 webrtc::RtpParameters parameters;
1387 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001388 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001389 parameters.encodings.push_back(encoding);
1390 return parameters;
1391 }
1392
1393 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001394 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001395 EXPECT_EQ(1UL, parameters.encodings.size());
1396 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1397 }
1398
1399 void DefaultMaxBitrateIsUnlimited() {
1400 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001401 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1402 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001403 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001404 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001405 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001406 }
1407
Zhi Huange830e682018-03-30 10:48:35 -07001408 // Test that when a channel gets new RtpTransport with a call to
1409 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1410 // with the options on the new one.
1411
Steve Anton8a63f782017-10-23 13:08:53 -07001412 // For example, audio and video may use separate socket options, but initially
1413 // be unbundled, then later become bundled. When this happens, their preferred
1414 // socket options should be merged to the underlying transport they share.
1415 void SocketOptionsMergedOnSetTransport() {
1416 constexpr int kSndBufSize = 4000;
1417 constexpr int kRcvBufSize = 8000;
1418
Zhi Huange830e682018-03-30 10:48:35 -07001419 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001420
1421 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1422 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1423 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1424 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1425
Zhi Huange830e682018-03-30 10:48:35 -07001426 new_rtp_transport_ = CreateDtlsSrtpTransport(
1427 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1428 static_cast<DtlsTransportInternal*>(
1429 channel2_->rtcp_packet_transport()));
1430 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001431
1432 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001433 ASSERT_TRUE(
1434 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1435 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001436 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001437 ASSERT_TRUE(
1438 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1439 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001440 EXPECT_EQ(kRcvBufSize, option_val);
1441 }
1442
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001444 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1445 static void ProcessThreadQueue(rtc::Thread* thread) {
1446 RTC_DCHECK(thread->IsCurrent());
1447 while (!thread->empty()) {
1448 thread->ProcessMessages(0);
1449 }
1450 }
1451 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1452 // |threads| and current thread post packets to network thread.
1453 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001454 thread->Invoke<void>(RTC_FROM_HERE,
1455 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001456 }
1457 ProcessThreadQueue(rtc::Thread::Current());
1458 // Network thread move them around and post back to worker = current thread.
1459 if (!network_thread_->IsCurrent()) {
1460 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001461 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001462 }
1463 // Worker thread = current Thread process received messages.
1464 ProcessThreadQueue(rtc::Thread::Current());
1465 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001466 // TODO(pbos): Remove playout from all media channels and let renderers mute
1467 // themselves.
1468 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001469 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1470 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001471 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1472 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1473 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1474 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1475 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1476 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1477 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1478 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001479 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1480 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1481 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 cricket::FakeMediaEngine media_engine_;
1483 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001484 typename T::MediaChannel* media_channel1_ = nullptr;
1485 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001486 std::unique_ptr<typename T::Channel> channel1_;
1487 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001488 typename T::Content local_media_content1_;
1489 typename T::Content local_media_content2_;
1490 typename T::Content remote_media_content1_;
1491 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 rtc::Buffer rtp_packet_;
1494 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001495 int rtcp_mux_activated_callbacks1_ = 0;
1496 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001497 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498};
1499
Yves Gerey665174f2018-06-19 15:03:05 +02001500template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501void ChannelTest<VoiceTraits>::CreateContent(
1502 int flags,
1503 const cricket::AudioCodec& audio_codec,
1504 const cricket::VideoCodec& video_codec,
1505 cricket::AudioContentDescription* audio) {
1506 audio->AddCodec(audio_codec);
1507 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508}
1509
Yves Gerey665174f2018-06-19 15:03:05 +02001510template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511void ChannelTest<VoiceTraits>::CopyContent(
1512 const cricket::AudioContentDescription& source,
1513 cricket::AudioContentDescription* audio) {
1514 *audio = source;
1515}
1516
Yves Gerey665174f2018-06-19 15:03:05 +02001517template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1519 const cricket::AudioCodec& c2) {
1520 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001521 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522}
1523
Peter Boström0c4e06b2015-10-07 12:23:21 +02001524template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001526 uint32_t ssrc,
1527 int flags,
1528 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 audio->AddLegacyStream(ssrc);
1530}
1531
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001532class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 public:
solenberg1dd98f32015-09-10 01:57:14 -07001534 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001535 VoiceChannelSingleThreadTest()
1536 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1537};
1538
1539class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1540 public:
1541 typedef ChannelTest<VoiceTraits> Base;
1542 VoiceChannelDoubleThreadTest()
1543 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544};
1545
jbauch5869f502017-06-29 12:31:36 -07001546class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001547 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001548 public:
1549 typedef ChannelTest<VoiceTraits> Base;
1550 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001551 : Base(true,
1552 kPcmuFrameWithExtensions,
1553 kRtcpReport,
1554 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001555};
1556
1557class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001558 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001559 public:
1560 typedef ChannelTest<VoiceTraits> Base;
1561 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001562 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1563 }
jbauch5869f502017-06-29 12:31:36 -07001564};
1565
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001567template <>
Steve Anton8699a322017-11-06 15:53:33 -08001568std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001569 rtc::Thread* worker_thread,
1570 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001571 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001572 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001573 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001574 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001575 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001576 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001577 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001578 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001579 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 return channel;
1581}
1582
1583// override to add 0 parameter
Yves Gerey665174f2018-06-19 15:03:05 +02001584template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585bool ChannelTest<VideoTraits>::AddStream1(int id) {
1586 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1587}
1588
Yves Gerey665174f2018-06-19 15:03:05 +02001589template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590void ChannelTest<VideoTraits>::CreateContent(
1591 int flags,
1592 const cricket::AudioCodec& audio_codec,
1593 const cricket::VideoCodec& video_codec,
1594 cricket::VideoContentDescription* video) {
1595 video->AddCodec(video_codec);
1596 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597}
1598
Yves Gerey665174f2018-06-19 15:03:05 +02001599template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600void ChannelTest<VideoTraits>::CopyContent(
1601 const cricket::VideoContentDescription& source,
1602 cricket::VideoContentDescription* video) {
1603 *video = source;
1604}
1605
Yves Gerey665174f2018-06-19 15:03:05 +02001606template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1608 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001609 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610}
1611
Peter Boström0c4e06b2015-10-07 12:23:21 +02001612template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001614 uint32_t ssrc,
1615 int flags,
1616 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001617 video->AddLegacyStream(ssrc);
1618}
1619
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001620class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 public:
solenberg1dd98f32015-09-10 01:57:14 -07001622 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001623 VideoChannelSingleThreadTest()
1624 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625};
1626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1628 public:
1629 typedef ChannelTest<VideoTraits> Base;
1630 VideoChannelDoubleThreadTest()
1631 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1632};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001634TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::TestInit();
1636 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1637 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1638}
1639
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001640TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1641 Base::TestDeinit();
1642}
1643
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001644TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 Base::TestSetContents();
1646}
1647
Johannes Kron9190b822018-10-29 11:22:05 +01001648TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1649 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1650}
1651
1652TEST_F(VoiceChannelSingleThreadTest,
1653 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1654 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1655}
1656
1657TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1658 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1659}
1660
1661TEST_F(VoiceChannelSingleThreadTest,
1662 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1663 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::TestSetContentsNullOffer();
1668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 Base::TestSetContentsRtcpMux();
1672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::TestSetContentsRtcpMux();
1676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::TestStreams();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::TestChangeStreamParamsInContent();
1684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 Base::TestPlayoutAndSendingStates();
1688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::TestMediaContentDirection();
1692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001695 Base::TestNetworkRouteChanges();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 Base::TestCallSetup();
1700}
1701
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 Base::TestCallTeardownRtcpMux();
1704}
1705
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001706TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 Base::SendRtpToRtp();
1708}
1709
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 Base::SendRtcpToRtcp();
1712}
1713
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001715 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001719 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::SendRtpToRtpOnThread();
1728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 Base::SendWithWritabilityLoss();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 Base::TestSetContentFailure();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestSendTwoOffers();
1740}
1741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001742TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 Base::TestReceiveTwoOffers();
1744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 Base::TestSendPrAnswer();
1748}
1749
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001750TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 Base::TestReceivePrAnswer();
1752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 Base::TestFlushRtcp();
1756}
1757
zstein56162b92017-04-24 16:54:35 -07001758TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1759 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001763 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764}
1765
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001766TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001767 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001771 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001775 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001779 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001780}
1781
Steve Anton8a63f782017-10-23 13:08:53 -07001782TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1783 Base::SocketOptionsMergedOnSetTransport();
1784}
1785
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001786// VoiceChannelDoubleThreadTest
1787TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1790 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791}
1792
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001793TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1794 Base::TestDeinit();
1795}
1796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 Base::TestSetContents();
1799}
1800
Johannes Kron9190b822018-10-29 11:22:05 +01001801TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1802 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1803}
1804
1805TEST_F(VoiceChannelDoubleThreadTest,
1806 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1807 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1808}
1809
1810TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1811 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1812}
1813
1814TEST_F(VoiceChannelDoubleThreadTest,
1815 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1816 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1817}
1818
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001819TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 Base::TestSetContentsNullOffer();
1821}
1822
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 Base::TestSetContentsRtcpMux();
1825}
1826
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 Base::TestSetContentsRtcpMux();
1829}
1830
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001831TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 Base::TestStreams();
1833}
1834
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001835TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 Base::TestChangeStreamParamsInContent();
1837}
1838
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001839TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 Base::TestPlayoutAndSendingStates();
1841}
1842
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001843TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1844 Base::TestMediaContentDirection();
1845}
1846
1847TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1848 Base::TestNetworkRouteChanges();
1849}
1850
1851TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1852 Base::TestCallSetup();
1853}
1854
1855TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1856 Base::TestCallTeardownRtcpMux();
1857}
1858
1859TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1860 Base::SendRtpToRtp();
1861}
1862
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001863TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1864 Base::SendRtcpToRtcp();
1865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001868 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001869}
1870
1871TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001872 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001873}
1874
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001875TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1876 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1877}
1878
1879TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1880 Base::SendRtpToRtpOnThread();
1881}
1882
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001883TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1884 Base::SendWithWritabilityLoss();
1885}
1886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001887TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1888 Base::TestSetContentFailure();
1889}
1890
1891TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1892 Base::TestSendTwoOffers();
1893}
1894
1895TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1896 Base::TestReceiveTwoOffers();
1897}
1898
1899TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1900 Base::TestSendPrAnswer();
1901}
1902
1903TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1904 Base::TestReceivePrAnswer();
1905}
1906
1907TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1908 Base::TestFlushRtcp();
1909}
1910
zstein56162b92017-04-24 16:54:35 -07001911TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1912 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1916 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1917}
1918
1919TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1920 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1921}
1922
1923TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1924 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1925}
1926
1927TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1928 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1929}
1930
1931TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1932 Base::DefaultMaxBitrateIsUnlimited();
1933}
1934
Steve Anton8a63f782017-10-23 13:08:53 -07001935TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1936 Base::SocketOptionsMergedOnSetTransport();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939// VideoChannelSingleThreadTest
1940TEST_F(VideoChannelSingleThreadTest, TestInit) {
1941 Base::TestInit();
1942}
1943
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001944TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1945 Base::TestDeinit();
1946}
1947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1949 Base::TestSetContents();
1950}
1951
Johannes Kron9190b822018-10-29 11:22:05 +01001952TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1953 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1954}
1955
1956TEST_F(VideoChannelSingleThreadTest,
1957 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1958 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1959}
1960
1961TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1962 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1963}
1964
1965TEST_F(VideoChannelSingleThreadTest,
1966 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1967 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1971 Base::TestSetContentsNullOffer();
1972}
1973
1974TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1975 Base::TestSetContentsRtcpMux();
1976}
1977
1978TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1979 Base::TestSetContentsRtcpMux();
1980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1983 Base::TestStreams();
1984}
1985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001986TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1987 Base::TestChangeStreamParamsInContent();
1988}
1989
1990TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1991 Base::TestPlayoutAndSendingStates();
1992}
1993
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001994TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001995 Base::TestMediaContentDirection();
1996}
1997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001999 Base::TestNetworkRouteChanges();
2000}
2001
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002002TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003 Base::TestCallSetup();
2004}
2005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002006TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 Base::TestCallTeardownRtcpMux();
2008}
2009
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002010TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 Base::SendRtpToRtp();
2012}
2013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002014TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 Base::SendRtcpToRtcp();
2016}
2017
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002018TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002019 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002020}
2021
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002022TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002023 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024}
2025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002026TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002027 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2028}
2029
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002030TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002031 Base::SendRtpToRtpOnThread();
2032}
2033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002034TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 Base::SendWithWritabilityLoss();
2036}
2037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002038TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039 Base::TestSetContentFailure();
2040}
2041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002042TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 Base::TestSendTwoOffers();
2044}
2045
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002046TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 Base::TestReceiveTwoOffers();
2048}
2049
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002050TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 Base::TestSendPrAnswer();
2052}
2053
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002054TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055 Base::TestReceivePrAnswer();
2056}
2057
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002058TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059 Base::TestFlushRtcp();
2060}
2061
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002062TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002063 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064}
2065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002066TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002067 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002068}
2069
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002070TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002071 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002072}
2073
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002074TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002075 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076}
2077
zstein56162b92017-04-24 16:54:35 -07002078TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2079 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002080}
2081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002083 Base::DefaultMaxBitrateIsUnlimited();
2084}
2085
Steve Anton8a63f782017-10-23 13:08:53 -07002086TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2087 Base::SocketOptionsMergedOnSetTransport();
2088}
2089
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002090// VideoChannelDoubleThreadTest
2091TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2092 Base::TestInit();
2093}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002094
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002095TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2096 Base::TestDeinit();
2097}
2098
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002099TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2100 Base::TestSetContents();
2101}
2102
Johannes Kron9190b822018-10-29 11:22:05 +01002103TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2104 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2105}
2106
2107TEST_F(VideoChannelDoubleThreadTest,
2108 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2109 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2110}
2111
2112TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2113 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2114}
2115
2116TEST_F(VideoChannelDoubleThreadTest,
2117 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2118 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2119}
2120
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002121TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2122 Base::TestSetContentsNullOffer();
2123}
2124
2125TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2126 Base::TestSetContentsRtcpMux();
2127}
2128
2129TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2130 Base::TestSetContentsRtcpMux();
2131}
2132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002133TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2134 Base::TestStreams();
2135}
2136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002137TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2138 Base::TestChangeStreamParamsInContent();
2139}
2140
2141TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2142 Base::TestPlayoutAndSendingStates();
2143}
2144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002145TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2146 Base::TestMediaContentDirection();
2147}
2148
2149TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2150 Base::TestNetworkRouteChanges();
2151}
2152
2153TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2154 Base::TestCallSetup();
2155}
2156
2157TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2158 Base::TestCallTeardownRtcpMux();
2159}
2160
2161TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2162 Base::SendRtpToRtp();
2163}
2164
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002165TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2166 Base::SendRtcpToRtcp();
2167}
2168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002169TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002170 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002171}
2172
2173TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002174 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002175}
2176
2177TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2178 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2179}
2180
2181TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2182 Base::SendRtpToRtpOnThread();
2183}
2184
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002185TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2186 Base::SendWithWritabilityLoss();
2187}
2188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002189TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2190 Base::TestSetContentFailure();
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2194 Base::TestSendTwoOffers();
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2198 Base::TestReceiveTwoOffers();
2199}
2200
2201TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2202 Base::TestSendPrAnswer();
2203}
2204
2205TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2206 Base::TestReceivePrAnswer();
2207}
2208
2209TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2210 Base::TestFlushRtcp();
2211}
2212
2213TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2214 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2215}
2216
2217TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2218 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2219}
2220
2221TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2222 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2223}
2224
2225TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2226 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2227}
2228
zstein56162b92017-04-24 16:54:35 -07002229TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2230 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231}
2232
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002233TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2234 Base::DefaultMaxBitrateIsUnlimited();
2235}
2236
Steve Anton8a63f782017-10-23 13:08:53 -07002237TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2238 Base::SocketOptionsMergedOnSetTransport();
2239}
2240
deadbeef953c2ce2017-01-09 14:53:41 -08002241// RtpDataChannelSingleThreadTest
2242class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002245 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002246 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2247};
2248
deadbeef953c2ce2017-01-09 14:53:41 -08002249// RtpDataChannelDoubleThreadTest
2250class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251 public:
2252 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002253 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255};
2256
2257// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002258template <>
Steve Anton8699a322017-11-06 15:53:33 -08002259std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002260 rtc::Thread* worker_thread,
2261 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002262 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002263 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002264 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002265 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002266 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002267 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002268 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07002269 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002270 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271 return channel;
2272}
2273
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002274template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275void ChannelTest<DataTraits>::CreateContent(
2276 int flags,
2277 const cricket::AudioCodec& audio_codec,
2278 const cricket::VideoCodec& video_codec,
2279 cricket::DataContentDescription* data) {
2280 data->AddCodec(kGoogleDataCodec);
2281 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282}
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285void ChannelTest<DataTraits>::CopyContent(
2286 const cricket::DataContentDescription& source,
2287 cricket::DataContentDescription* data) {
2288 *data = source;
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2293 const cricket::DataCodec& c2) {
2294 return c1.name == c2.name;
2295}
2296
Peter Boström0c4e06b2015-10-07 12:23:21 +02002297template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002299 uint32_t ssrc,
2300 int flags,
2301 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 data->AddLegacyStream(ssrc);
2303}
2304
deadbeef953c2ce2017-01-09 14:53:41 -08002305TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 Base::TestInit();
2307 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2308}
2309
deadbeef953c2ce2017-01-09 14:53:41 -08002310TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002311 Base::TestDeinit();
2312}
2313
deadbeef953c2ce2017-01-09 14:53:41 -08002314TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315 Base::TestSetContents();
2316}
2317
deadbeef953c2ce2017-01-09 14:53:41 -08002318TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319 Base::TestSetContentsNullOffer();
2320}
2321
deadbeef953c2ce2017-01-09 14:53:41 -08002322TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 Base::TestSetContentsRtcpMux();
2324}
2325
deadbeef953c2ce2017-01-09 14:53:41 -08002326TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 Base::TestStreams();
2328}
2329
deadbeef953c2ce2017-01-09 14:53:41 -08002330TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 Base::TestChangeStreamParamsInContent();
2332}
2333
deadbeef953c2ce2017-01-09 14:53:41 -08002334TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 Base::TestPlayoutAndSendingStates();
2336}
2337
deadbeef953c2ce2017-01-09 14:53:41 -08002338TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 Base::TestMediaContentDirection();
2340}
2341
deadbeef953c2ce2017-01-09 14:53:41 -08002342TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343 Base::TestCallSetup();
2344}
2345
deadbeef953c2ce2017-01-09 14:53:41 -08002346TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 Base::TestCallTeardownRtcpMux();
2348}
2349
zstein56162b92017-04-24 16:54:35 -07002350TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2351 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352}
2353
deadbeef953c2ce2017-01-09 14:53:41 -08002354TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 Base::SendRtpToRtp();
2356}
2357
deadbeef953c2ce2017-01-09 14:53:41 -08002358TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 Base::SendRtcpToRtcp();
2360}
2361
deadbeef953c2ce2017-01-09 14:53:41 -08002362TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 Base::SendRtpToRtpOnThread();
2364}
2365
deadbeef953c2ce2017-01-09 14:53:41 -08002366TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 Base::SendWithWritabilityLoss();
2368}
2369
Steve Anton8a63f782017-10-23 13:08:53 -07002370TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2371 Base::SocketOptionsMergedOnSetTransport();
2372}
2373
deadbeef953c2ce2017-01-09 14:53:41 -08002374TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375 CreateChannels(0, 0);
2376 EXPECT_TRUE(SendInitiate());
2377 EXPECT_TRUE(SendAccept());
2378
2379 cricket::SendDataParams params;
2380 params.ssrc = 42;
2381 unsigned char data[] = {'f', 'o', 'o'};
2382 rtc::CopyOnWriteBuffer payload(data, 3);
2383 cricket::SendDataResult result;
2384 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2385 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2386 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2387}
2388
deadbeef953c2ce2017-01-09 14:53:41 -08002389TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002390 Base::TestInit();
2391 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2392}
2393
deadbeef953c2ce2017-01-09 14:53:41 -08002394TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002395 Base::TestDeinit();
2396}
2397
deadbeef953c2ce2017-01-09 14:53:41 -08002398TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002399 Base::TestSetContents();
2400}
2401
deadbeef953c2ce2017-01-09 14:53:41 -08002402TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403 Base::TestSetContentsNullOffer();
2404}
2405
deadbeef953c2ce2017-01-09 14:53:41 -08002406TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002407 Base::TestSetContentsRtcpMux();
2408}
2409
deadbeef953c2ce2017-01-09 14:53:41 -08002410TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002411 Base::TestStreams();
2412}
2413
deadbeef953c2ce2017-01-09 14:53:41 -08002414TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002415 Base::TestChangeStreamParamsInContent();
2416}
2417
deadbeef953c2ce2017-01-09 14:53:41 -08002418TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002419 Base::TestPlayoutAndSendingStates();
2420}
2421
deadbeef953c2ce2017-01-09 14:53:41 -08002422TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002423 Base::TestMediaContentDirection();
2424}
2425
deadbeef953c2ce2017-01-09 14:53:41 -08002426TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427 Base::TestCallSetup();
2428}
2429
deadbeef953c2ce2017-01-09 14:53:41 -08002430TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431 Base::TestCallTeardownRtcpMux();
2432}
2433
zstein56162b92017-04-24 16:54:35 -07002434TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2435 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002436}
2437
deadbeef953c2ce2017-01-09 14:53:41 -08002438TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002439 Base::SendRtpToRtp();
2440}
2441
deadbeef953c2ce2017-01-09 14:53:41 -08002442TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002443 Base::SendRtcpToRtcp();
2444}
2445
deadbeef953c2ce2017-01-09 14:53:41 -08002446TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447 Base::SendRtpToRtpOnThread();
2448}
2449
deadbeef953c2ce2017-01-09 14:53:41 -08002450TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451 Base::SendWithWritabilityLoss();
2452}
2453
Steve Anton8a63f782017-10-23 13:08:53 -07002454TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2455 Base::SocketOptionsMergedOnSetTransport();
2456}
2457
deadbeef953c2ce2017-01-09 14:53:41 -08002458TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459 CreateChannels(0, 0);
2460 EXPECT_TRUE(SendInitiate());
2461 EXPECT_TRUE(SendAccept());
2462
2463 cricket::SendDataParams params;
2464 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002465 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002466 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002467 cricket::SendDataResult result;
2468 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002469 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2471}
2472
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473// TODO(pthatcher): TestSetReceiver?