blob: 40ccf8d90fed06939d03306fd58008d132f53480 [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
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080014#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010015#include <utility>
kwiberg31022942016-03-11 14:18:21 -080016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_parameters.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020020#include "api/transport/media/media_transport_config.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "media/base/fake_media_engine.h"
23#include "media/base/fake_rtp.h"
24#include "media/base/media_channel.h"
25#include "p2p/base/candidate_pair_interface.h"
26#include "p2p/base/fake_dtls_transport.h"
27#include "p2p/base/fake_packet_transport.h"
28#include "p2p/base/ice_transport_internal.h"
29#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "pc/dtls_srtp_transport.h"
31#include "pc/jsep_transport.h"
32#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020036#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "rtc_base/rtc_certificate.h"
38#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020039#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041
zhihuangb2cdd932017-01-19 16:54:25 -080042using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080044using cricket::RidDescription;
45using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080047using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080048using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050namespace {
51const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
52const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
53const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070054const cricket::VideoCodec kH264Codec(97, "H264");
55const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020056const cricket::DataCodec kGoogleDataCodec(101, "google-data");
57const uint32_t kSsrc1 = 0x1111;
58const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070059const uint32_t kSsrc3 = 0x3333;
60const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020061const int kAudioPts[] = {0, 8};
62const int kVideoPts[] = {97, 99};
63enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010064
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
deadbeefcbecd352015-09-23 11:50:27 -070067template <class ChannelT,
68 class MediaChannelT,
69 class ContentT,
70 class CodecT,
71 class MediaInfoT,
72 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073class Traits {
74 public:
75 typedef ChannelT Channel;
76 typedef MediaChannelT MediaChannel;
77 typedef ContentT Content;
78 typedef CodecT Codec;
79 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081};
82
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083class VoiceTraits : public Traits<cricket::VoiceChannel,
84 cricket::FakeVoiceMediaChannel,
85 cricket::AudioContentDescription,
86 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
90class VideoTraits : public Traits<cricket::VideoChannel,
91 cricket::FakeVideoMediaChannel,
92 cricket::VideoContentDescription,
93 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020094 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070095 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096
deadbeef953c2ce2017-01-09 14:53:41 -080097class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020099 cricket::RtpDataContentDescription,
100 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200101 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700102 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
deadbeef953c2ce2017-01-09 14:53:41 -0800104// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200105template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200106class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107 public:
deadbeefac22f702017-01-12 21:59:29 -0800108 enum Flags {
109 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800110 SSRC_MUX = 0x8,
111 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800112 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800113 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700114 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800115 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116
Peter Boström34fbfff2015-09-24 19:20:30 +0200117 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200118 rtc::ArrayView<const uint8_t> rtp_data,
119 rtc::ArrayView<const uint8_t> rtcp_data,
120 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200121 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800123 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 if (network_is_worker == NetworkIsWorker::Yes) {
125 network_thread_ = rtc::Thread::Current();
126 } else {
127 network_thread_keeper_ = rtc::Thread::Create();
128 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200129 network_thread_ = network_thread_keeper_.get();
130 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200134 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800135 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200136 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800137 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Steve Anton8699a322017-11-06 15:53:33 -0800140 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
141 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200142 int flags1,
143 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800144 // Network thread is started in CreateChannels, to allow the test to
145 // configure a fake clock before any threads are spawned and attempt to
146 // access the time.
147 if (network_thread_keeper_) {
148 network_thread_keeper_->Start();
149 }
Zhi Huange830e682018-03-30 10:48:35 -0700150
deadbeeff5346592017-01-24 21:51:21 -0800151 // Make sure if using raw packet transports, they're used for both
152 // channels.
153 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200154 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800155 media_channel1_ = ch1.get();
156 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800157 rtc::PacketTransportInternal* rtp1 = nullptr;
158 rtc::PacketTransportInternal* rtcp1 = nullptr;
159 rtc::PacketTransportInternal* rtp2 = nullptr;
160 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800161 // Based on flags, create fake DTLS or raw packet transports.
162 if (flags1 & RAW_PACKET_TRANSPORT) {
163 fake_rtp_packet_transport1_.reset(
164 new rtc::FakePacketTransport("channel1_rtp"));
165 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700166 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800167 fake_rtcp_packet_transport1_.reset(
168 new rtc::FakePacketTransport("channel1_rtcp"));
169 rtcp1 = fake_rtcp_packet_transport1_.get();
170 }
171 } else {
172 // Confirmed to work with KT_RSA and KT_ECDSA.
173 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
174 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
175 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700176 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800177 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
178 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
179 rtcp1 = fake_rtcp_dtls_transport1_.get();
180 }
181 if (flags1 & DTLS) {
182 auto cert1 =
183 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
184 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
185 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
188 }
189 }
190 }
191 // Based on flags, create fake DTLS or raw packet transports.
192 if (flags2 & RAW_PACKET_TRANSPORT) {
193 fake_rtp_packet_transport2_.reset(
194 new rtc::FakePacketTransport("channel2_rtp"));
195 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700196 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800197 fake_rtcp_packet_transport2_.reset(
198 new rtc::FakePacketTransport("channel2_rtcp"));
199 rtcp2 = fake_rtcp_packet_transport2_.get();
200 }
201 } else {
202 // Confirmed to work with KT_RSA and KT_ECDSA.
203 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
204 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
205 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700206 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800207 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
208 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
209 rtcp2 = fake_rtcp_dtls_transport2_.get();
210 }
211 if (flags2 & DTLS) {
212 auto cert2 =
213 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
214 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
215 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
216 if (fake_rtcp_dtls_transport2_) {
217 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
218 }
219 }
220 }
Zhi Huange830e682018-03-30 10:48:35 -0700221 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
222 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
223 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
224 flags1);
225 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
226 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
227 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
228 flags2);
229
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800230 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
231 rtp_transport1_.get(), flags1);
232 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
233 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800234 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800235 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800236 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800237 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200238 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
239 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240 CopyContent(local_media_content1_, &remote_media_content1_);
241 CopyContent(local_media_content2_, &remote_media_content2_);
242
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 // Add stream information (SSRC) to the local content but not to the remote
244 // content. This means that we per default know the SSRC of what we send but
245 // not what we receive.
246 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
247 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
248
249 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
250 if (flags1 & SSRC_MUX) {
251 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
252 }
253 if (flags2 & SSRC_MUX) {
254 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
255 }
256 }
Steve Anton8699a322017-11-06 15:53:33 -0800257 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200258 rtc::Thread* worker_thread,
259 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800260 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700261 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200262 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263
Zhi Huange830e682018-03-30 10:48:35 -0700264 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
265 rtc::PacketTransportInternal* rtp_packet_transport,
266 rtc::PacketTransportInternal* rtcp_packet_transport,
267 DtlsTransportInternal* rtp_dtls_transport,
268 DtlsTransportInternal* rtcp_dtls_transport,
269 int flags) {
270 if (flags & RTCP_MUX) {
271 rtcp_packet_transport = nullptr;
272 rtcp_dtls_transport = nullptr;
273 }
274
275 if (flags & DTLS) {
276 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
277 } else {
278 if (flags & RAW_PACKET_TRANSPORT) {
279 return CreateUnencryptedTransport(rtp_packet_transport,
280 rtcp_packet_transport);
281 } else {
282 return CreateUnencryptedTransport(rtp_dtls_transport,
283 rtcp_dtls_transport);
284 }
285 }
286 }
287
288 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
289 rtc::PacketTransportInternal* rtp_packet_transport,
290 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200291 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200292 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700293
294 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
295 if (rtcp_packet_transport) {
296 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
297 }
298 return rtp_transport;
299 }
300
301 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
302 cricket::DtlsTransportInternal* rtp_dtls_transport,
303 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200304 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700305 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700306
307 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
308 rtcp_dtls_transport);
309 return dtls_srtp_transport;
310 }
311
deadbeeff5346592017-01-24 21:51:21 -0800312 void ConnectFakeTransports() {
313 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
314 bool asymmetric = false;
315 // Depending on test flags, could be using DTLS or raw packet transport.
316 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
317 fake_rtp_dtls_transport1_->SetDestination(
318 fake_rtp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
321 fake_rtcp_dtls_transport1_->SetDestination(
322 fake_rtcp_dtls_transport2_.get(), asymmetric);
323 }
324 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
325 fake_rtp_packet_transport1_->SetDestination(
326 fake_rtp_packet_transport2_.get(), asymmetric);
327 }
328 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
329 fake_rtcp_packet_transport1_->SetDestination(
330 fake_rtcp_packet_transport2_.get(), asymmetric);
331 }
332 });
333 }
334
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800337 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
339 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800341 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800343 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347 }
348 return result;
349 }
350
351 bool SendAccept() {
352 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356
357 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
361 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 return result;
366 }
367
368 bool SendProvisionalAnswer() {
369 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800370 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel2_->Enable(true);
373 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800374 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000384 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800385 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 return result;
387 }
388
deadbeeff5346592017-01-24 21:51:21 -0800389 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 channel1_.reset();
391 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800392 fake_rtp_dtls_transport1_.reset();
393 fake_rtcp_dtls_transport1_.reset();
394 fake_rtp_dtls_transport2_.reset();
395 fake_rtcp_dtls_transport2_.reset();
396 fake_rtp_packet_transport1_.reset();
397 fake_rtcp_packet_transport1_.reset();
398 fake_rtp_packet_transport2_.reset();
399 fake_rtcp_packet_transport2_.reset();
400 if (network_thread_keeper_) {
401 network_thread_keeper_.reset();
402 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 return true;
404 }
405
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200406 void SendRtp1() {
407 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
408 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp2() {
411 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtcp1() {
415 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendRtcp2() {
418 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
420 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
422 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
423 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
426 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
427 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtcp1(uint32_t ssrc) {
430 rtc::Buffer data = CreateRtcpData(ssrc);
431 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtcp2(uint32_t ssrc) {
434 rtc::Buffer data = CreateRtcpData(ssrc);
435 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
441 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 }
444 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
447 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200451 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
453 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200455 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
457 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtcpData(ssrc);
461 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtcpData(ssrc);
465 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200467 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
468 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::SetBE32(data.data() + 8, ssrc);
471 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000472 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000474 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 return data;
476 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
478 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200480 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 return data;
482 }
483
Yves Gerey665174f2018-06-19 15:03:05 +0200484 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
485 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
486 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
487 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488
489 void CreateContent(int flags,
490 const cricket::AudioCodec& audio_codec,
491 const cricket::VideoCodec& video_codec,
492 typename T::Content* content) {
493 // overridden in specialized classes
494 }
495 void CopyContent(const typename T::Content& source,
496 typename T::Content* content) {
497 // overridden in specialized classes
498 }
499
Steve Anton18ee1d52017-09-11 11:32:35 -0700500 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700502 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
503 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700504 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700505 AddLegacyStreamInContent(ssrc, 0, content);
506 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 }
508
ossu292d6582016-03-17 02:31:13 -0700509 // Will manage the lifetime of a CallThread, making sure it's
510 // destroyed before this object goes out of scope.
511 class ScopedCallThread {
512 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200513 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100514 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200515 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100516 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
517 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700518 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700519 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700520 }
521
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200522 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700523
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700525
526 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200527 std::unique_ptr<rtc::Thread> thread_;
528 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700529 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
532 return false; // overridden in specialized classes
533 }
534
deadbeeff5346592017-01-24 21:51:21 -0800535 void OnRtcpMuxFullyActive1(const std::string&) {
536 rtcp_mux_activated_callbacks1_++;
537 }
538 void OnRtcpMuxFullyActive2(const std::string&) {
539 rtcp_mux_activated_callbacks2_++;
540 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541
Honghai Zhangcc411c02016-03-29 17:27:21 -0700542 cricket::CandidatePairInterface* last_selected_candidate_pair() {
543 return last_selected_candidate_pair_;
544 }
545
Peter Boström0c4e06b2015-10-07 12:23:21 +0200546 void AddLegacyStreamInContent(uint32_t ssrc,
547 int flags,
548 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 // Base implementation.
550 }
551
552 // Tests that can be used by derived classes.
553
554 // Basic sanity check.
555 void TestInit() {
556 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700557 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200559 if (verify_playout_) {
560 EXPECT_FALSE(media_channel1_->playout());
561 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 EXPECT_TRUE(media_channel1_->codecs().empty());
563 EXPECT_TRUE(media_channel1_->recv_streams().empty());
564 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
565 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
566 }
567
568 // Test that SetLocalContent and SetRemoteContent properly configure
569 // the codecs.
570 void TestSetContents() {
571 CreateChannels(0, 0);
572 typename T::Content content;
573 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800574 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800576 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200578 EXPECT_TRUE(
579 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 }
581
Johannes Kron9190b822018-10-29 11:22:05 +0100582 // Test that SetLocalContent and SetRemoteContent properly configure
583 // extmap-allow-mixed.
584 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
585 // For a caller, SetLocalContent() is called first with an offer and next
586 // SetRemoteContent() is called with the answer.
587 CreateChannels(0, 0);
588 typename T::Content content;
589 CreateContent(0, kPcmuCodec, kH264Codec, &content);
590 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
591 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
592 content.set_extmap_allow_mixed_enum(offer_enum);
593 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
594 content.set_extmap_allow_mixed_enum(answer_enum);
595 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
596 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
597 }
598 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
599 // For a callee, SetRemoteContent() is called first with an offer and next
600 // SetLocalContent() is called with the answer.
601 CreateChannels(0, 0);
602 typename T::Content content;
603 CreateContent(0, kPcmuCodec, kH264Codec, &content);
604 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
605 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
606 content.set_extmap_allow_mixed_enum(offer_enum);
607 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
608 content.set_extmap_allow_mixed_enum(answer_enum);
609 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
610 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
611 }
612
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 // Test that SetLocalContent and SetRemoteContent properly deals
614 // with an empty offer.
615 void TestSetContentsNullOffer() {
616 CreateChannels(0, 0);
617 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 CreateContent(0, kPcmuCodec, kH264Codec, &content);
620 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800621 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200623 EXPECT_TRUE(
624 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 }
626
627 // Test that SetLocalContent and SetRemoteContent properly set RTCP
628 // mux.
629 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800630 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 typename T::Content content;
632 CreateContent(0, kPcmuCodec, kH264Codec, &content);
633 // Both sides agree on mux. Should no longer be a separate RTCP channel.
634 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800635 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
636 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800638 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800640 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 }
642
643 // Test that SetLocalContent and SetRemoteContent properly set RTCP
644 // mux when a provisional answer is received.
645 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800646 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 typename T::Content content;
648 CreateContent(0, kPcmuCodec, kH264Codec, &content);
649 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800650 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
651 EXPECT_TRUE(
652 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800653 // Both sides agree on mux. Should signal RTCP mux as fully activated.
654 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800655 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800656 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800658 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800660 EXPECT_TRUE(
661 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
662 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800663 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 }
665
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Test that SetLocalContent and SetRemoteContent properly
667 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800668 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 void TestChangeStreamParamsInContent() {
670 cricket::StreamParams stream1;
671 stream1.groupid = "group1";
672 stream1.id = "stream1";
673 stream1.ssrcs.push_back(kSsrc1);
674 stream1.cname = "stream1_cname";
675
676 cricket::StreamParams stream2;
677 stream2.groupid = "group1";
678 stream2.id = "stream2";
679 stream2.ssrcs.push_back(kSsrc2);
680 stream2.cname = "stream2_cname";
681
682 // Setup a call where channel 1 send |stream1| to channel 2.
683 CreateChannels(0, 0);
684 typename T::Content content1;
685 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
686 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800687 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(channel1_->Enable(true));
689 EXPECT_EQ(1u, media_channel1_->send_streams().size());
690
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800693 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // Channel 2 do not send anything.
696 typename T::Content content2;
697 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800698 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_TRUE(channel2_->Enable(true));
702 EXPECT_EQ(0u, media_channel2_->send_streams().size());
703
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200704 SendCustomRtp1(kSsrc1, 0);
705 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
707
708 // Let channel 2 update the content by sending |stream2| and enable SRTP.
709 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700710 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 ASSERT_EQ(1u, media_channel2_->send_streams().size());
714 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
715
Steve Anton3828c062017-12-06 10:34:51 -0800716 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
718 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
719
720 // Channel 1 replies but stop sending stream1.
721 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700722 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800723 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
725
Steve Anton3828c062017-12-06 10:34:51 -0800726 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
728
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200729 SendCustomRtp2(kSsrc2, 0);
730 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
732 }
733
734 // Test that we only start playout and sending at the right times.
735 void TestPlayoutAndSendingStates() {
736 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
738 EXPECT_FALSE(media_channel1_->playout());
739 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200741 if (verify_playout_) {
742 EXPECT_FALSE(media_channel2_->playout());
743 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_FALSE(media_channel2_->sending());
745 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200746 if (verify_playout_) {
747 EXPECT_FALSE(media_channel1_->playout());
748 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000750 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800751 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 if (verify_playout_) {
753 EXPECT_TRUE(media_channel1_->playout());
754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000756 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800757 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200758 if (verify_playout_) {
759 EXPECT_FALSE(media_channel2_->playout());
760 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800763 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200764 if (verify_playout_) {
765 EXPECT_FALSE(media_channel2_->playout());
766 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800768 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 if (verify_playout_) {
770 EXPECT_TRUE(media_channel1_->playout());
771 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_FALSE(media_channel2_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_FALSE(media_channel2_->sending());
777 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_TRUE(media_channel2_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800783 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_TRUE(media_channel1_->playout());
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_TRUE(media_channel1_->sending());
788 }
789
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 // Test that changing the MediaContentDirection in the local and remote
791 // session description start playout and sending at the right time.
792 void TestMediaContentDirection() {
793 CreateChannels(0, 0);
794 typename T::Content content1;
795 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
796 typename T::Content content2;
797 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
798 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800799 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 EXPECT_TRUE(channel1_->Enable(true));
802 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 if (verify_playout_) {
804 EXPECT_FALSE(media_channel1_->playout());
805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200807 if (verify_playout_) {
808 EXPECT_FALSE(media_channel2_->playout());
809 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 EXPECT_FALSE(media_channel2_->sending());
811
Steve Anton3828c062017-12-06 10:34:51 -0800812 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
813 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
814 EXPECT_TRUE(
815 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
816 EXPECT_TRUE(
817 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800818 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819
Peter Boström34fbfff2015-09-24 19:20:30 +0200820 if (verify_playout_) {
821 EXPECT_TRUE(media_channel1_->playout());
822 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200824 if (verify_playout_) {
825 EXPECT_FALSE(media_channel2_->playout()); // local InActive
826 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 EXPECT_FALSE(media_channel2_->sending()); // local InActive
828
829 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800830 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800831 EXPECT_TRUE(
832 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
833 EXPECT_TRUE(
834 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 if (verify_playout_) {
837 EXPECT_TRUE(media_channel1_->playout());
838 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
841 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
842 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
844
845 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800846 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800847 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
848 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849
Peter Boström34fbfff2015-09-24 19:20:30 +0200850 if (verify_playout_) {
851 EXPECT_TRUE(media_channel1_->playout());
852 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200854 if (verify_playout_) {
855 EXPECT_TRUE(media_channel2_->playout());
856 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_TRUE(media_channel2_->sending());
858 }
859
Honghai Zhangcc411c02016-03-29 17:27:21 -0700860 // Tests that when the transport channel signals a candidate pair change
861 // event, the media channel will receive a call on the network route change.
862 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700863 static constexpr uint16_t kLocalNetId = 1;
864 static constexpr uint16_t kRemoteNetId = 2;
865 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800866 // Ipv4(20) + UDP(8).
867 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800868 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200869
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800870 CreateChannels(DTLS, DTLS);
871 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700872
Honghai Zhangcc411c02016-03-29 17:27:21 -0700873 typename T::MediaChannel* media_channel1 =
874 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200875 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700876
Zhi Huang942bc2e2017-11-13 13:26:07 -0800877 // Need to wait for the threads before calling
878 // |set_num_network_route_changes| because the network route would be set
879 // when creating the channel.
880 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200881 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800882 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800883 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800885 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
886
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200887 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200888 });
889 WaitForThreads();
890 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700891 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700893
eladalon05b07bb2017-08-24 07:40:16 -0700894 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800895 rtc::NetworkRoute network_route;
896 network_route.connected = true;
897 network_route.local_network_id = kLocalNetId;
898 network_route.remote_network_id = kRemoteNetId;
899 network_route.last_sent_packet_id = kLastPacketId;
900 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800902 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
903
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200904 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200905 });
906 WaitForThreads();
907 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100908 EXPECT_TRUE(media_channel1->last_network_route().connected);
909 EXPECT_EQ(kLocalNetId,
910 media_channel1->last_network_route().local_network_id);
911 EXPECT_EQ(kRemoteNetId,
912 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200913 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700914 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800915 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800916 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700917 }
918
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 // Test setting up a call.
920 void TestCallSetup() {
921 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700922 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200924 if (verify_playout_) {
925 EXPECT_TRUE(media_channel1_->playout());
926 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 EXPECT_FALSE(media_channel1_->sending());
928 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700929 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 EXPECT_TRUE(media_channel1_->sending());
931 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200932 if (verify_playout_) {
933 EXPECT_TRUE(media_channel2_->playout());
934 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935 EXPECT_TRUE(media_channel2_->sending());
936 EXPECT_EQ(1U, media_channel2_->codecs().size());
937 }
938
939 // Test that we don't crash if packets are sent during call teardown
940 // when RTCP mux is enabled. This is a regression test against a specific
941 // race condition that would only occur when a RTCP packet was sent during
942 // teardown of a channel on which RTCP mux was enabled.
943 void TestCallTeardownRtcpMux() {
944 class LastWordMediaChannel : public T::MediaChannel {
945 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200946 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700948 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
949 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
951 }
952 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200953 CreateChannels(std::make_unique<LastWordMediaChannel>(),
954 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200955 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 EXPECT_TRUE(SendInitiate());
957 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800958 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 }
960
961 // Send voice RTP data to the other side and ensure it gets there.
962 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700963 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964 EXPECT_TRUE(SendInitiate());
965 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700966 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
967 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200968 SendRtp1();
969 SendRtp2();
970 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 EXPECT_TRUE(CheckRtp1());
972 EXPECT_TRUE(CheckRtp2());
973 EXPECT_TRUE(CheckNoRtp1());
974 EXPECT_TRUE(CheckNoRtp2());
975 }
976
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200977 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800978 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200979 EXPECT_TRUE(SendInitiate());
980 EXPECT_TRUE(SendAccept());
981 SendRtp1();
982 SendRtp2();
983 SendRtcp1();
984 SendRtcp2();
985 // Do not wait, destroy channels.
986 channel1_.reset(nullptr);
987 channel2_.reset(nullptr);
988 }
989
deadbeefac22f702017-01-12 21:59:29 -0800990 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800992 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000993 EXPECT_TRUE(SendInitiate());
994 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700995 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
996 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200997 SendRtcp1();
998 SendRtcp2();
999 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 EXPECT_TRUE(CheckRtcp1());
1001 EXPECT_TRUE(CheckRtcp2());
1002 EXPECT_TRUE(CheckNoRtcp1());
1003 EXPECT_TRUE(CheckNoRtcp2());
1004 }
1005
Zhi Huange830e682018-03-30 10:48:35 -07001006 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1007 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001008 EXPECT_FALSE(channel1_->srtp_active());
1009 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001011 WaitForThreads();
1012 EXPECT_TRUE(channel1_->writable());
1013 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001015 EXPECT_TRUE(channel1_->srtp_active());
1016 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001017 SendRtp1();
1018 SendRtp2();
1019 SendRtcp1();
1020 SendRtcp2();
1021 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(CheckRtp1());
1023 EXPECT_TRUE(CheckRtp2());
1024 EXPECT_TRUE(CheckNoRtp1());
1025 EXPECT_TRUE(CheckNoRtp2());
1026 EXPECT_TRUE(CheckRtcp1());
1027 EXPECT_TRUE(CheckRtcp2());
1028 EXPECT_TRUE(CheckNoRtcp1());
1029 EXPECT_TRUE(CheckNoRtcp2());
1030 }
1031
1032 // Test that we can send and receive early media when a provisional answer is
1033 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1034 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001035 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036
Yves Gerey665174f2018-06-19 15:03:05 +02001037 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1038 EXPECT_TRUE(SendOffer());
1039 EXPECT_TRUE(SendProvisionalAnswer());
1040 EXPECT_TRUE(channel1_->srtp_active());
1041 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001042 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1043 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +02001044 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1045 SendCustomRtcp1(kSsrc1);
1046 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1047 WaitForThreads();
1048 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1049 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050
Yves Gerey665174f2018-06-19 15:03:05 +02001051 // Send packets from callee and verify that it is received.
1052 SendCustomRtcp2(kSsrc2);
1053 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1054 WaitForThreads();
1055 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1056 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057
Yves Gerey665174f2018-06-19 15:03:05 +02001058 // Complete call setup and ensure everything is still OK.
1059 EXPECT_TRUE(SendFinalAnswer());
1060 EXPECT_TRUE(channel1_->srtp_active());
1061 EXPECT_TRUE(channel2_->srtp_active());
1062 SendCustomRtcp1(kSsrc1);
1063 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1064 SendCustomRtcp2(kSsrc2);
1065 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1066 WaitForThreads();
1067 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1068 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1069 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1070 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 }
1072
1073 // Test that we properly send RTP without SRTP from a thread.
1074 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001075 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 EXPECT_TRUE(SendInitiate());
1077 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1079 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1080 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1081 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1082 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1083 send_rtcp1.thread(),
1084 send_rtcp2.thread()};
1085 WaitForThreads(involved_threads);
1086 EXPECT_TRUE(CheckRtp1());
1087 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 EXPECT_TRUE(CheckNoRtp1());
1089 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001090 EXPECT_TRUE(CheckRtcp1());
1091 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_TRUE(CheckNoRtcp1());
1093 EXPECT_TRUE(CheckNoRtcp2());
1094 }
1095
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 // Test that the mediachannel retains its sending state after the transport
1097 // becomes non-writable.
1098 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001099 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(SendInitiate());
1101 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001102 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1103 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001104 SendRtp1();
1105 SendRtp2();
1106 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 EXPECT_TRUE(CheckRtp1());
1108 EXPECT_TRUE(CheckRtp2());
1109 EXPECT_TRUE(CheckNoRtp1());
1110 EXPECT_TRUE(CheckNoRtp2());
1111
wu@webrtc.org97077a32013-10-25 21:18:33 +00001112 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001113 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1114 fake_rtp_dtls_transport1_->SetWritable(false);
1115 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001116 SendRtp1();
1117 SendRtp2();
1118 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_TRUE(CheckRtp1());
1120 EXPECT_TRUE(CheckNoRtp2());
1121
1122 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001123 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1124 fake_rtp_dtls_transport1_->SetWritable(true);
1125 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001127 SendRtp1();
1128 SendRtp2();
1129 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(CheckRtp1());
1131 EXPECT_TRUE(CheckRtp2());
1132 EXPECT_TRUE(CheckNoRtp1());
1133 EXPECT_TRUE(CheckNoRtp2());
1134
1135 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001136 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1137 bool asymmetric = true;
1138 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1139 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(media_channel1_->sending());
1141
wu@webrtc.org97077a32013-10-25 21:18:33 +00001142 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001143 SendRtp1();
1144 SendRtp2();
1145 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_TRUE(CheckRtp1());
1147 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001148 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149
1150 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001151 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001152 bool asymmetric = true;
1153 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1154 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001155 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001157 SendRtp1();
1158 SendRtp2();
1159 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 EXPECT_TRUE(CheckRtp1());
1161 EXPECT_TRUE(CheckRtp2());
1162 EXPECT_TRUE(CheckNoRtp1());
1163 EXPECT_TRUE(CheckNoRtp2());
1164 }
1165
Yves Gerey665174f2018-06-19 15:03:05 +02001166 void SendBundleToBundle(const int* pl_types,
1167 int len,
1168 bool rtcp_mux,
1169 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001170 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001172 // Only pl_type1 was added to the bundle filter for both |channel1_|
1173 // and |channel2_|.
1174 int pl_type1 = pl_types[0];
1175 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001176 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001177 if (secure)
1178 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001179 if (rtcp_mux) {
1180 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001181 }
1182 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001185
1186 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001187 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1188 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1189 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001190 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001191 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1192 EXPECT_TRUE(CheckNoRtp1());
1193 EXPECT_TRUE(CheckNoRtp2());
1194
Zhi Huang365381f2018-04-13 16:44:34 -07001195 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1196 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001197 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001198 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1199 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001200
Zhi Huange830e682018-03-30 10:48:35 -07001201 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001202 SendCustomRtcp1(kSsrc1);
1203 SendCustomRtcp2(kSsrc2);
1204 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1206 EXPECT_TRUE(CheckNoRtcp1());
1207 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1208 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001209
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001210 SendCustomRtcp1(kSsrc2);
1211 SendCustomRtcp2(kSsrc1);
1212 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001213 // Bundle filter shouldn't filter out any RTCP.
1214 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1215 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216 }
1217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218 void TestSetContentFailure() {
1219 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220
Peter Thatchera6d24442015-07-09 21:26:36 -07001221 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001222 std::unique_ptr<typename T::Content> content(
1223 CreateMediaContentWithStream(1));
1224
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001226 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001227 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001228 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001229 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001231 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001232 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001233 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001234
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001237 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 }
1239
1240 void TestSendTwoOffers() {
1241 CreateChannels(0, 0);
1242
Peter Thatchera6d24442015-07-09 21:26:36 -07001243 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001244 std::unique_ptr<typename T::Content> content1(
1245 CreateMediaContentWithStream(1));
1246 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001247 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1249
Steve Anton18ee1d52017-09-11 11:32:35 -07001250 std::unique_ptr<typename T::Content> content2(
1251 CreateMediaContentWithStream(2));
1252 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001253 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1255 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1256 }
1257
1258 void TestReceiveTwoOffers() {
1259 CreateChannels(0, 0);
1260
Peter Thatchera6d24442015-07-09 21:26:36 -07001261 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001262 std::unique_ptr<typename T::Content> content1(
1263 CreateMediaContentWithStream(1));
1264 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001265 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1267
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_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1273 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1274 }
1275
1276 void TestSendPrAnswer() {
1277 CreateChannels(0, 0);
1278
Peter Thatchera6d24442015-07-09 21:26:36 -07001279 std::string err;
1280 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001281 std::unique_ptr<typename T::Content> content1(
1282 CreateMediaContentWithStream(1));
1283 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001284 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1286
Peter Thatchera6d24442015-07-09 21:26:36 -07001287 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001288 std::unique_ptr<typename T::Content> content2(
1289 CreateMediaContentWithStream(2));
1290 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001291 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1293 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1294
Peter Thatchera6d24442015-07-09 21:26:36 -07001295 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001296 std::unique_ptr<typename T::Content> content3(
1297 CreateMediaContentWithStream(3));
1298 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001299 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1301 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1302 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1303 }
1304
1305 void TestReceivePrAnswer() {
1306 CreateChannels(0, 0);
1307
Peter Thatchera6d24442015-07-09 21:26:36 -07001308 std::string err;
1309 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001310 std::unique_ptr<typename T::Content> content1(
1311 CreateMediaContentWithStream(1));
1312 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001313 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001314 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1315
Peter Thatchera6d24442015-07-09 21:26:36 -07001316 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001317 std::unique_ptr<typename T::Content> content2(
1318 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001319 EXPECT_TRUE(
1320 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001321 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1322 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1323
Peter Thatchera6d24442015-07-09 21:26:36 -07001324 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001325 std::unique_ptr<typename T::Content> content3(
1326 CreateMediaContentWithStream(3));
1327 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001328 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1330 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1331 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1332 }
1333
1334 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001335 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 EXPECT_TRUE(SendInitiate());
1337 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001338 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
1339 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340
1341 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001342 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343 // The sending message is only posted. channel2_ should be empty.
1344 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001345 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1346 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347
1348 // When channel1_ is deleted, the RTCP packet should be sent out to
1349 // channel2_.
1350 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001351 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 EXPECT_TRUE(CheckRtcp2());
1353 }
1354
zstein56162b92017-04-24 16:54:35 -07001355 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001356 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001358
zstein56162b92017-04-24 16:54:35 -07001359 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001360 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 EXPECT_TRUE(media_channel1_->ready_to_send());
1362
zstein56162b92017-04-24 16:54:35 -07001363 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001364 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366 }
1367
skvladdc1c62c2016-03-16 19:07:43 -07001368 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1369 typename T::Content content;
1370 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1371 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001372 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001373 }
1374
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001375 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001376 webrtc::RtpParameters parameters;
1377 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001378 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001379 parameters.encodings.push_back(encoding);
1380 return parameters;
1381 }
1382
1383 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001384 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001385 EXPECT_EQ(1UL, parameters.encodings.size());
1386 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1387 }
1388
1389 void DefaultMaxBitrateIsUnlimited() {
1390 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001391 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1392 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001393 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001394 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001395 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001396 }
1397
Zhi Huange830e682018-03-30 10:48:35 -07001398 // Test that when a channel gets new RtpTransport with a call to
1399 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1400 // with the options on the new one.
1401
Steve Anton8a63f782017-10-23 13:08:53 -07001402 // For example, audio and video may use separate socket options, but initially
1403 // be unbundled, then later become bundled. When this happens, their preferred
1404 // socket options should be merged to the underlying transport they share.
1405 void SocketOptionsMergedOnSetTransport() {
1406 constexpr int kSndBufSize = 4000;
1407 constexpr int kRcvBufSize = 8000;
1408
Zhi Huange830e682018-03-30 10:48:35 -07001409 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001410
1411 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1412 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1413 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1414 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1415
Zhi Huange830e682018-03-30 10:48:35 -07001416 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001417 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001418 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001419
1420 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001421 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1422 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001423 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001424 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1425 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001426 EXPECT_EQ(kRcvBufSize, option_val);
1427 }
1428
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001429 void CreateSimulcastContent(const std::vector<std::string>& rids,
1430 typename T::Content* content) {
1431 std::vector<RidDescription> rid_descriptions;
1432 for (const std::string name : rids) {
1433 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1434 }
1435
1436 StreamParams stream;
1437 stream.set_rids(rid_descriptions);
1438 CreateContent(0, kPcmuCodec, kH264Codec, content);
1439 // This is for unified plan, so there can be only one StreamParams.
1440 content->mutable_streams().clear();
1441 content->AddStream(stream);
1442 }
1443
1444 void VerifySimulcastStreamParams(const StreamParams& expected,
1445 const typename T::Channel* channel) {
1446 const std::vector<StreamParams>& streams = channel->local_streams();
1447 ASSERT_EQ(1u, streams.size());
1448 const StreamParams& result = streams[0];
1449 EXPECT_EQ(expected.rids(), result.rids());
1450 EXPECT_TRUE(result.has_ssrcs());
1451 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1452 std::vector<uint32_t> primary_ssrcs;
1453 result.GetPrimarySsrcs(&primary_ssrcs);
1454 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1455 }
1456
1457 void TestUpdateLocalStreamsWithSimulcast() {
1458 CreateChannels(0, 0);
1459 typename T::Content content1, content2, content3;
1460 CreateSimulcastContent({"f", "h", "q"}, &content1);
1461 EXPECT_TRUE(
1462 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1463 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1464 StreamParams stream1 = channel1_->local_streams()[0];
1465
1466 // Create a similar offer. SetLocalContent should not remove and add.
1467 CreateSimulcastContent({"f", "h", "q"}, &content2);
1468 EXPECT_TRUE(
1469 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1470 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1471 StreamParams stream2 = channel1_->local_streams()[0];
1472 // Check that the streams are identical (SSRCs didn't change).
1473 EXPECT_EQ(stream1, stream2);
1474
1475 // Create third offer that has same RIDs in different order.
1476 CreateSimulcastContent({"f", "q", "h"}, &content3);
1477 EXPECT_TRUE(
1478 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1479 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1480 }
1481
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001483 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1484 static void ProcessThreadQueue(rtc::Thread* thread) {
1485 RTC_DCHECK(thread->IsCurrent());
1486 while (!thread->empty()) {
1487 thread->ProcessMessages(0);
1488 }
1489 }
1490 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1491 // |threads| and current thread post packets to network thread.
1492 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001493 thread->Invoke<void>(RTC_FROM_HERE,
1494 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001495 }
1496 ProcessThreadQueue(rtc::Thread::Current());
1497 // Network thread move them around and post back to worker = current thread.
1498 if (!network_thread_->IsCurrent()) {
1499 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001500 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001501 }
1502 // Worker thread = current Thread process received messages.
1503 ProcessThreadQueue(rtc::Thread::Current());
1504 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001505 // TODO(pbos): Remove playout from all media channels and let renderers mute
1506 // themselves.
1507 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001508 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1509 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001510 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1511 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1512 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1513 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1514 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1515 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1516 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1517 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001518 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1519 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1520 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 cricket::FakeMediaEngine media_engine_;
1522 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001523 typename T::MediaChannel* media_channel1_ = nullptr;
1524 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001525 std::unique_ptr<typename T::Channel> channel1_;
1526 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527 typename T::Content local_media_content1_;
1528 typename T::Content local_media_content2_;
1529 typename T::Content remote_media_content1_;
1530 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001532 rtc::Buffer rtp_packet_;
1533 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001534 int rtcp_mux_activated_callbacks1_ = 0;
1535 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001536 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001537 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538};
1539
Yves Gerey665174f2018-06-19 15:03:05 +02001540template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001541std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1542 rtc::Thread* worker_thread,
1543 rtc::Thread* network_thread,
1544 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1545 webrtc::RtpTransportInternal* rtp_transport,
1546 int flags) {
1547 rtp_transport->SignalRtcpPacketReceived.connect(
1548 static_cast<cricket::RtpHelper<cricket::VoiceMediaChannel>*>(ch.get()),
1549 &cricket::RtpHelper<cricket::VoiceMediaChannel>::OnRtcpPacketReceived);
1550 rtc::Thread* signaling_thread = rtc::Thread::Current();
1551 auto channel = std::make_unique<cricket::VoiceChannel>(
1552 worker_thread, network_thread, signaling_thread, std::move(ch),
1553 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1554 &ssrc_generator_);
1555 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
1556 return channel;
1557}
1558
1559template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560void ChannelTest<VoiceTraits>::CreateContent(
1561 int flags,
1562 const cricket::AudioCodec& audio_codec,
1563 const cricket::VideoCodec& video_codec,
1564 cricket::AudioContentDescription* audio) {
1565 audio->AddCodec(audio_codec);
1566 audio->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<VoiceTraits>::CopyContent(
1571 const cricket::AudioContentDescription& source,
1572 cricket::AudioContentDescription* audio) {
1573 *audio = source;
1574}
1575
Yves Gerey665174f2018-06-19 15:03:05 +02001576template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1578 const cricket::AudioCodec& c2) {
1579 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001580 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581}
1582
Peter Boström0c4e06b2015-10-07 12:23:21 +02001583template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001585 uint32_t ssrc,
1586 int flags,
1587 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588 audio->AddLegacyStream(ssrc);
1589}
1590
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001591class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001592 public:
solenberg1dd98f32015-09-10 01:57:14 -07001593 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001594 VoiceChannelSingleThreadTest()
1595 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1596};
1597
1598class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1599 public:
1600 typedef ChannelTest<VoiceTraits> Base;
1601 VoiceChannelDoubleThreadTest()
1602 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603};
1604
jbauch5869f502017-06-29 12:31:36 -07001605class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001606 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001607 public:
1608 typedef ChannelTest<VoiceTraits> Base;
1609 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001610 : Base(true,
1611 kPcmuFrameWithExtensions,
1612 kRtcpReport,
1613 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001614};
1615
1616class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001617 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001618 public:
1619 typedef ChannelTest<VoiceTraits> Base;
1620 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001621 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1622 }
jbauch5869f502017-06-29 12:31:36 -07001623};
1624
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001626template <>
Steve Anton8699a322017-11-06 15:53:33 -08001627std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001628 rtc::Thread* worker_thread,
1629 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001630 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001631 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001632 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001633 rtp_transport->SignalRtcpPacketReceived.connect(
1634 static_cast<cricket::RtpHelper<cricket::VideoMediaChannel>*>(ch.get()),
1635 &cricket::RtpHelper<cricket::VideoMediaChannel>::OnRtcpPacketReceived);
deadbeeff5346592017-01-24 21:51:21 -08001636 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001637 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001638 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001639 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1640 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001641 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 return channel;
1643}
1644
Yves Gerey665174f2018-06-19 15:03:05 +02001645template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646void ChannelTest<VideoTraits>::CreateContent(
1647 int flags,
1648 const cricket::AudioCodec& audio_codec,
1649 const cricket::VideoCodec& video_codec,
1650 cricket::VideoContentDescription* video) {
1651 video->AddCodec(video_codec);
1652 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653}
1654
Yves Gerey665174f2018-06-19 15:03:05 +02001655template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656void ChannelTest<VideoTraits>::CopyContent(
1657 const cricket::VideoContentDescription& source,
1658 cricket::VideoContentDescription* video) {
1659 *video = source;
1660}
1661
Yves Gerey665174f2018-06-19 15:03:05 +02001662template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1664 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001665 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666}
1667
Peter Boström0c4e06b2015-10-07 12:23:21 +02001668template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001670 uint32_t ssrc,
1671 int flags,
1672 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001673 video->AddLegacyStream(ssrc);
1674}
1675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001676class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 public:
solenberg1dd98f32015-09-10 01:57:14 -07001678 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679 VideoChannelSingleThreadTest()
1680 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681};
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1684 public:
1685 typedef ChannelTest<VideoTraits> Base;
1686 VideoChannelDoubleThreadTest()
1687 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1688};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001690TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::TestInit();
1692 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1693 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1694}
1695
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001696TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1697 Base::TestDeinit();
1698}
1699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 Base::TestSetContents();
1702}
1703
Johannes Kron9190b822018-10-29 11:22:05 +01001704TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1705 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1706}
1707
1708TEST_F(VoiceChannelSingleThreadTest,
1709 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1710 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1711}
1712
1713TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1714 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1715}
1716
1717TEST_F(VoiceChannelSingleThreadTest,
1718 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1719 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 Base::TestSetContentsNullOffer();
1724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::TestSetContentsRtcpMux();
1728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 Base::TestSetContentsRtcpMux();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 Base::TestChangeStreamParamsInContent();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestPlayoutAndSendingStates();
1740}
1741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001742TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 Base::TestMediaContentDirection();
1744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001747 Base::TestNetworkRouteChanges();
1748}
1749
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001750TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 Base::TestCallSetup();
1752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 Base::TestCallTeardownRtcpMux();
1756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 Base::SendRtpToRtp();
1760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 Base::SendRtcpToRtcp();
1764}
1765
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001766TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001767 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001771 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 Base::SendRtpToRtpOnThread();
1780}
1781
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 Base::SendWithWritabilityLoss();
1784}
1785
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001786TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787 Base::TestSetContentFailure();
1788}
1789
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001790TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 Base::TestSendTwoOffers();
1792}
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 Base::TestReceiveTwoOffers();
1796}
1797
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001798TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 Base::TestSendPrAnswer();
1800}
1801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 Base::TestReceivePrAnswer();
1804}
1805
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 Base::TestFlushRtcp();
1808}
1809
zstein56162b92017-04-24 16:54:35 -07001810TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1811 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812}
1813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001815 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001818TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001819 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001820}
1821
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001822TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001823 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001824}
1825
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001826TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001827 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828}
1829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001831 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001832}
1833
Steve Anton8a63f782017-10-23 13:08:53 -07001834TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1835 Base::SocketOptionsMergedOnSetTransport();
1836}
1837
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001838// VoiceChannelDoubleThreadTest
1839TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001841 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1842 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843}
1844
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001845TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1846 Base::TestDeinit();
1847}
1848
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 Base::TestSetContents();
1851}
1852
Johannes Kron9190b822018-10-29 11:22:05 +01001853TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1854 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1855}
1856
1857TEST_F(VoiceChannelDoubleThreadTest,
1858 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1859 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1860}
1861
1862TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1863 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1864}
1865
1866TEST_F(VoiceChannelDoubleThreadTest,
1867 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1868 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1869}
1870
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001871TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 Base::TestSetContentsNullOffer();
1873}
1874
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001875TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 Base::TestSetContentsRtcpMux();
1877}
1878
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001880 Base::TestSetContentsRtcpMux();
1881}
1882
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001883TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 Base::TestChangeStreamParamsInContent();
1885}
1886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001887TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001888 Base::TestPlayoutAndSendingStates();
1889}
1890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001891TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1892 Base::TestMediaContentDirection();
1893}
1894
1895TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1896 Base::TestNetworkRouteChanges();
1897}
1898
1899TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1900 Base::TestCallSetup();
1901}
1902
1903TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1904 Base::TestCallTeardownRtcpMux();
1905}
1906
1907TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1908 Base::SendRtpToRtp();
1909}
1910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1912 Base::SendRtcpToRtcp();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001916 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917}
1918
1919TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001920 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1924 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1925}
1926
1927TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1928 Base::SendRtpToRtpOnThread();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1932 Base::SendWithWritabilityLoss();
1933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1936 Base::TestSetContentFailure();
1937}
1938
1939TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1940 Base::TestSendTwoOffers();
1941}
1942
1943TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1944 Base::TestReceiveTwoOffers();
1945}
1946
1947TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1948 Base::TestSendPrAnswer();
1949}
1950
1951TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1952 Base::TestReceivePrAnswer();
1953}
1954
zstein56162b92017-04-24 16:54:35 -07001955TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1956 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1960 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1961}
1962
1963TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1964 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1965}
1966
1967TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1968 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1969}
1970
1971TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1972 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1973}
1974
1975TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1976 Base::DefaultMaxBitrateIsUnlimited();
1977}
1978
Steve Anton8a63f782017-10-23 13:08:53 -07001979TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1980 Base::SocketOptionsMergedOnSetTransport();
1981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983// VideoChannelSingleThreadTest
1984TEST_F(VideoChannelSingleThreadTest, TestInit) {
1985 Base::TestInit();
1986}
1987
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001988TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1989 Base::TestDeinit();
1990}
1991
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001992TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1993 Base::TestSetContents();
1994}
1995
Johannes Kron9190b822018-10-29 11:22:05 +01001996TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1997 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1998}
1999
2000TEST_F(VideoChannelSingleThreadTest,
2001 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2002 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2003}
2004
2005TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2006 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2007}
2008
2009TEST_F(VideoChannelSingleThreadTest,
2010 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2011 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2012}
2013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002014TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2015 Base::TestSetContentsNullOffer();
2016}
2017
2018TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2019 Base::TestSetContentsRtcpMux();
2020}
2021
2022TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2023 Base::TestSetContentsRtcpMux();
2024}
2025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002026TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2027 Base::TestChangeStreamParamsInContent();
2028}
2029
2030TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2031 Base::TestPlayoutAndSendingStates();
2032}
2033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002034TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 Base::TestMediaContentDirection();
2036}
2037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002038TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002039 Base::TestNetworkRouteChanges();
2040}
2041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002042TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 Base::TestCallSetup();
2044}
2045
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002046TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 Base::TestCallTeardownRtcpMux();
2048}
2049
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002050TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 Base::SendRtpToRtp();
2052}
2053
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002054TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055 Base::SendRtcpToRtcp();
2056}
2057
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002058TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002059 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002060}
2061
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002062TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002063 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064}
2065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002066TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2068}
2069
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002070TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002071 Base::SendRtpToRtpOnThread();
2072}
2073
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002074TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075 Base::SendWithWritabilityLoss();
2076}
2077
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002078TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 Base::TestSetContentFailure();
2080}
2081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 Base::TestSendTwoOffers();
2084}
2085
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002086TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002087 Base::TestReceiveTwoOffers();
2088}
2089
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002090TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 Base::TestSendPrAnswer();
2092}
2093
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002094TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 Base::TestReceivePrAnswer();
2096}
2097
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002098TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002099 Base::TestFlushRtcp();
2100}
2101
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002102TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002103 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104}
2105
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002106TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002107 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002108}
2109
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002110TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002111 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002112}
2113
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002114TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002115 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116}
2117
zstein56162b92017-04-24 16:54:35 -07002118TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2119 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120}
2121
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002122TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002123 Base::DefaultMaxBitrateIsUnlimited();
2124}
2125
Steve Anton8a63f782017-10-23 13:08:53 -07002126TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2127 Base::SocketOptionsMergedOnSetTransport();
2128}
2129
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002130TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2131 Base::TestUpdateLocalStreamsWithSimulcast();
2132}
2133
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002134TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2135 const cricket::VideoCodec kVp8Codec(97, "VP8");
2136 cricket::VideoCodec vp9_codec(98, "VP9");
2137 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2138 cricket::VideoContentDescription video;
2139 video.set_codecs({kVp8Codec, vp9_codec});
2140
2141 CreateChannels(0, 0);
2142
2143 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2144 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2145 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2146 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2147 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2148 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2149 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2150 cricket::kPacketizationParamRaw);
2151}
2152
2153TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2154 const cricket::VideoCodec kVp8Codec(97, "VP8");
2155 cricket::VideoCodec vp9_codec(98, "VP9");
2156 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2157 cricket::VideoContentDescription video;
2158 video.set_codecs({kVp8Codec, vp9_codec});
2159
2160 CreateChannels(0, 0);
2161
2162 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2163 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2164 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2165 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2166 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2167 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2168 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2169 cricket::kPacketizationParamRaw);
2170}
2171
2172TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2173 const cricket::VideoCodec kVp8Codec(97, "VP8");
2174 cricket::VideoCodec vp9_codec(98, "VP9");
2175 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2176 cricket::VideoContentDescription video;
2177 video.set_codecs({kVp8Codec, vp9_codec});
2178
2179 CreateChannels(0, 0);
2180
2181 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2182 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2183 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2184 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2185 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2186 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2187 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2188 cricket::kPacketizationParamRaw);
2189 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2190 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2191 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2192 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2193 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2194 cricket::kPacketizationParamRaw);
2195}
2196
2197TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2198 const cricket::VideoCodec kLocalCodec(98, "VP8");
2199 cricket::VideoCodec remote_codec(99, "VP8");
2200 remote_codec.packetization = cricket::kPacketizationParamRaw;
2201 cricket::VideoContentDescription local_video;
2202 local_video.set_codecs({kLocalCodec});
2203 cricket::VideoContentDescription remote_video;
2204 remote_video.set_codecs({remote_codec});
2205
2206 CreateChannels(0, 0);
2207
2208 EXPECT_TRUE(
2209 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2210 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2211 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2212 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2213 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2214 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2215}
2216
2217TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2218 cricket::VideoCodec local_codec(98, "VP8");
2219 local_codec.packetization = cricket::kPacketizationParamRaw;
2220 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2221 cricket::VideoContentDescription local_video;
2222 local_video.set_codecs({local_codec});
2223 cricket::VideoContentDescription remote_video;
2224 remote_video.set_codecs({kRemoteCodec});
2225
2226 CreateChannels(0, 0);
2227
2228 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2229 EXPECT_TRUE(
2230 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2231 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2232 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2233 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2234 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2235}
2236
2237TEST_F(VideoChannelSingleThreadTest,
2238 TestSetRemoteAnswerWithInvalidPacketization) {
2239 cricket::VideoCodec local_codec(98, "VP8");
2240 local_codec.packetization = cricket::kPacketizationParamRaw;
2241 cricket::VideoCodec remote_codec(99, "VP8");
2242 remote_codec.packetization = "unknownpacketizationattributevalue";
2243 cricket::VideoContentDescription local_video;
2244 local_video.set_codecs({local_codec});
2245 cricket::VideoContentDescription remote_video;
2246 remote_video.set_codecs({remote_codec});
2247
2248 CreateChannels(0, 0);
2249
2250 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2251 EXPECT_FALSE(
2252 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2253 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2254 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2255 cricket::kPacketizationParamRaw);
2256 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2257}
2258
2259TEST_F(VideoChannelSingleThreadTest,
2260 TestSetLocalAnswerWithInvalidPacketization) {
2261 cricket::VideoCodec local_codec(98, "VP8");
2262 local_codec.packetization = cricket::kPacketizationParamRaw;
2263 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2264 cricket::VideoContentDescription local_video;
2265 local_video.set_codecs({local_codec});
2266 cricket::VideoContentDescription remote_video;
2267 remote_video.set_codecs({kRemoteCodec});
2268
2269 CreateChannels(0, 0);
2270
2271 EXPECT_TRUE(
2272 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2273 EXPECT_FALSE(
2274 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2275 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2276 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2277 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280// VideoChannelDoubleThreadTest
2281TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2282 Base::TestInit();
2283}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002285TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2286 Base::TestDeinit();
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2290 Base::TestSetContents();
2291}
2292
Johannes Kron9190b822018-10-29 11:22:05 +01002293TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2294 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2295}
2296
2297TEST_F(VideoChannelDoubleThreadTest,
2298 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2299 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2300}
2301
2302TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2303 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2304}
2305
2306TEST_F(VideoChannelDoubleThreadTest,
2307 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2308 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2309}
2310
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002311TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2312 Base::TestSetContentsNullOffer();
2313}
2314
2315TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2316 Base::TestSetContentsRtcpMux();
2317}
2318
2319TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2320 Base::TestSetContentsRtcpMux();
2321}
2322
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2324 Base::TestChangeStreamParamsInContent();
2325}
2326
2327TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2328 Base::TestPlayoutAndSendingStates();
2329}
2330
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002331TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2332 Base::TestMediaContentDirection();
2333}
2334
2335TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2336 Base::TestNetworkRouteChanges();
2337}
2338
2339TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2340 Base::TestCallSetup();
2341}
2342
2343TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2344 Base::TestCallTeardownRtcpMux();
2345}
2346
2347TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2348 Base::SendRtpToRtp();
2349}
2350
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002351TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2352 Base::SendRtcpToRtcp();
2353}
2354
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002355TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002356 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002357}
2358
2359TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002360 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002361}
2362
2363TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2364 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2365}
2366
2367TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2368 Base::SendRtpToRtpOnThread();
2369}
2370
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002371TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2372 Base::SendWithWritabilityLoss();
2373}
2374
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2376 Base::TestSetContentFailure();
2377}
2378
2379TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2380 Base::TestSendTwoOffers();
2381}
2382
2383TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2384 Base::TestReceiveTwoOffers();
2385}
2386
2387TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2388 Base::TestSendPrAnswer();
2389}
2390
2391TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2392 Base::TestReceivePrAnswer();
2393}
2394
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002395TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2396 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2397}
2398
2399TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2400 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2401}
2402
2403TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2404 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2405}
2406
2407TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2408 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2409}
2410
zstein56162b92017-04-24 16:54:35 -07002411TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2412 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413}
2414
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002415TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2416 Base::DefaultMaxBitrateIsUnlimited();
2417}
2418
Steve Anton8a63f782017-10-23 13:08:53 -07002419TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2420 Base::SocketOptionsMergedOnSetTransport();
2421}
2422
deadbeef953c2ce2017-01-09 14:53:41 -08002423// RtpDataChannelSingleThreadTest
2424class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002426 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002427 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002428 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2429};
2430
deadbeef953c2ce2017-01-09 14:53:41 -08002431// RtpDataChannelDoubleThreadTest
2432class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433 public:
2434 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002435 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002436 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437};
2438
2439// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002440template <>
Steve Anton8699a322017-11-06 15:53:33 -08002441std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002442 rtc::Thread* worker_thread,
2443 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002444 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002445 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002446 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02002447 rtp_transport->SignalRtcpPacketReceived.connect(
2448 static_cast<cricket::RtpHelper<cricket::DataMediaChannel>*>(ch.get()),
2449 &cricket::RtpHelper<cricket::DataMediaChannel>::OnRtcpPacketReceived);
deadbeeff5346592017-01-24 21:51:21 -08002450 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002451 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002452 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002453 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2454 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002455 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 return channel;
2457}
2458
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460void ChannelTest<DataTraits>::CreateContent(
2461 int flags,
2462 const cricket::AudioCodec& audio_codec,
2463 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002464 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 data->AddCodec(kGoogleDataCodec);
2466 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002467}
2468
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002471 const cricket::RtpDataContentDescription& source,
2472 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473 *data = source;
2474}
2475
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002476template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2478 const cricket::DataCodec& c2) {
2479 return c1.name == c2.name;
2480}
2481
Peter Boström0c4e06b2015-10-07 12:23:21 +02002482template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002484 uint32_t ssrc,
2485 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002486 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487 data->AddLegacyStream(ssrc);
2488}
2489
deadbeef953c2ce2017-01-09 14:53:41 -08002490TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 Base::TestInit();
2492 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2493}
2494
deadbeef953c2ce2017-01-09 14:53:41 -08002495TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002496 Base::TestDeinit();
2497}
2498
deadbeef953c2ce2017-01-09 14:53:41 -08002499TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::TestSetContents();
2501}
2502
deadbeef953c2ce2017-01-09 14:53:41 -08002503TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestSetContentsNullOffer();
2505}
2506
deadbeef953c2ce2017-01-09 14:53:41 -08002507TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 Base::TestSetContentsRtcpMux();
2509}
2510
deadbeef953c2ce2017-01-09 14:53:41 -08002511TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 Base::TestChangeStreamParamsInContent();
2513}
2514
deadbeef953c2ce2017-01-09 14:53:41 -08002515TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 Base::TestPlayoutAndSendingStates();
2517}
2518
deadbeef953c2ce2017-01-09 14:53:41 -08002519TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 Base::TestMediaContentDirection();
2521}
2522
deadbeef953c2ce2017-01-09 14:53:41 -08002523TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 Base::TestCallSetup();
2525}
2526
deadbeef953c2ce2017-01-09 14:53:41 -08002527TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 Base::TestCallTeardownRtcpMux();
2529}
2530
zstein56162b92017-04-24 16:54:35 -07002531TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2532 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533}
2534
deadbeef953c2ce2017-01-09 14:53:41 -08002535TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 Base::SendRtpToRtp();
2537}
2538
deadbeef953c2ce2017-01-09 14:53:41 -08002539TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 Base::SendRtcpToRtcp();
2541}
2542
deadbeef953c2ce2017-01-09 14:53:41 -08002543TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 Base::SendRtpToRtpOnThread();
2545}
2546
deadbeef953c2ce2017-01-09 14:53:41 -08002547TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 Base::SendWithWritabilityLoss();
2549}
2550
Steve Anton8a63f782017-10-23 13:08:53 -07002551TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2552 Base::SocketOptionsMergedOnSetTransport();
2553}
2554
deadbeef953c2ce2017-01-09 14:53:41 -08002555TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002556 CreateChannels(0, 0);
2557 EXPECT_TRUE(SendInitiate());
2558 EXPECT_TRUE(SendAccept());
2559
2560 cricket::SendDataParams params;
2561 params.ssrc = 42;
2562 unsigned char data[] = {'f', 'o', 'o'};
2563 rtc::CopyOnWriteBuffer payload(data, 3);
2564 cricket::SendDataResult result;
2565 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2566 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2567 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2568}
2569
deadbeef953c2ce2017-01-09 14:53:41 -08002570TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002571 Base::TestInit();
2572 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2573}
2574
deadbeef953c2ce2017-01-09 14:53:41 -08002575TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002576 Base::TestDeinit();
2577}
2578
deadbeef953c2ce2017-01-09 14:53:41 -08002579TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002580 Base::TestSetContents();
2581}
2582
deadbeef953c2ce2017-01-09 14:53:41 -08002583TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002584 Base::TestSetContentsNullOffer();
2585}
2586
deadbeef953c2ce2017-01-09 14:53:41 -08002587TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002588 Base::TestSetContentsRtcpMux();
2589}
2590
deadbeef953c2ce2017-01-09 14:53:41 -08002591TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002592 Base::TestChangeStreamParamsInContent();
2593}
2594
deadbeef953c2ce2017-01-09 14:53:41 -08002595TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002596 Base::TestPlayoutAndSendingStates();
2597}
2598
deadbeef953c2ce2017-01-09 14:53:41 -08002599TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002600 Base::TestMediaContentDirection();
2601}
2602
deadbeef953c2ce2017-01-09 14:53:41 -08002603TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002604 Base::TestCallSetup();
2605}
2606
deadbeef953c2ce2017-01-09 14:53:41 -08002607TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002608 Base::TestCallTeardownRtcpMux();
2609}
2610
zstein56162b92017-04-24 16:54:35 -07002611TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2612 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002613}
2614
deadbeef953c2ce2017-01-09 14:53:41 -08002615TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002616 Base::SendRtpToRtp();
2617}
2618
deadbeef953c2ce2017-01-09 14:53:41 -08002619TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002620 Base::SendRtcpToRtcp();
2621}
2622
deadbeef953c2ce2017-01-09 14:53:41 -08002623TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002624 Base::SendRtpToRtpOnThread();
2625}
2626
deadbeef953c2ce2017-01-09 14:53:41 -08002627TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002628 Base::SendWithWritabilityLoss();
2629}
2630
Steve Anton8a63f782017-10-23 13:08:53 -07002631TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2632 Base::SocketOptionsMergedOnSetTransport();
2633}
2634
deadbeef953c2ce2017-01-09 14:53:41 -08002635TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 CreateChannels(0, 0);
2637 EXPECT_TRUE(SendInitiate());
2638 EXPECT_TRUE(SendAccept());
2639
2640 cricket::SendDataParams params;
2641 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002642 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002643 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 cricket::SendDataResult result;
2645 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002646 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2648}
2649
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650// TODO(pthatcher): TestSetReceiver?