blob: 58cb17b8bbf5dd1f7cbe400fc5c5d5009c6d72b7 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010012#include <utility>
kwiberg31022942016-03-11 14:18:21 -080013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/array_view.h"
15#include "media/base/fakemediaengine.h"
16#include "media/base/fakertp.h"
17#include "media/base/mediachannel.h"
18#include "media/base/testutils.h"
19#include "p2p/base/fakecandidatepair.h"
20#include "p2p/base/fakedtlstransport.h"
21#include "p2p/base/fakepackettransport.h"
22#include "pc/channel.h"
23#include "rtc_base/buffer.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/fakeclock.h"
26#include "rtc_base/gunit.h"
27#include "rtc_base/logging.h"
28#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
zhihuangb2cdd932017-01-19 16:54:25 -080030using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080033using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080034using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Danil Chapovalov33b01f22016-05-11 19:55:27 +020036namespace {
37const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
38const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070040const cricket::VideoCodec kH264Codec(97, "H264");
41const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020042const cricket::DataCodec kGoogleDataCodec(101, "google-data");
43const uint32_t kSsrc1 = 0x1111;
44const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070045const uint32_t kSsrc3 = 0x3333;
46const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020047const int kAudioPts[] = {0, 8};
48const int kVideoPts[] = {97, 99};
49enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010050
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
deadbeefcbecd352015-09-23 11:50:27 -070053template <class ChannelT,
54 class MediaChannelT,
55 class ContentT,
56 class CodecT,
57 class MediaInfoT,
58 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059class Traits {
60 public:
61 typedef ChannelT Channel;
62 typedef MediaChannelT MediaChannel;
63 typedef ContentT Content;
64 typedef CodecT Codec;
65 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020066 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class VoiceTraits : public Traits<cricket::VoiceChannel,
70 cricket::FakeVoiceMediaChannel,
71 cricket::AudioContentDescription,
72 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070074 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class VideoTraits : public Traits<cricket::VideoChannel,
77 cricket::FakeVideoMediaChannel,
78 cricket::VideoContentDescription,
79 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070081 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
deadbeef953c2ce2017-01-09 14:53:41 -080083class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 cricket::FakeDataMediaChannel,
85 cricket::DataContentDescription,
86 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
deadbeef953c2ce2017-01-09 14:53:41 -080090// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +020091template <class T>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092class ChannelTest : public testing::Test, public sigslot::has_slots<> {
93 public:
deadbeefac22f702017-01-12 21:59:29 -080094 enum Flags {
95 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -080096 SSRC_MUX = 0x8,
97 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080098 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080099 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700100 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800101 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
Peter Boström34fbfff2015-09-24 19:20:30 +0200103 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200104 rtc::ArrayView<const uint8_t> rtp_data,
105 rtc::ArrayView<const uint8_t> rtcp_data,
106 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200107 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800109 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200110 if (network_is_worker == NetworkIsWorker::Yes) {
111 network_thread_ = rtc::Thread::Current();
112 } else {
113 network_thread_keeper_ = rtc::Thread::Create();
114 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 network_thread_ = network_thread_keeper_.get();
116 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200120 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800121 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200122 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800123 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Steve Anton8699a322017-11-06 15:53:33 -0800126 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
127 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 int flags1,
129 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800130 // Network thread is started in CreateChannels, to allow the test to
131 // configure a fake clock before any threads are spawned and attempt to
132 // access the time.
133 if (network_thread_keeper_) {
134 network_thread_keeper_->Start();
135 }
Zhi Huange830e682018-03-30 10:48:35 -0700136
deadbeeff5346592017-01-24 21:51:21 -0800137 // Make sure if using raw packet transports, they're used for both
138 // channels.
139 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200140 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800141 media_channel1_ = ch1.get();
142 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800143 rtc::PacketTransportInternal* rtp1 = nullptr;
144 rtc::PacketTransportInternal* rtcp1 = nullptr;
145 rtc::PacketTransportInternal* rtp2 = nullptr;
146 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800147 // Based on flags, create fake DTLS or raw packet transports.
148 if (flags1 & RAW_PACKET_TRANSPORT) {
149 fake_rtp_packet_transport1_.reset(
150 new rtc::FakePacketTransport("channel1_rtp"));
151 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700152 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800153 fake_rtcp_packet_transport1_.reset(
154 new rtc::FakePacketTransport("channel1_rtcp"));
155 rtcp1 = fake_rtcp_packet_transport1_.get();
156 }
157 } else {
158 // Confirmed to work with KT_RSA and KT_ECDSA.
159 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
160 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
161 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700162 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800163 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
164 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
165 rtcp1 = fake_rtcp_dtls_transport1_.get();
166 }
167 if (flags1 & DTLS) {
168 auto cert1 =
169 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
170 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
171 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
172 if (fake_rtcp_dtls_transport1_) {
173 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
174 }
175 }
176 }
177 // Based on flags, create fake DTLS or raw packet transports.
178 if (flags2 & RAW_PACKET_TRANSPORT) {
179 fake_rtp_packet_transport2_.reset(
180 new rtc::FakePacketTransport("channel2_rtp"));
181 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700182 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800183 fake_rtcp_packet_transport2_.reset(
184 new rtc::FakePacketTransport("channel2_rtcp"));
185 rtcp2 = fake_rtcp_packet_transport2_.get();
186 }
187 } else {
188 // Confirmed to work with KT_RSA and KT_ECDSA.
189 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
190 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
191 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700192 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800193 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
194 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
195 rtcp2 = fake_rtcp_dtls_transport2_.get();
196 }
197 if (flags2 & DTLS) {
198 auto cert2 =
199 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
200 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
201 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
202 if (fake_rtcp_dtls_transport2_) {
203 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
204 }
205 }
206 }
Zhi Huange830e682018-03-30 10:48:35 -0700207 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
208 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
209 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
210 flags1);
211 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
212 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
213 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
214 flags2);
215
216 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
217 std::move(ch1), rtp_transport1_.get(), flags1);
218 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
219 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800220 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800221 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800222 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800223 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200224 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
225 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226 CopyContent(local_media_content1_, &remote_media_content1_);
227 CopyContent(local_media_content2_, &remote_media_content2_);
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 // Add stream information (SSRC) to the local content but not to the remote
230 // content. This means that we per default know the SSRC of what we send but
231 // not what we receive.
232 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
233 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
234
235 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
236 if (flags1 & SSRC_MUX) {
237 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
238 }
239 if (flags2 & SSRC_MUX) {
240 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
241 }
242 }
Steve Anton8699a322017-11-06 15:53:33 -0800243 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200244 rtc::Thread* worker_thread,
245 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700246 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800247 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700248 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700249 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800250 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200251 auto channel = absl::make_unique<typename T::Channel>(
Steve Anton8699a322017-11-06 15:53:33 -0800252 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Oleh Prypin8f4bc412018-10-11 21:10:39 +0000253 cricket::CN_AUDIO, (flags & DTLS) != 0, rtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -0700254 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000255 return channel;
256 }
257
Zhi Huange830e682018-03-30 10:48:35 -0700258 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
259 rtc::PacketTransportInternal* rtp_packet_transport,
260 rtc::PacketTransportInternal* rtcp_packet_transport,
261 DtlsTransportInternal* rtp_dtls_transport,
262 DtlsTransportInternal* rtcp_dtls_transport,
263 int flags) {
264 if (flags & RTCP_MUX) {
265 rtcp_packet_transport = nullptr;
266 rtcp_dtls_transport = nullptr;
267 }
268
269 if (flags & DTLS) {
270 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
271 } else {
272 if (flags & RAW_PACKET_TRANSPORT) {
273 return CreateUnencryptedTransport(rtp_packet_transport,
274 rtcp_packet_transport);
275 } else {
276 return CreateUnencryptedTransport(rtp_dtls_transport,
277 rtcp_dtls_transport);
278 }
279 }
280 }
281
282 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
283 rtc::PacketTransportInternal* rtp_packet_transport,
284 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200285 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
286 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700287
288 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
289 if (rtcp_packet_transport) {
290 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
291 }
292 return rtp_transport;
293 }
294
295 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
296 cricket::DtlsTransportInternal* rtp_dtls_transport,
297 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200298 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700299 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700300
301 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
302 rtcp_dtls_transport);
303 return dtls_srtp_transport;
304 }
305
deadbeeff5346592017-01-24 21:51:21 -0800306 void ConnectFakeTransports() {
307 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
308 bool asymmetric = false;
309 // Depending on test flags, could be using DTLS or raw packet transport.
310 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
311 fake_rtp_dtls_transport1_->SetDestination(
312 fake_rtp_dtls_transport2_.get(), asymmetric);
313 }
314 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
315 fake_rtcp_dtls_transport1_->SetDestination(
316 fake_rtcp_dtls_transport2_.get(), asymmetric);
317 }
318 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
319 fake_rtp_packet_transport1_->SetDestination(
320 fake_rtp_packet_transport2_.get(), asymmetric);
321 }
322 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
323 fake_rtcp_packet_transport1_->SetDestination(
324 fake_rtcp_packet_transport2_.get(), asymmetric);
325 }
326 });
327 }
328
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000330 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800331 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 if (result) {
333 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000334 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800335 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800337 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000338 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800339 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000340 }
341 }
342 return result;
343 }
344
345 bool SendAccept() {
346 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000347 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800348 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349 }
350
351 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000352 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800353 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 if (result) {
355 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000356 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800357 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 }
359 return result;
360 }
361
362 bool SendProvisionalAnswer() {
363 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800364 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000365 if (result) {
366 channel2_->Enable(true);
367 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800368 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800369 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 }
371 return result;
372 }
373
374 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000375 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800376 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800379 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 return result;
381 }
382
deadbeeff5346592017-01-24 21:51:21 -0800383 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384 channel1_.reset();
385 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800386 fake_rtp_dtls_transport1_.reset();
387 fake_rtcp_dtls_transport1_.reset();
388 fake_rtp_dtls_transport2_.reset();
389 fake_rtcp_dtls_transport2_.reset();
390 fake_rtp_packet_transport1_.reset();
391 fake_rtcp_packet_transport1_.reset();
392 fake_rtp_packet_transport2_.reset();
393 fake_rtcp_packet_transport2_.reset();
394 if (network_thread_keeper_) {
395 network_thread_keeper_.reset();
396 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 return true;
398 }
399
400 bool AddStream1(int id) {
401 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
402 }
Yves Gerey665174f2018-06-19 15:03:05 +0200403 bool RemoveStream1(int id) { return channel1_->RemoveRecvStream(id); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200405 void SendRtp1() {
406 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
407 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200409 void SendRtp2() {
410 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
411 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendRtcp1() {
414 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendRtcp2() {
417 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
419 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
421 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
422 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200424 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
425 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
426 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 void SendCustomRtcp1(uint32_t ssrc) {
429 rtc::Buffer data = CreateRtcpData(ssrc);
430 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 void SendCustomRtcp2(uint32_t ssrc) {
433 rtc::Buffer data = CreateRtcpData(ssrc);
434 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200438 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 }
440 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 }
443 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
446 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200447 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
449 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200450 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
452 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200454 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200455 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
456 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200458 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200459 rtc::Buffer data = CreateRtcpData(ssrc);
460 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200462 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200463 rtc::Buffer data = CreateRtcpData(ssrc);
464 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
467 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::SetBE32(data.data() + 8, ssrc);
470 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000471 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200472 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000473 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 return data;
475 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
477 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 return data;
481 }
482
Yves Gerey665174f2018-06-19 15:03:05 +0200483 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
484 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
485 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
486 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487
488 void CreateContent(int flags,
489 const cricket::AudioCodec& audio_codec,
490 const cricket::VideoCodec& video_codec,
491 typename T::Content* content) {
492 // overridden in specialized classes
493 }
494 void CopyContent(const typename T::Content& source,
495 typename T::Content* content) {
496 // overridden in specialized classes
497 }
498
Steve Anton18ee1d52017-09-11 11:32:35 -0700499 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700501 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
502 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700503 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700504 AddLegacyStreamInContent(ssrc, 0, content);
505 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506 }
507
ossu292d6582016-03-17 02:31:13 -0700508 // Will manage the lifetime of a CallThread, making sure it's
509 // destroyed before this object goes out of scope.
510 class ScopedCallThread {
511 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200512 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700513 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200514 : thread_(rtc::Thread::Create()),
515 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700516 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700517 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700518 }
519
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200520 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700521
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200522 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700523
524 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 std::unique_ptr<rtc::Thread> thread_;
526 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700527 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
530 return false; // overridden in specialized classes
531 }
532
deadbeeff5346592017-01-24 21:51:21 -0800533 void OnRtcpMuxFullyActive1(const std::string&) {
534 rtcp_mux_activated_callbacks1_++;
535 }
536 void OnRtcpMuxFullyActive2(const std::string&) {
537 rtcp_mux_activated_callbacks2_++;
538 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539
Honghai Zhangcc411c02016-03-29 17:27:21 -0700540 cricket::CandidatePairInterface* last_selected_candidate_pair() {
541 return last_selected_candidate_pair_;
542 }
543
Peter Boström0c4e06b2015-10-07 12:23:21 +0200544 void AddLegacyStreamInContent(uint32_t ssrc,
545 int flags,
546 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 // Base implementation.
548 }
549
550 // Tests that can be used by derived classes.
551
552 // Basic sanity check.
553 void TestInit() {
554 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700555 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200557 if (verify_playout_) {
558 EXPECT_FALSE(media_channel1_->playout());
559 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 EXPECT_TRUE(media_channel1_->codecs().empty());
561 EXPECT_TRUE(media_channel1_->recv_streams().empty());
562 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
563 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
564 }
565
566 // Test that SetLocalContent and SetRemoteContent properly configure
567 // the codecs.
568 void TestSetContents() {
569 CreateChannels(0, 0);
570 typename T::Content content;
571 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800572 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800574 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200576 EXPECT_TRUE(
577 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 }
579
580 // Test that SetLocalContent and SetRemoteContent properly deals
581 // with an empty offer.
582 void TestSetContentsNullOffer() {
583 CreateChannels(0, 0);
584 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800585 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 CreateContent(0, kPcmuCodec, kH264Codec, &content);
587 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800588 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200590 EXPECT_TRUE(
591 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592 }
593
594 // Test that SetLocalContent and SetRemoteContent properly set RTCP
595 // mux.
596 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800597 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 typename T::Content content;
599 CreateContent(0, kPcmuCodec, kH264Codec, &content);
600 // Both sides agree on mux. Should no longer be a separate RTCP channel.
601 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800602 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
603 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800605 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800607 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 }
609
610 // Test that SetLocalContent and SetRemoteContent properly set RTCP
611 // mux when a provisional answer is received.
612 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800613 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 typename T::Content content;
615 CreateContent(0, kPcmuCodec, kH264Codec, &content);
616 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800617 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
618 EXPECT_TRUE(
619 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800620 // Both sides agree on mux. Should signal RTCP mux as fully activated.
621 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800622 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800623 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800625 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800627 EXPECT_TRUE(
628 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
629 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800630 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 // Test that Add/RemoveStream properly forward to the media channel.
634 void TestStreams() {
635 CreateChannels(0, 0);
636 EXPECT_TRUE(AddStream1(1));
637 EXPECT_TRUE(AddStream1(2));
638 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
639 EXPECT_TRUE(RemoveStream1(2));
640 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
641 EXPECT_TRUE(RemoveStream1(1));
642 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
643 }
644
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Test that SetLocalContent and SetRemoteContent properly
646 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800647 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 void TestChangeStreamParamsInContent() {
649 cricket::StreamParams stream1;
650 stream1.groupid = "group1";
651 stream1.id = "stream1";
652 stream1.ssrcs.push_back(kSsrc1);
653 stream1.cname = "stream1_cname";
654
655 cricket::StreamParams stream2;
656 stream2.groupid = "group1";
657 stream2.id = "stream2";
658 stream2.ssrcs.push_back(kSsrc2);
659 stream2.cname = "stream2_cname";
660
661 // Setup a call where channel 1 send |stream1| to channel 2.
662 CreateChannels(0, 0);
663 typename T::Content content1;
664 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
665 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800666 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 EXPECT_TRUE(channel1_->Enable(true));
668 EXPECT_EQ(1u, media_channel1_->send_streams().size());
669
Steve Anton3828c062017-12-06 10:34:51 -0800670 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800672 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673
674 // Channel 2 do not send anything.
675 typename T::Content content2;
676 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800677 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800679 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_TRUE(channel2_->Enable(true));
681 EXPECT_EQ(0u, media_channel2_->send_streams().size());
682
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200683 SendCustomRtp1(kSsrc1, 0);
684 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
686
687 // Let channel 2 update the content by sending |stream2| and enable SRTP.
688 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700689 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 ASSERT_EQ(1u, media_channel2_->send_streams().size());
693 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
694
Steve Anton3828c062017-12-06 10:34:51 -0800695 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
697 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
698
699 // Channel 1 replies but stop sending stream1.
700 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700701 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800702 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_EQ(0u, media_channel1_->send_streams().size());
704
Steve Anton3828c062017-12-06 10:34:51 -0800705 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
707
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200708 SendCustomRtp2(kSsrc2, 0);
709 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
711 }
712
713 // Test that we only start playout and sending at the right times.
714 void TestPlayoutAndSendingStates() {
715 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200716 if (verify_playout_) {
717 EXPECT_FALSE(media_channel1_->playout());
718 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200720 if (verify_playout_) {
721 EXPECT_FALSE(media_channel2_->playout());
722 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 EXPECT_FALSE(media_channel2_->sending());
724 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200725 if (verify_playout_) {
726 EXPECT_FALSE(media_channel1_->playout());
727 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000729 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800730 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200731 if (verify_playout_) {
732 EXPECT_TRUE(media_channel1_->playout());
733 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000735 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800736 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
738 EXPECT_FALSE(media_channel2_->playout());
739 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000741 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800742 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200743 if (verify_playout_) {
744 EXPECT_FALSE(media_channel2_->playout());
745 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800747 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200748 if (verify_playout_) {
749 EXPECT_TRUE(media_channel1_->playout());
750 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 if (verify_playout_) {
753 EXPECT_FALSE(media_channel2_->playout());
754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_FALSE(media_channel2_->sending());
756 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
758 EXPECT_TRUE(media_channel2_->playout());
759 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000761 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800762 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
764 EXPECT_TRUE(media_channel1_->playout());
765 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_TRUE(media_channel1_->sending());
767 }
768
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 // Test that changing the MediaContentDirection in the local and remote
770 // session description start playout and sending at the right time.
771 void TestMediaContentDirection() {
772 CreateChannels(0, 0);
773 typename T::Content content1;
774 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
775 typename T::Content content2;
776 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
777 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800778 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779
780 EXPECT_TRUE(channel1_->Enable(true));
781 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
783 EXPECT_FALSE(media_channel1_->playout());
784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200786 if (verify_playout_) {
787 EXPECT_FALSE(media_channel2_->playout());
788 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789 EXPECT_FALSE(media_channel2_->sending());
790
Steve Anton3828c062017-12-06 10:34:51 -0800791 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
792 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
793 EXPECT_TRUE(
794 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
795 EXPECT_TRUE(
796 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800797 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 if (verify_playout_) {
800 EXPECT_TRUE(media_channel1_->playout());
801 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 if (verify_playout_) {
804 EXPECT_FALSE(media_channel2_->playout()); // local InActive
805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_FALSE(media_channel2_->sending()); // local InActive
807
808 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800809 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800810 EXPECT_TRUE(
811 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
812 EXPECT_TRUE(
813 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814
Peter Boström34fbfff2015-09-24 19:20:30 +0200815 if (verify_playout_) {
816 EXPECT_TRUE(media_channel1_->playout());
817 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200819 if (verify_playout_) {
820 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
821 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
823
824 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800825 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800826 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
827 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
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_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200833 if (verify_playout_) {
834 EXPECT_TRUE(media_channel2_->playout());
835 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000836 EXPECT_TRUE(media_channel2_->sending());
837 }
838
Honghai Zhangcc411c02016-03-29 17:27:21 -0700839 // Tests that when the transport channel signals a candidate pair change
840 // event, the media channel will receive a call on the network route change.
841 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700842 static constexpr uint16_t kLocalNetId = 1;
843 static constexpr uint16_t kRemoteNetId = 2;
844 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800845 // Ipv4(20) + UDP(8).
846 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800847 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200848
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800849 CreateChannels(DTLS, DTLS);
850 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700851
Honghai Zhangcc411c02016-03-29 17:27:21 -0700852 typename T::MediaChannel* media_channel1 =
853 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200854 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700855
Zhi Huang942bc2e2017-11-13 13:26:07 -0800856 // Need to wait for the threads before calling
857 // |set_num_network_route_changes| because the network route would be set
858 // when creating the channel.
859 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200860 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800861 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800862 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200863 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800864 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
865
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200866 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200867 });
868 WaitForThreads();
869 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700870 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200871 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700872
eladalon05b07bb2017-08-24 07:40:16 -0700873 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800874 rtc::NetworkRoute network_route;
875 network_route.connected = true;
876 network_route.local_network_id = kLocalNetId;
877 network_route.remote_network_id = kRemoteNetId;
878 network_route.last_sent_packet_id = kLastPacketId;
879 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200880 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800881 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
882
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200883 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 });
885 WaitForThreads();
886 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Steve Antonea1bb352018-07-23 10:12:37 -0700887 rtc::NetworkRoute expected_network_route;
888 expected_network_route.connected = true;
889 expected_network_route.local_network_id = kLocalNetId;
890 expected_network_route.remote_network_id = kRemoteNetId;
891 expected_network_route.last_sent_packet_id = kLastPacketId;
Honghai Zhangcc411c02016-03-29 17:27:21 -0700892 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200893 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700894 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800895 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800896 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700897 }
898
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 // Test setting up a call.
900 void TestCallSetup() {
901 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700902 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000903 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200904 if (verify_playout_) {
905 EXPECT_TRUE(media_channel1_->playout());
906 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907 EXPECT_FALSE(media_channel1_->sending());
908 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700909 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 EXPECT_TRUE(media_channel1_->sending());
911 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200912 if (verify_playout_) {
913 EXPECT_TRUE(media_channel2_->playout());
914 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 EXPECT_TRUE(media_channel2_->sending());
916 EXPECT_EQ(1U, media_channel2_->codecs().size());
917 }
918
919 // Test that we don't crash if packets are sent during call teardown
920 // when RTCP mux is enabled. This is a regression test against a specific
921 // race condition that would only occur when a RTCP packet was sent during
922 // teardown of a channel on which RTCP mux was enabled.
923 void TestCallTeardownRtcpMux() {
924 class LastWordMediaChannel : public T::MediaChannel {
925 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200926 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700928 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
929 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
931 }
932 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200933 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
934 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
935 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 EXPECT_TRUE(SendInitiate());
937 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800938 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 }
940
941 // Send voice RTP data to the other side and ensure it gets there.
942 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700943 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_TRUE(SendInitiate());
945 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700946 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
947 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200948 SendRtp1();
949 SendRtp2();
950 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_TRUE(CheckRtp1());
952 EXPECT_TRUE(CheckRtp2());
953 EXPECT_TRUE(CheckNoRtp1());
954 EXPECT_TRUE(CheckNoRtp2());
955 }
956
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200957 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800958 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200959 EXPECT_TRUE(SendInitiate());
960 EXPECT_TRUE(SendAccept());
961 SendRtp1();
962 SendRtp2();
963 SendRtcp1();
964 SendRtcp2();
965 // Do not wait, destroy channels.
966 channel1_.reset(nullptr);
967 channel2_.reset(nullptr);
968 }
969
deadbeefac22f702017-01-12 21:59:29 -0800970 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800972 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 EXPECT_TRUE(SendInitiate());
974 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700975 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
976 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200977 SendRtcp1();
978 SendRtcp2();
979 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 EXPECT_TRUE(CheckRtcp1());
981 EXPECT_TRUE(CheckRtcp2());
982 EXPECT_TRUE(CheckNoRtcp1());
983 EXPECT_TRUE(CheckNoRtcp2());
984 }
985
Zhi Huange830e682018-03-30 10:48:35 -0700986 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
987 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700988 EXPECT_FALSE(channel1_->srtp_active());
989 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200991 WaitForThreads();
992 EXPECT_TRUE(channel1_->writable());
993 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700995 EXPECT_TRUE(channel1_->srtp_active());
996 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200997 SendRtp1();
998 SendRtp2();
999 SendRtcp1();
1000 SendRtcp2();
1001 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_TRUE(CheckRtp1());
1003 EXPECT_TRUE(CheckRtp2());
1004 EXPECT_TRUE(CheckNoRtp1());
1005 EXPECT_TRUE(CheckNoRtp2());
1006 EXPECT_TRUE(CheckRtcp1());
1007 EXPECT_TRUE(CheckRtcp2());
1008 EXPECT_TRUE(CheckNoRtcp1());
1009 EXPECT_TRUE(CheckNoRtcp2());
1010 }
1011
1012 // Test that we can send and receive early media when a provisional answer is
1013 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1014 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001015 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016
Yves Gerey665174f2018-06-19 15:03:05 +02001017 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1018 EXPECT_TRUE(SendOffer());
1019 EXPECT_TRUE(SendProvisionalAnswer());
1020 EXPECT_TRUE(channel1_->srtp_active());
1021 EXPECT_TRUE(channel2_->srtp_active());
1022 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1023 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1024 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1025 SendCustomRtcp1(kSsrc1);
1026 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1027 WaitForThreads();
1028 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1029 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030
Yves Gerey665174f2018-06-19 15:03:05 +02001031 // Send packets from callee and verify that it is received.
1032 SendCustomRtcp2(kSsrc2);
1033 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1034 WaitForThreads();
1035 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1036 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037
Yves Gerey665174f2018-06-19 15:03:05 +02001038 // Complete call setup and ensure everything is still OK.
1039 EXPECT_TRUE(SendFinalAnswer());
1040 EXPECT_TRUE(channel1_->srtp_active());
1041 EXPECT_TRUE(channel2_->srtp_active());
1042 SendCustomRtcp1(kSsrc1);
1043 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1044 SendCustomRtcp2(kSsrc2);
1045 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1046 WaitForThreads();
1047 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1048 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1049 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1050 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001051 }
1052
1053 // Test that we properly send RTP without SRTP from a thread.
1054 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001055 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 EXPECT_TRUE(SendInitiate());
1057 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001058 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1059 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1060 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1061 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1062 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1063 send_rtcp1.thread(),
1064 send_rtcp2.thread()};
1065 WaitForThreads(involved_threads);
1066 EXPECT_TRUE(CheckRtp1());
1067 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068 EXPECT_TRUE(CheckNoRtp1());
1069 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001070 EXPECT_TRUE(CheckRtcp1());
1071 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001072 EXPECT_TRUE(CheckNoRtcp1());
1073 EXPECT_TRUE(CheckNoRtcp2());
1074 }
1075
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 // Test that the mediachannel retains its sending state after the transport
1077 // becomes non-writable.
1078 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001079 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(SendInitiate());
1081 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001082 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1083 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001084 SendRtp1();
1085 SendRtp2();
1086 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001087 EXPECT_TRUE(CheckRtp1());
1088 EXPECT_TRUE(CheckRtp2());
1089 EXPECT_TRUE(CheckNoRtp1());
1090 EXPECT_TRUE(CheckNoRtp2());
1091
wu@webrtc.org97077a32013-10-25 21:18:33 +00001092 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001093 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1094 fake_rtp_dtls_transport1_->SetWritable(false);
1095 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001096 SendRtp1();
1097 SendRtp2();
1098 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_TRUE(CheckRtp1());
1100 EXPECT_TRUE(CheckNoRtp2());
1101
1102 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001103 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1104 fake_rtp_dtls_transport1_->SetWritable(true);
1105 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001107 SendRtp1();
1108 SendRtp2();
1109 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_TRUE(CheckRtp1());
1111 EXPECT_TRUE(CheckRtp2());
1112 EXPECT_TRUE(CheckNoRtp1());
1113 EXPECT_TRUE(CheckNoRtp2());
1114
1115 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001116 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1117 bool asymmetric = true;
1118 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1119 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 EXPECT_TRUE(media_channel1_->sending());
1121
wu@webrtc.org97077a32013-10-25 21:18:33 +00001122 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001123 SendRtp1();
1124 SendRtp2();
1125 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(CheckRtp1());
1127 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001128 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129
1130 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001131 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001132 bool asymmetric = true;
1133 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1134 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001135 });
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
Yves Gerey665174f2018-06-19 15:03:05 +02001146 void SendBundleToBundle(const int* pl_types,
1147 int len,
1148 bool rtcp_mux,
1149 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001150 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001152 // Only pl_type1 was added to the bundle filter for both |channel1_|
1153 // and |channel2_|.
1154 int pl_type1 = pl_types[0];
1155 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001156 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001157 if (secure)
1158 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001159 if (rtcp_mux) {
1160 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001161 }
1162 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001165
1166 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001167 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1168 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1169 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001170 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001171 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1172 EXPECT_TRUE(CheckNoRtp1());
1173 EXPECT_TRUE(CheckNoRtp2());
1174
Zhi Huang365381f2018-04-13 16:44:34 -07001175 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1176 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001177 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001178 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1179 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001180
Zhi Huange830e682018-03-30 10:48:35 -07001181 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001182 SendCustomRtcp1(kSsrc1);
1183 SendCustomRtcp2(kSsrc2);
1184 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1186 EXPECT_TRUE(CheckNoRtcp1());
1187 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1188 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001190 SendCustomRtcp1(kSsrc2);
1191 SendCustomRtcp2(kSsrc1);
1192 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001193 // Bundle filter shouldn't filter out any RTCP.
1194 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1195 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196 }
1197
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198 void TestSetContentFailure() {
1199 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001200
Peter Thatchera6d24442015-07-09 21:26:36 -07001201 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001202 std::unique_ptr<typename T::Content> content(
1203 CreateMediaContentWithStream(1));
1204
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001206 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001207 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001208 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001209 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001212 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001213 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001214
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001216 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001217 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218 }
1219
1220 void TestSendTwoOffers() {
1221 CreateChannels(0, 0);
1222
Peter Thatchera6d24442015-07-09 21:26:36 -07001223 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001224 std::unique_ptr<typename T::Content> content1(
1225 CreateMediaContentWithStream(1));
1226 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001227 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1229
Steve Anton18ee1d52017-09-11 11:32:35 -07001230 std::unique_ptr<typename T::Content> content2(
1231 CreateMediaContentWithStream(2));
1232 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001233 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1235 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1236 }
1237
1238 void TestReceiveTwoOffers() {
1239 CreateChannels(0, 0);
1240
Peter Thatchera6d24442015-07-09 21:26:36 -07001241 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001242 std::unique_ptr<typename T::Content> content1(
1243 CreateMediaContentWithStream(1));
1244 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001245 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001246 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1247
Steve Anton18ee1d52017-09-11 11:32:35 -07001248 std::unique_ptr<typename T::Content> content2(
1249 CreateMediaContentWithStream(2));
1250 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001251 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001252 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1253 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1254 }
1255
1256 void TestSendPrAnswer() {
1257 CreateChannels(0, 0);
1258
Peter Thatchera6d24442015-07-09 21:26:36 -07001259 std::string err;
1260 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001261 std::unique_ptr<typename T::Content> content1(
1262 CreateMediaContentWithStream(1));
1263 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001264 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1266
Peter Thatchera6d24442015-07-09 21:26:36 -07001267 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001268 std::unique_ptr<typename T::Content> content2(
1269 CreateMediaContentWithStream(2));
1270 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001271 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1273 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1274
Peter Thatchera6d24442015-07-09 21:26:36 -07001275 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001276 std::unique_ptr<typename T::Content> content3(
1277 CreateMediaContentWithStream(3));
1278 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001279 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1281 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1282 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1283 }
1284
1285 void TestReceivePrAnswer() {
1286 CreateChannels(0, 0);
1287
Peter Thatchera6d24442015-07-09 21:26:36 -07001288 std::string err;
1289 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001290 std::unique_ptr<typename T::Content> content1(
1291 CreateMediaContentWithStream(1));
1292 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001293 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1295
Peter Thatchera6d24442015-07-09 21:26:36 -07001296 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001297 std::unique_ptr<typename T::Content> content2(
1298 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001299 EXPECT_TRUE(
1300 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001301 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1302 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1303
Peter Thatchera6d24442015-07-09 21:26:36 -07001304 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001305 std::unique_ptr<typename T::Content> content3(
1306 CreateMediaContentWithStream(3));
1307 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001308 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1310 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1311 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1312 }
1313
1314 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001315 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 EXPECT_TRUE(SendInitiate());
1317 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001318 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1319 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320
1321 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001322 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323 // The sending message is only posted. channel2_ should be empty.
1324 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001325 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1326 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327
1328 // When channel1_ is deleted, the RTCP packet should be sent out to
1329 // channel2_.
1330 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001331 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332 EXPECT_TRUE(CheckRtcp2());
1333 }
1334
zstein56162b92017-04-24 16:54:35 -07001335 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001336 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001338
zstein56162b92017-04-24 16:54:35 -07001339 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001340 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001341 EXPECT_TRUE(media_channel1_->ready_to_send());
1342
zstein56162b92017-04-24 16:54:35 -07001343 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001344 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346 }
1347
skvladdc1c62c2016-03-16 19:07:43 -07001348 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1349 typename T::Content content;
1350 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1351 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001352 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001353 }
1354
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001355 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001356 webrtc::RtpParameters parameters;
1357 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001358 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001359 parameters.encodings.push_back(encoding);
1360 return parameters;
1361 }
1362
1363 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001364 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001365 EXPECT_EQ(1UL, parameters.encodings.size());
1366 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1367 }
1368
1369 void DefaultMaxBitrateIsUnlimited() {
1370 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001371 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1372 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001373 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001374 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001375 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001376 }
1377
Zhi Huange830e682018-03-30 10:48:35 -07001378 // Test that when a channel gets new RtpTransport with a call to
1379 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1380 // with the options on the new one.
1381
Steve Anton8a63f782017-10-23 13:08:53 -07001382 // For example, audio and video may use separate socket options, but initially
1383 // be unbundled, then later become bundled. When this happens, their preferred
1384 // socket options should be merged to the underlying transport they share.
1385 void SocketOptionsMergedOnSetTransport() {
1386 constexpr int kSndBufSize = 4000;
1387 constexpr int kRcvBufSize = 8000;
1388
Zhi Huange830e682018-03-30 10:48:35 -07001389 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001390
1391 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1392 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1393 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1394 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1395
Zhi Huange830e682018-03-30 10:48:35 -07001396 new_rtp_transport_ = CreateDtlsSrtpTransport(
1397 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1398 static_cast<DtlsTransportInternal*>(
1399 channel2_->rtcp_packet_transport()));
1400 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001401
1402 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001403 ASSERT_TRUE(
1404 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1405 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001406 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001407 ASSERT_TRUE(
1408 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1409 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001410 EXPECT_EQ(kRcvBufSize, option_val);
1411 }
1412
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001414 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1415 static void ProcessThreadQueue(rtc::Thread* thread) {
1416 RTC_DCHECK(thread->IsCurrent());
1417 while (!thread->empty()) {
1418 thread->ProcessMessages(0);
1419 }
1420 }
1421 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1422 // |threads| and current thread post packets to network thread.
1423 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001424 thread->Invoke<void>(RTC_FROM_HERE,
1425 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001426 }
1427 ProcessThreadQueue(rtc::Thread::Current());
1428 // Network thread move them around and post back to worker = current thread.
1429 if (!network_thread_->IsCurrent()) {
1430 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001431 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001432 }
1433 // Worker thread = current Thread process received messages.
1434 ProcessThreadQueue(rtc::Thread::Current());
1435 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001436 // TODO(pbos): Remove playout from all media channels and let renderers mute
1437 // themselves.
1438 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001439 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1440 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001441 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1442 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1443 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1444 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1445 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1446 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1447 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1448 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001449 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1450 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1451 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 cricket::FakeMediaEngine media_engine_;
1453 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001454 typename T::MediaChannel* media_channel1_ = nullptr;
1455 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001456 std::unique_ptr<typename T::Channel> channel1_;
1457 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 typename T::Content local_media_content1_;
1459 typename T::Content local_media_content2_;
1460 typename T::Content remote_media_content1_;
1461 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001463 rtc::Buffer rtp_packet_;
1464 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001465 int rtcp_mux_activated_callbacks1_ = 0;
1466 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001467 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468};
1469
Yves Gerey665174f2018-06-19 15:03:05 +02001470template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471void ChannelTest<VoiceTraits>::CreateContent(
1472 int flags,
1473 const cricket::AudioCodec& audio_codec,
1474 const cricket::VideoCodec& video_codec,
1475 cricket::AudioContentDescription* audio) {
1476 audio->AddCodec(audio_codec);
1477 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478}
1479
Yves Gerey665174f2018-06-19 15:03:05 +02001480template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001481void ChannelTest<VoiceTraits>::CopyContent(
1482 const cricket::AudioContentDescription& source,
1483 cricket::AudioContentDescription* audio) {
1484 *audio = source;
1485}
1486
Yves Gerey665174f2018-06-19 15:03:05 +02001487template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001488bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1489 const cricket::AudioCodec& c2) {
1490 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001491 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492}
1493
Peter Boström0c4e06b2015-10-07 12:23:21 +02001494template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001496 uint32_t ssrc,
1497 int flags,
1498 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 audio->AddLegacyStream(ssrc);
1500}
1501
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001502class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 public:
solenberg1dd98f32015-09-10 01:57:14 -07001504 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001505 VoiceChannelSingleThreadTest()
1506 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1507};
1508
1509class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1510 public:
1511 typedef ChannelTest<VoiceTraits> Base;
1512 VoiceChannelDoubleThreadTest()
1513 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514};
1515
jbauch5869f502017-06-29 12:31:36 -07001516class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001517 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001518 public:
1519 typedef ChannelTest<VoiceTraits> Base;
1520 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001521 : Base(true,
1522 kPcmuFrameWithExtensions,
1523 kRtcpReport,
1524 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001525};
1526
1527class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001528 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001529 public:
1530 typedef ChannelTest<VoiceTraits> Base;
1531 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001532 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1533 }
jbauch5869f502017-06-29 12:31:36 -07001534};
1535
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001537template <>
Steve Anton8699a322017-11-06 15:53:33 -08001538std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001539 rtc::Thread* worker_thread,
1540 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001541 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001542 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001543 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001544 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001545 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001546 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001547 worker_thread, network_thread, signaling_thread, std::move(ch),
Oleh Prypin8f4bc412018-10-11 21:10:39 +00001548 cricket::CN_VIDEO, (flags & DTLS) != 0, rtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07001549 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 return channel;
1551}
1552
1553// override to add 0 parameter
Yves Gerey665174f2018-06-19 15:03:05 +02001554template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555bool ChannelTest<VideoTraits>::AddStream1(int id) {
1556 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1557}
1558
Yves Gerey665174f2018-06-19 15:03:05 +02001559template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560void ChannelTest<VideoTraits>::CreateContent(
1561 int flags,
1562 const cricket::AudioCodec& audio_codec,
1563 const cricket::VideoCodec& video_codec,
1564 cricket::VideoContentDescription* video) {
1565 video->AddCodec(video_codec);
1566 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567}
1568
Yves Gerey665174f2018-06-19 15:03:05 +02001569template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570void ChannelTest<VideoTraits>::CopyContent(
1571 const cricket::VideoContentDescription& source,
1572 cricket::VideoContentDescription* video) {
1573 *video = source;
1574}
1575
Yves Gerey665174f2018-06-19 15:03:05 +02001576template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1578 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001579 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580}
1581
Peter Boström0c4e06b2015-10-07 12:23:21 +02001582template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001584 uint32_t ssrc,
1585 int flags,
1586 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587 video->AddLegacyStream(ssrc);
1588}
1589
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001590class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 public:
solenberg1dd98f32015-09-10 01:57:14 -07001592 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001593 VideoChannelSingleThreadTest()
1594 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595};
1596
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001597class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1598 public:
1599 typedef ChannelTest<VideoTraits> Base;
1600 VideoChannelDoubleThreadTest()
1601 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1602};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001604TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 Base::TestInit();
1606 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1607 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1608}
1609
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001610TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1611 Base::TestDeinit();
1612}
1613
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 Base::TestSetContents();
1616}
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 Base::TestSetContentsNullOffer();
1620}
1621
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 Base::TestSetContentsRtcpMux();
1624}
1625
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 Base::TestSetContentsRtcpMux();
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 Base::TestStreams();
1632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::TestChangeStreamParamsInContent();
1636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 Base::TestPlayoutAndSendingStates();
1640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 Base::TestMediaContentDirection();
1644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001647 Base::TestNetworkRouteChanges();
1648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 Base::TestCallSetup();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::TestCallTeardownRtcpMux();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::SendRtpToRtp();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::SendRtcpToRtcp();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001667 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001671 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::SendRtpToRtpOnThread();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::SendWithWritabilityLoss();
1684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 Base::TestSetContentFailure();
1688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::TestSendTwoOffers();
1692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 Base::TestReceiveTwoOffers();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 Base::TestSendPrAnswer();
1700}
1701
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 Base::TestReceivePrAnswer();
1704}
1705
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001706TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 Base::TestFlushRtcp();
1708}
1709
zstein56162b92017-04-24 16:54:35 -07001710TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1711 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712}
1713
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001715 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001719 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001723 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001727 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001731 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001732}
1733
Steve Anton8a63f782017-10-23 13:08:53 -07001734TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1735 Base::SocketOptionsMergedOnSetTransport();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738// VoiceChannelDoubleThreadTest
1739TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1742 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743}
1744
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001745TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1746 Base::TestDeinit();
1747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 Base::TestSetContents();
1751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 Base::TestSetContentsNullOffer();
1755}
1756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001757TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 Base::TestSetContentsRtcpMux();
1759}
1760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001761TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 Base::TestSetContentsRtcpMux();
1763}
1764
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001765TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 Base::TestStreams();
1767}
1768
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001769TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 Base::TestChangeStreamParamsInContent();
1771}
1772
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 Base::TestPlayoutAndSendingStates();
1775}
1776
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001777TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1778 Base::TestMediaContentDirection();
1779}
1780
1781TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1782 Base::TestNetworkRouteChanges();
1783}
1784
1785TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1786 Base::TestCallSetup();
1787}
1788
1789TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1790 Base::TestCallTeardownRtcpMux();
1791}
1792
1793TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1794 Base::SendRtpToRtp();
1795}
1796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1798 Base::SendRtcpToRtcp();
1799}
1800
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001801TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001802 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001803}
1804
1805TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001806 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001807}
1808
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001809TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1810 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1811}
1812
1813TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1814 Base::SendRtpToRtpOnThread();
1815}
1816
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001817TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1818 Base::SendWithWritabilityLoss();
1819}
1820
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1822 Base::TestSetContentFailure();
1823}
1824
1825TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1826 Base::TestSendTwoOffers();
1827}
1828
1829TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1830 Base::TestReceiveTwoOffers();
1831}
1832
1833TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1834 Base::TestSendPrAnswer();
1835}
1836
1837TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1838 Base::TestReceivePrAnswer();
1839}
1840
1841TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1842 Base::TestFlushRtcp();
1843}
1844
zstein56162b92017-04-24 16:54:35 -07001845TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1846 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847}
1848
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1850 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1851}
1852
1853TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1854 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1855}
1856
1857TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1858 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1859}
1860
1861TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1862 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1863}
1864
1865TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1866 Base::DefaultMaxBitrateIsUnlimited();
1867}
1868
Steve Anton8a63f782017-10-23 13:08:53 -07001869TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1870 Base::SocketOptionsMergedOnSetTransport();
1871}
1872
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001873// VideoChannelSingleThreadTest
1874TEST_F(VideoChannelSingleThreadTest, TestInit) {
1875 Base::TestInit();
1876}
1877
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001878TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1879 Base::TestDeinit();
1880}
1881
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001882TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1883 Base::TestSetContents();
1884}
1885
1886TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1887 Base::TestSetContentsNullOffer();
1888}
1889
1890TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1891 Base::TestSetContentsRtcpMux();
1892}
1893
1894TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1895 Base::TestSetContentsRtcpMux();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1899 Base::TestStreams();
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1903 Base::TestChangeStreamParamsInContent();
1904}
1905
1906TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1907 Base::TestPlayoutAndSendingStates();
1908}
1909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001910TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 Base::TestMediaContentDirection();
1912}
1913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001914TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001915 Base::TestNetworkRouteChanges();
1916}
1917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 Base::TestCallSetup();
1920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 Base::TestCallTeardownRtcpMux();
1924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 Base::SendRtpToRtp();
1928}
1929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 Base::SendRtcpToRtcp();
1932}
1933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001935 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936}
1937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001938TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001939 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940}
1941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1944}
1945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 Base::SendRtpToRtpOnThread();
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 Base::SendWithWritabilityLoss();
1952}
1953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 Base::TestSetContentFailure();
1956}
1957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 Base::TestSendTwoOffers();
1960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 Base::TestReceiveTwoOffers();
1964}
1965
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001966TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 Base::TestSendPrAnswer();
1968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 Base::TestReceivePrAnswer();
1972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 Base::TestFlushRtcp();
1976}
1977
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001978TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001979 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001983 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001984}
1985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001986TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001987 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001988}
1989
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001990TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001991 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
zstein56162b92017-04-24 16:54:35 -07001994TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1995 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996}
1997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001999 Base::DefaultMaxBitrateIsUnlimited();
2000}
2001
Steve Anton8a63f782017-10-23 13:08:53 -07002002TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2003 Base::SocketOptionsMergedOnSetTransport();
2004}
2005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002006// VideoChannelDoubleThreadTest
2007TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2008 Base::TestInit();
2009}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002010
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002011TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2012 Base::TestDeinit();
2013}
2014
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002015TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2016 Base::TestSetContents();
2017}
2018
2019TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2020 Base::TestSetContentsNullOffer();
2021}
2022
2023TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2024 Base::TestSetContentsRtcpMux();
2025}
2026
2027TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2028 Base::TestSetContentsRtcpMux();
2029}
2030
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002031TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2032 Base::TestStreams();
2033}
2034
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002035TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2036 Base::TestChangeStreamParamsInContent();
2037}
2038
2039TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2040 Base::TestPlayoutAndSendingStates();
2041}
2042
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002043TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2044 Base::TestMediaContentDirection();
2045}
2046
2047TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2048 Base::TestNetworkRouteChanges();
2049}
2050
2051TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2052 Base::TestCallSetup();
2053}
2054
2055TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2056 Base::TestCallTeardownRtcpMux();
2057}
2058
2059TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2060 Base::SendRtpToRtp();
2061}
2062
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002063TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2064 Base::SendRtcpToRtcp();
2065}
2066
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002067TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002068 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002069}
2070
2071TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002072 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073}
2074
2075TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2076 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2077}
2078
2079TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2080 Base::SendRtpToRtpOnThread();
2081}
2082
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002083TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2084 Base::SendWithWritabilityLoss();
2085}
2086
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002087TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2088 Base::TestSetContentFailure();
2089}
2090
2091TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2092 Base::TestSendTwoOffers();
2093}
2094
2095TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2096 Base::TestReceiveTwoOffers();
2097}
2098
2099TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2100 Base::TestSendPrAnswer();
2101}
2102
2103TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2104 Base::TestReceivePrAnswer();
2105}
2106
2107TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2108 Base::TestFlushRtcp();
2109}
2110
2111TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2112 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2113}
2114
2115TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2116 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2117}
2118
2119TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2120 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2121}
2122
2123TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2124 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2125}
2126
zstein56162b92017-04-24 16:54:35 -07002127TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2128 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002129}
2130
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002131TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2132 Base::DefaultMaxBitrateIsUnlimited();
2133}
2134
Steve Anton8a63f782017-10-23 13:08:53 -07002135TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2136 Base::SocketOptionsMergedOnSetTransport();
2137}
2138
deadbeef953c2ce2017-01-09 14:53:41 -08002139// RtpDataChannelSingleThreadTest
2140class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002142 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002143 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002144 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2145};
2146
deadbeef953c2ce2017-01-09 14:53:41 -08002147// RtpDataChannelDoubleThreadTest
2148class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149 public:
2150 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002151 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002152 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153};
2154
2155// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002156template <>
Steve Anton8699a322017-11-06 15:53:33 -08002157std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002158 rtc::Thread* worker_thread,
2159 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002160 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002161 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002162 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002163 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002164 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002165 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002166 worker_thread, network_thread, signaling_thread, std::move(ch),
Oleh Prypin8f4bc412018-10-11 21:10:39 +00002167 cricket::CN_DATA, (flags & DTLS) != 0, rtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002168 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002169 return channel;
2170}
2171
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002172template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173void ChannelTest<DataTraits>::CreateContent(
2174 int flags,
2175 const cricket::AudioCodec& audio_codec,
2176 const cricket::VideoCodec& video_codec,
2177 cricket::DataContentDescription* data) {
2178 data->AddCodec(kGoogleDataCodec);
2179 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180}
2181
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183void ChannelTest<DataTraits>::CopyContent(
2184 const cricket::DataContentDescription& source,
2185 cricket::DataContentDescription* data) {
2186 *data = source;
2187}
2188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002189template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2191 const cricket::DataCodec& c2) {
2192 return c1.name == c2.name;
2193}
2194
Peter Boström0c4e06b2015-10-07 12:23:21 +02002195template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002196void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002197 uint32_t ssrc,
2198 int flags,
2199 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 data->AddLegacyStream(ssrc);
2201}
2202
deadbeef953c2ce2017-01-09 14:53:41 -08002203TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204 Base::TestInit();
2205 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2206}
2207
deadbeef953c2ce2017-01-09 14:53:41 -08002208TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002209 Base::TestDeinit();
2210}
2211
deadbeef953c2ce2017-01-09 14:53:41 -08002212TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 Base::TestSetContents();
2214}
2215
deadbeef953c2ce2017-01-09 14:53:41 -08002216TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002217 Base::TestSetContentsNullOffer();
2218}
2219
deadbeef953c2ce2017-01-09 14:53:41 -08002220TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221 Base::TestSetContentsRtcpMux();
2222}
2223
deadbeef953c2ce2017-01-09 14:53:41 -08002224TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225 Base::TestStreams();
2226}
2227
deadbeef953c2ce2017-01-09 14:53:41 -08002228TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229 Base::TestChangeStreamParamsInContent();
2230}
2231
deadbeef953c2ce2017-01-09 14:53:41 -08002232TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002233 Base::TestPlayoutAndSendingStates();
2234}
2235
deadbeef953c2ce2017-01-09 14:53:41 -08002236TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237 Base::TestMediaContentDirection();
2238}
2239
deadbeef953c2ce2017-01-09 14:53:41 -08002240TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241 Base::TestCallSetup();
2242}
2243
deadbeef953c2ce2017-01-09 14:53:41 -08002244TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 Base::TestCallTeardownRtcpMux();
2246}
2247
zstein56162b92017-04-24 16:54:35 -07002248TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2249 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250}
2251
deadbeef953c2ce2017-01-09 14:53:41 -08002252TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 Base::SendRtpToRtp();
2254}
2255
deadbeef953c2ce2017-01-09 14:53:41 -08002256TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 Base::SendRtcpToRtcp();
2258}
2259
deadbeef953c2ce2017-01-09 14:53:41 -08002260TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 Base::SendRtpToRtpOnThread();
2262}
2263
deadbeef953c2ce2017-01-09 14:53:41 -08002264TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002265 Base::SendWithWritabilityLoss();
2266}
2267
Steve Anton8a63f782017-10-23 13:08:53 -07002268TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2269 Base::SocketOptionsMergedOnSetTransport();
2270}
2271
deadbeef953c2ce2017-01-09 14:53:41 -08002272TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273 CreateChannels(0, 0);
2274 EXPECT_TRUE(SendInitiate());
2275 EXPECT_TRUE(SendAccept());
2276
2277 cricket::SendDataParams params;
2278 params.ssrc = 42;
2279 unsigned char data[] = {'f', 'o', 'o'};
2280 rtc::CopyOnWriteBuffer payload(data, 3);
2281 cricket::SendDataResult result;
2282 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2283 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2284 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2285}
2286
deadbeef953c2ce2017-01-09 14:53:41 -08002287TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002288 Base::TestInit();
2289 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2290}
2291
deadbeef953c2ce2017-01-09 14:53:41 -08002292TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002293 Base::TestDeinit();
2294}
2295
deadbeef953c2ce2017-01-09 14:53:41 -08002296TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002297 Base::TestSetContents();
2298}
2299
deadbeef953c2ce2017-01-09 14:53:41 -08002300TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301 Base::TestSetContentsNullOffer();
2302}
2303
deadbeef953c2ce2017-01-09 14:53:41 -08002304TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002305 Base::TestSetContentsRtcpMux();
2306}
2307
deadbeef953c2ce2017-01-09 14:53:41 -08002308TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309 Base::TestStreams();
2310}
2311
deadbeef953c2ce2017-01-09 14:53:41 -08002312TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002313 Base::TestChangeStreamParamsInContent();
2314}
2315
deadbeef953c2ce2017-01-09 14:53:41 -08002316TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002317 Base::TestPlayoutAndSendingStates();
2318}
2319
deadbeef953c2ce2017-01-09 14:53:41 -08002320TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002321 Base::TestMediaContentDirection();
2322}
2323
deadbeef953c2ce2017-01-09 14:53:41 -08002324TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325 Base::TestCallSetup();
2326}
2327
deadbeef953c2ce2017-01-09 14:53:41 -08002328TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329 Base::TestCallTeardownRtcpMux();
2330}
2331
zstein56162b92017-04-24 16:54:35 -07002332TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2333 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002334}
2335
deadbeef953c2ce2017-01-09 14:53:41 -08002336TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002337 Base::SendRtpToRtp();
2338}
2339
deadbeef953c2ce2017-01-09 14:53:41 -08002340TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002341 Base::SendRtcpToRtcp();
2342}
2343
deadbeef953c2ce2017-01-09 14:53:41 -08002344TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002345 Base::SendRtpToRtpOnThread();
2346}
2347
deadbeef953c2ce2017-01-09 14:53:41 -08002348TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002349 Base::SendWithWritabilityLoss();
2350}
2351
Steve Anton8a63f782017-10-23 13:08:53 -07002352TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2353 Base::SocketOptionsMergedOnSetTransport();
2354}
2355
deadbeef953c2ce2017-01-09 14:53:41 -08002356TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 CreateChannels(0, 0);
2358 EXPECT_TRUE(SendInitiate());
2359 EXPECT_TRUE(SendAccept());
2360
2361 cricket::SendDataParams params;
2362 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002363 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002364 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 cricket::SendDataResult result;
2366 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002367 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2369}
2370
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371// TODO(pthatcher): TestSetReceiver?