blob: db46934597e12e851eec120b37958af891a52388 [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"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "media/base/fake_media_engine.h"
22#include "media/base/fake_rtp.h"
23#include "media/base/media_channel.h"
24#include "p2p/base/candidate_pair_interface.h"
25#include "p2p/base/fake_dtls_transport.h"
26#include "p2p/base/fake_packet_transport.h"
27#include "p2p/base/ice_transport_internal.h"
28#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Tommic9625f02021-05-06 22:03:19 +020038#include "rtc_base/task_utils/pending_task_safety_flag.h"
39#include "rtc_base/task_utils/to_queued_task.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020040#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010041#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042
zhihuangb2cdd932017-01-19 16:54:25 -080043using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080045using cricket::RidDescription;
46using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080048using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080049using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051namespace {
52const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
53const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
54const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070055const cricket::VideoCodec kH264Codec(97, "H264");
56const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020057const 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
Harald Alvestrand48171ec2021-04-20 15:06:03 +000097// Base class for Voice/Video tests
Yves Gerey665174f2018-06-19 15:03:05 +020098template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 public:
deadbeefac22f702017-01-12 21:59:29 -0800101 enum Flags {
102 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800103 SSRC_MUX = 0x8,
104 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800105 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800106 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700107 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800108 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109
Peter Boström34fbfff2015-09-24 19:20:30 +0200110 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200111 rtc::ArrayView<const uint8_t> rtp_data,
112 rtc::ArrayView<const uint8_t> rtcp_data,
113 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200114 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800116 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 if (network_is_worker == NetworkIsWorker::Yes) {
118 network_thread_ = rtc::Thread::Current();
119 } else {
120 network_thread_keeper_ = rtc::Thread::Create();
121 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 network_thread_ = network_thread_keeper_.get();
123 }
Tommic9625f02021-05-06 22:03:19 +0200124 RTC_DCHECK(network_thread_);
125 }
126
127 ~ChannelTest() {
128 if (network_thread_) {
129 network_thread_->Invoke<void>(
130 RTC_FROM_HERE, [this]() { network_thread_safety_->SetNotAlive(); });
131 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200135 CreateChannels(std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200136 nullptr, typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200137 std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200138 nullptr, typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200139 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 }
Steve Anton8699a322017-11-06 15:53:33 -0800141 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
142 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200143 int flags1,
144 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200145 RTC_DCHECK(!channel1_);
146 RTC_DCHECK(!channel2_);
147
deadbeeff5346592017-01-24 21:51:21 -0800148 // Network thread is started in CreateChannels, to allow the test to
149 // configure a fake clock before any threads are spawned and attempt to
150 // access the time.
151 if (network_thread_keeper_) {
152 network_thread_keeper_->Start();
153 }
Zhi Huange830e682018-03-30 10:48:35 -0700154
deadbeeff5346592017-01-24 21:51:21 -0800155 // Make sure if using raw packet transports, they're used for both
156 // channels.
157 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200158 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeef5bd5ca32017-02-10 11:31:50 -0800159 rtc::PacketTransportInternal* rtp1 = nullptr;
160 rtc::PacketTransportInternal* rtcp1 = nullptr;
161 rtc::PacketTransportInternal* rtp2 = nullptr;
162 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800163 // Based on flags, create fake DTLS or raw packet transports.
164 if (flags1 & RAW_PACKET_TRANSPORT) {
165 fake_rtp_packet_transport1_.reset(
166 new rtc::FakePacketTransport("channel1_rtp"));
167 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700168 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800169 fake_rtcp_packet_transport1_.reset(
170 new rtc::FakePacketTransport("channel1_rtcp"));
171 rtcp1 = fake_rtcp_packet_transport1_.get();
172 }
173 } else {
174 // Confirmed to work with KT_RSA and KT_ECDSA.
175 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100176 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800177 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700178 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800179 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100180 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
181 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800182 rtcp1 = fake_rtcp_dtls_transport1_.get();
183 }
184 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100185 auto cert1 = rtc::RTCCertificate::Create(
186 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800187 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
188 if (fake_rtcp_dtls_transport1_) {
189 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
190 }
191 }
192 }
193 // Based on flags, create fake DTLS or raw packet transports.
194 if (flags2 & RAW_PACKET_TRANSPORT) {
195 fake_rtp_packet_transport2_.reset(
196 new rtc::FakePacketTransport("channel2_rtp"));
197 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700198 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800199 fake_rtcp_packet_transport2_.reset(
200 new rtc::FakePacketTransport("channel2_rtcp"));
201 rtcp2 = fake_rtcp_packet_transport2_.get();
202 }
203 } else {
204 // Confirmed to work with KT_RSA and KT_ECDSA.
205 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100206 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800207 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700208 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800209 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100210 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
211 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800212 rtcp2 = fake_rtcp_dtls_transport2_.get();
213 }
214 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100215 auto cert2 = rtc::RTCCertificate::Create(
216 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800217 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
218 if (fake_rtcp_dtls_transport2_) {
219 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
220 }
221 }
222 }
Zhi Huange830e682018-03-30 10:48:35 -0700223 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
224 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
225 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
226 flags1);
227 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
228 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
229 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
230 flags2);
231
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800232 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
233 rtp_transport1_.get(), flags1);
234 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
235 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200236 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
237 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 CopyContent(local_media_content1_, &remote_media_content1_);
239 CopyContent(local_media_content2_, &remote_media_content2_);
240
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 // Add stream information (SSRC) to the local content but not to the remote
242 // content. This means that we per default know the SSRC of what we send but
243 // not what we receive.
244 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
245 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
246
247 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
248 if (flags1 & SSRC_MUX) {
249 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
250 }
251 if (flags2 & SSRC_MUX) {
252 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
253 }
254 }
Steve Anton8699a322017-11-06 15:53:33 -0800255 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200256 rtc::Thread* worker_thread,
257 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800258 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700259 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200260 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261
Zhi Huange830e682018-03-30 10:48:35 -0700262 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
263 rtc::PacketTransportInternal* rtp_packet_transport,
264 rtc::PacketTransportInternal* rtcp_packet_transport,
265 DtlsTransportInternal* rtp_dtls_transport,
266 DtlsTransportInternal* rtcp_dtls_transport,
267 int flags) {
268 if (flags & RTCP_MUX) {
269 rtcp_packet_transport = nullptr;
270 rtcp_dtls_transport = nullptr;
271 }
272
273 if (flags & DTLS) {
274 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
275 } else {
276 if (flags & RAW_PACKET_TRANSPORT) {
277 return CreateUnencryptedTransport(rtp_packet_transport,
278 rtcp_packet_transport);
279 } else {
280 return CreateUnencryptedTransport(rtp_dtls_transport,
281 rtcp_dtls_transport);
282 }
283 }
284 }
285
286 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
287 rtc::PacketTransportInternal* rtp_packet_transport,
288 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200289 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200290 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700291
Niels Möller92430882021-03-18 10:03:19 +0100292 network_thread_->Invoke<void>(
293 RTC_FROM_HERE,
294 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
295 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
296 if (rtcp_packet_transport) {
297 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
298 }
299 });
Zhi Huange830e682018-03-30 10:48:35 -0700300 return rtp_transport;
301 }
302
303 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
304 cricket::DtlsTransportInternal* rtp_dtls_transport,
305 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200306 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700307 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700308
Niels Möller92430882021-03-18 10:03:19 +0100309 network_thread_->Invoke<void>(
310 RTC_FROM_HERE,
311 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
312 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
313 rtcp_dtls_transport);
314 });
Zhi Huange830e682018-03-30 10:48:35 -0700315 return dtls_srtp_transport;
316 }
317
deadbeeff5346592017-01-24 21:51:21 -0800318 void ConnectFakeTransports() {
319 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
320 bool asymmetric = false;
321 // Depending on test flags, could be using DTLS or raw packet transport.
322 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
323 fake_rtp_dtls_transport1_->SetDestination(
324 fake_rtp_dtls_transport2_.get(), asymmetric);
325 }
326 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
327 fake_rtcp_dtls_transport1_->SetDestination(
328 fake_rtcp_dtls_transport2_.get(), asymmetric);
329 }
330 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
331 fake_rtp_packet_transport1_->SetDestination(
332 fake_rtp_packet_transport2_.get(), asymmetric);
333 }
334 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
335 fake_rtcp_packet_transport1_->SetDestination(
336 fake_rtcp_packet_transport2_.get(), asymmetric);
337 }
338 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800339 // The transport becoming writable will asynchronously update the send state
340 // on the worker thread; since this test uses the main thread as the worker
341 // thread, we must process the message queue for this to occur.
342 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800343 }
344
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000346 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800347 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 if (result) {
349 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200350 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800352 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800354 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800356 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 }
358 }
359 return result;
360 }
361
362 bool SendAccept() {
363 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200364 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000365 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800366 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 }
368
369 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000370 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800371 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372 if (result) {
373 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000374 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800375 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendProvisionalAnswer() {
381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800382 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result) {
384 channel2_->Enable(true);
385 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800386 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800387 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000388 }
389 return result;
390 }
391
392 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000393 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800394 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000396 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800397 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 return result;
399 }
400
deadbeeff5346592017-01-24 21:51:21 -0800401 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 channel1_.reset();
403 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800404 fake_rtp_dtls_transport1_.reset();
405 fake_rtcp_dtls_transport1_.reset();
406 fake_rtp_dtls_transport2_.reset();
407 fake_rtcp_dtls_transport2_.reset();
408 fake_rtp_packet_transport1_.reset();
409 fake_rtcp_packet_transport1_.reset();
410 fake_rtp_packet_transport2_.reset();
411 fake_rtcp_packet_transport2_.reset();
412 if (network_thread_keeper_) {
Tommic9625f02021-05-06 22:03:19 +0200413 RTC_DCHECK_EQ(network_thread_, network_thread_keeper_.get());
414 network_thread_ = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800415 network_thread_keeper_.reset();
416 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 return true;
418 }
419
Tommic9625f02021-05-06 22:03:19 +0200420 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
421 network_thread_->PostTask(webrtc::ToQueuedTask(
422 network_thread_safety_, [media_channel, data = std::move(data)]() {
423 media_channel->SendRtp(data.data(), data.size(),
424 rtc::PacketOptions());
425 }));
426 }
427
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200429 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Tommic9625f02021-05-06 22:03:19 +0200431
432 void SendRtp1(rtc::Buffer data) {
433 SendRtp(media_channel1(), std::move(data));
434 }
435
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200437 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Tommic9625f02021-05-06 22:03:19 +0200439
440 void SendRtp2(rtc::Buffer data) {
441 SendRtp(media_channel2(), std::move(data));
442 }
443
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200446 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200449 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 bool CheckRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200453 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 }
455 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200456 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200461 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200465 return media_channel2()->CheckRtp(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 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477
Tommic9625f02021-05-06 22:03:19 +0200478 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
479 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480
481 void CreateContent(int flags,
482 const cricket::AudioCodec& audio_codec,
483 const cricket::VideoCodec& video_codec,
484 typename T::Content* content) {
485 // overridden in specialized classes
486 }
487 void CopyContent(const typename T::Content& source,
488 typename T::Content* content) {
489 // overridden in specialized classes
490 }
491
Steve Anton18ee1d52017-09-11 11:32:35 -0700492 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700494 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
495 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700496 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700497 AddLegacyStreamInContent(ssrc, 0, content);
498 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 }
500
ossu292d6582016-03-17 02:31:13 -0700501 // Will manage the lifetime of a CallThread, making sure it's
502 // destroyed before this object goes out of scope.
503 class ScopedCallThread {
504 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200505 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100506 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100507 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700508 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100509 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700510 }
511
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200512 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700513
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200514 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700515
516 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200517 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700518 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
521 return false; // overridden in specialized classes
522 }
523
Honghai Zhangcc411c02016-03-29 17:27:21 -0700524 cricket::CandidatePairInterface* last_selected_candidate_pair() {
525 return last_selected_candidate_pair_;
526 }
527
Peter Boström0c4e06b2015-10-07 12:23:21 +0200528 void AddLegacyStreamInContent(uint32_t ssrc,
529 int flags,
530 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531 // Base implementation.
532 }
533
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200534 // Utility method that calls BaseChannel::srtp_active() on the network thread
535 // and returns the result. The |srtp_active()| state is maintained on the
536 // network thread, which callers need to factor in.
537 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
538 RTC_DCHECK(channel.get());
539 return network_thread_->Invoke<bool>(
540 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
541 }
542
543 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
544 // returns true.
545 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
546 RTC_DCHECK(channel.get());
547 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
548 return channel->rtp_transport() &&
549 channel->rtp_transport()->rtcp_mux_enabled();
550 });
551 }
552
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 // Tests that can be used by derived classes.
554
555 // Basic sanity check.
556 void TestInit() {
557 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200558 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200559 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200560 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200561 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200562 }
Tommic9625f02021-05-06 22:03:19 +0200563 EXPECT_TRUE(media_channel1()->codecs().empty());
564 EXPECT_TRUE(media_channel1()->recv_streams().empty());
565 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 }
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));
Tommic9625f02021-05-06 22:03:19 +0200575 EXPECT_EQ(0U, media_channel1()->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800576 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200577 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200578 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200579 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));
Tommic9625f02021-05-06 22:03:19 +0200596 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100597 }
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));
Tommic9625f02021-05-06 22:03:19 +0200610 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100611 }
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);
Tommic9625f02021-05-06 22:03:19 +0200620 EXPECT_EQ(0U, media_channel1()->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800621 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200622 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200623 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200624 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
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 // Test that SetLocalContent and SetRemoteContent properly
644 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800645 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 void TestChangeStreamParamsInContent() {
647 cricket::StreamParams stream1;
648 stream1.groupid = "group1";
649 stream1.id = "stream1";
650 stream1.ssrcs.push_back(kSsrc1);
651 stream1.cname = "stream1_cname";
652
653 cricket::StreamParams stream2;
654 stream2.groupid = "group1";
655 stream2.id = "stream2";
656 stream2.ssrcs.push_back(kSsrc2);
657 stream2.cname = "stream2_cname";
658
659 // Setup a call where channel 1 send |stream1| to channel 2.
660 CreateChannels(0, 0);
661 typename T::Content content1;
662 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
663 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
Tommi1959f8f2021-04-26 10:20:19 +0200665 channel1_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200666 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667
Steve Anton3828c062017-12-06 10:34:51 -0800668 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200669 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800670 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671
672 // Channel 2 do not send anything.
673 typename T::Content content2;
674 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800675 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200676 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800677 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
Tommi1959f8f2021-04-26 10:20:19 +0200678 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200679 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200681 SendCustomRtp1(kSsrc1, 0);
682 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
684
685 // Let channel 2 update the content by sending |stream2| and enable SRTP.
686 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700687 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800689 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200690 ASSERT_EQ(1u, media_channel2()->send_streams().size());
691 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692
Steve Anton3828c062017-12-06 10:34:51 -0800693 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200694 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
695 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
697 // Channel 1 replies but stop sending stream1.
698 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700699 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200701 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
Steve Anton3828c062017-12-06 10:34:51 -0800703 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200704 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200706 SendCustomRtp2(kSsrc2, 0);
707 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
709 }
710
711 // Test that we only start playout and sending at the right times.
712 void TestPlayoutAndSendingStates() {
713 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200714 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200715 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200716 }
Tommic9625f02021-05-06 22:03:19 +0200717 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200718 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200719 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200720 }
Tommic9625f02021-05-06 22:03:19 +0200721 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200722 channel1_->Enable(true);
723 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200725 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200726 }
Tommic9625f02021-05-06 22:03:19 +0200727 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000728 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800729 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200731 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 }
Tommic9625f02021-05-06 22:03:19 +0200733 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000734 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800735 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200737 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200738 }
Tommic9625f02021-05-06 22:03:19 +0200739 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800741 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200743 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 }
Tommic9625f02021-05-06 22:03:19 +0200745 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800746 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200748 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200749 }
Tommic9625f02021-05-06 22:03:19 +0200750 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200752 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200753 }
Tommic9625f02021-05-06 22:03:19 +0200754 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200755 channel2_->Enable(true);
756 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200758 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200759 }
Tommic9625f02021-05-06 22:03:19 +0200760 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000761 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800762 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200765 }
Tommic9625f02021-05-06 22:03:19 +0200766 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 }
768
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 // Test that changing the MediaContentDirection in the local and remote
770 // session description start playout and sending at the right time.
771 void TestMediaContentDirection() {
772 CreateChannels(0, 0);
773 typename T::Content content1;
774 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
775 typename T::Content content2;
776 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
777 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800778 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779
Tommi1959f8f2021-04-26 10:20:19 +0200780 channel1_->Enable(true);
781 channel2_->Enable(true);
782 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200783 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200784 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 }
Tommic9625f02021-05-06 22:03:19 +0200786 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200788 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200789 }
Tommic9625f02021-05-06 22:03:19 +0200790 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
Steve Anton3828c062017-12-06 10:34:51 -0800792 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
793 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
794 EXPECT_TRUE(
795 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
796 EXPECT_TRUE(
797 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800798 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799
Peter Boström34fbfff2015-09-24 19:20:30 +0200800 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200801 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200802 }
Tommic9625f02021-05-06 22:03:19 +0200803 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200804 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200805 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200806 }
Tommic9625f02021-05-06 22:03:19 +0200807 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808
809 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800810 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800811 EXPECT_TRUE(
812 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
813 EXPECT_TRUE(
814 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815
Peter Boström34fbfff2015-09-24 19:20:30 +0200816 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200817 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200818 }
Tommic9625f02021-05-06 22:03:19 +0200819 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200820 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200821 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200822 }
Tommic9625f02021-05-06 22:03:19 +0200823 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824
825 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800826 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800827 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
828 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829
Peter Boström34fbfff2015-09-24 19:20:30 +0200830 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200831 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200832 }
Tommic9625f02021-05-06 22:03:19 +0200833 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200834 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200835 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 }
Tommic9625f02021-05-06 22:03:19 +0200837 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838 }
839
Honghai Zhangcc411c02016-03-29 17:27:21 -0700840 // Tests that when the transport channel signals a candidate pair change
841 // event, the media channel will receive a call on the network route change.
842 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700843 static constexpr uint16_t kLocalNetId = 1;
844 static constexpr uint16_t kRemoteNetId = 2;
845 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800846 // Ipv4(20) + UDP(8).
847 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800848 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200849
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800850 CreateChannels(DTLS, DTLS);
851 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700852
Honghai Zhangcc411c02016-03-29 17:27:21 -0700853 typename T::MediaChannel* media_channel1 =
854 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200855 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700856
Zhi Huang942bc2e2017-11-13 13:26:07 -0800857 // Need to wait for the threads before calling
858 // |set_num_network_route_changes| because the network route would be set
859 // when creating the channel.
860 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200861 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800862 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800863 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200864 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800865 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200866 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200867 });
868 WaitForThreads();
869 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700870 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200871 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700872
eladalon05b07bb2017-08-24 07:40:16 -0700873 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800874 rtc::NetworkRoute network_route;
875 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100876 network_route.local =
877 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
878 network_route.remote =
879 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800880 network_route.last_sent_packet_id = kLastPacketId;
881 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200882 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800883 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
884
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200885 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200886 });
887 WaitForThreads();
888 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100889 EXPECT_TRUE(media_channel1->last_network_route().connected);
890 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100891 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100892 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100893 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200894 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700895 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800896 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800897 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700898 }
899
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900 // Test setting up a call.
901 void TestCallSetup() {
902 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200903 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200905 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200906 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200907 }
Tommic9625f02021-05-06 22:03:19 +0200908 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200910 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200911 EXPECT_TRUE(media_channel1()->sending());
912 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200913 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200914 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200915 }
Tommic9625f02021-05-06 22:03:19 +0200916 EXPECT_TRUE(media_channel2()->sending());
917 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918 }
919
920 // Test that we don't crash if packets are sent during call teardown
921 // when RTCP mux is enabled. This is a regression test against a specific
922 // race condition that would only occur when a RTCP packet was sent during
923 // teardown of a channel on which RTCP mux was enabled.
924 void TestCallTeardownRtcpMux() {
925 class LastWordMediaChannel : public T::MediaChannel {
926 public:
Tommic9625f02021-05-06 22:03:19 +0200927 explicit LastWordMediaChannel(rtc::Thread* network_thread)
928 : T::MediaChannel(NULL, typename T::Options(), network_thread) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700930 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
931 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
933 }
934 };
Tommic9625f02021-05-06 22:03:19 +0200935 CreateChannels(std::make_unique<LastWordMediaChannel>(network_thread_),
936 std::make_unique<LastWordMediaChannel>(network_thread_),
937 RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 EXPECT_TRUE(SendInitiate());
939 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800940 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000941 }
942
943 // Send voice RTP data to the other side and ensure it gets there.
944 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700945 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 EXPECT_TRUE(SendInitiate());
947 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200948 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
949 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200950 SendRtp1();
951 SendRtp2();
952 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 EXPECT_TRUE(CheckRtp1());
954 EXPECT_TRUE(CheckRtp2());
955 EXPECT_TRUE(CheckNoRtp1());
956 EXPECT_TRUE(CheckNoRtp2());
957 }
958
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200959 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800960 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200961 EXPECT_TRUE(SendInitiate());
962 EXPECT_TRUE(SendAccept());
963 SendRtp1();
964 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200965 // Do not wait, destroy channels.
966 channel1_.reset(nullptr);
967 channel2_.reset(nullptr);
968 }
969
Zhi Huange830e682018-03-30 10:48:35 -0700970 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
971 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200972 EXPECT_FALSE(IsSrtpActive(channel1_));
973 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000974 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200975 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000976 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200977 EXPECT_TRUE(IsSrtpActive(channel1_));
978 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200979 SendRtp1();
980 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200981 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982 EXPECT_TRUE(CheckRtp1());
983 EXPECT_TRUE(CheckRtp2());
984 EXPECT_TRUE(CheckNoRtp1());
985 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 }
987
988 // Test that we can send and receive early media when a provisional answer is
989 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
990 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200991 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992
Yves Gerey665174f2018-06-19 15:03:05 +0200993 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
994 EXPECT_TRUE(SendOffer());
995 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200996 EXPECT_TRUE(IsSrtpActive(channel1_));
997 EXPECT_TRUE(IsSrtpActive(channel2_));
998 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
999 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +02001000 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +02001001 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1002 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001003 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004
Yves Gerey665174f2018-06-19 15:03:05 +02001005 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +02001006 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1007 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001008 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009
Yves Gerey665174f2018-06-19 15:03:05 +02001010 // Complete call setup and ensure everything is still OK.
1011 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001012 EXPECT_TRUE(IsSrtpActive(channel1_));
1013 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +02001014 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +02001015 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1016 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001017 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001018 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 }
1020
1021 // Test that we properly send RTP without SRTP from a thread.
1022 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001023 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 EXPECT_TRUE(SendInitiate());
1025 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001026 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1027 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001028 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001029 WaitForThreads(involved_threads);
1030 EXPECT_TRUE(CheckRtp1());
1031 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(CheckNoRtp1());
1033 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 }
1035
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 // Test that the mediachannel retains its sending state after the transport
1037 // becomes non-writable.
1038 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001039 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040 EXPECT_TRUE(SendInitiate());
1041 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001042 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1043 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001044 SendRtp1();
1045 SendRtp2();
1046 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 EXPECT_TRUE(CheckRtp1());
1048 EXPECT_TRUE(CheckRtp2());
1049 EXPECT_TRUE(CheckNoRtp1());
1050 EXPECT_TRUE(CheckNoRtp2());
1051
wu@webrtc.org97077a32013-10-25 21:18:33 +00001052 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001053 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1054 fake_rtp_dtls_transport1_->SetWritable(false);
1055 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001056 SendRtp1();
1057 SendRtp2();
1058 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059 EXPECT_TRUE(CheckRtp1());
1060 EXPECT_TRUE(CheckNoRtp2());
1061
1062 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001063 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1064 fake_rtp_dtls_transport1_->SetWritable(true);
1065 });
Tommic9625f02021-05-06 22:03:19 +02001066 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001067 SendRtp1();
1068 SendRtp2();
1069 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001070 EXPECT_TRUE(CheckRtp1());
1071 EXPECT_TRUE(CheckRtp2());
1072 EXPECT_TRUE(CheckNoRtp1());
1073 EXPECT_TRUE(CheckNoRtp2());
1074
1075 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001076 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1077 bool asymmetric = true;
1078 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1079 });
Tommic9625f02021-05-06 22:03:19 +02001080 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001081
wu@webrtc.org97077a32013-10-25 21:18:33 +00001082 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 SendRtp1();
1084 SendRtp2();
1085 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(CheckRtp1());
1087 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001088 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089
1090 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001091 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001092 bool asymmetric = true;
1093 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1094 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001095 });
Tommic9625f02021-05-06 22:03:19 +02001096 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001097 SendRtp1();
1098 SendRtp2();
1099 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(CheckRtp1());
1101 EXPECT_TRUE(CheckRtp2());
1102 EXPECT_TRUE(CheckNoRtp1());
1103 EXPECT_TRUE(CheckNoRtp2());
1104 }
1105
Yves Gerey665174f2018-06-19 15:03:05 +02001106 void SendBundleToBundle(const int* pl_types,
1107 int len,
1108 bool rtcp_mux,
1109 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001110 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001112 // Only pl_type1 was added to the bundle filter for both |channel1_|
1113 // and |channel2_|.
1114 int pl_type1 = pl_types[0];
1115 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001116 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001117 if (secure)
1118 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001119 if (rtcp_mux) {
1120 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001121 }
1122 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001125
1126 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001127 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1128 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1129 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001130 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001131 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1132 EXPECT_TRUE(CheckNoRtp1());
1133 EXPECT_TRUE(CheckNoRtp2());
1134
Zhi Huang365381f2018-04-13 16:44:34 -07001135 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1136 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001137 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001138 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1139 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 }
1141
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 void TestSetContentFailure() {
1143 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144
Peter Thatchera6d24442015-07-09 21:26:36 -07001145 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001146 std::unique_ptr<typename T::Content> content(
1147 CreateMediaContentWithStream(1));
1148
Tommic9625f02021-05-06 22:03:19 +02001149 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001150 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001151 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001152 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001153 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154
Tommic9625f02021-05-06 22:03:19 +02001155 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001156 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001157 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001158
Tommic9625f02021-05-06 22:03:19 +02001159 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001160 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001161 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 }
1163
1164 void TestSendTwoOffers() {
1165 CreateChannels(0, 0);
1166
Peter Thatchera6d24442015-07-09 21:26:36 -07001167 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001168 std::unique_ptr<typename T::Content> content1(
1169 CreateMediaContentWithStream(1));
1170 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001171 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001172 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173
Steve Anton18ee1d52017-09-11 11:32:35 -07001174 std::unique_ptr<typename T::Content> content2(
1175 CreateMediaContentWithStream(2));
1176 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001177 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001178 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1179 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 }
1181
1182 void TestReceiveTwoOffers() {
1183 CreateChannels(0, 0);
1184
Peter Thatchera6d24442015-07-09 21:26:36 -07001185 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001186 std::unique_ptr<typename T::Content> content1(
1187 CreateMediaContentWithStream(1));
1188 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001189 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001190 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191
Steve Anton18ee1d52017-09-11 11:32:35 -07001192 std::unique_ptr<typename T::Content> content2(
1193 CreateMediaContentWithStream(2));
1194 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001195 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001196 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1197 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198 }
1199
1200 void TestSendPrAnswer() {
1201 CreateChannels(0, 0);
1202
Peter Thatchera6d24442015-07-09 21:26:36 -07001203 std::string err;
1204 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001205 std::unique_ptr<typename T::Content> content1(
1206 CreateMediaContentWithStream(1));
1207 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001208 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001209 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210
Peter Thatchera6d24442015-07-09 21:26:36 -07001211 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001212 std::unique_ptr<typename T::Content> content2(
1213 CreateMediaContentWithStream(2));
1214 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001215 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001216 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1217 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218
Peter Thatchera6d24442015-07-09 21:26:36 -07001219 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001220 std::unique_ptr<typename T::Content> content3(
1221 CreateMediaContentWithStream(3));
1222 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001223 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001224 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1225 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1226 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 }
1228
1229 void TestReceivePrAnswer() {
1230 CreateChannels(0, 0);
1231
Peter Thatchera6d24442015-07-09 21:26:36 -07001232 std::string err;
1233 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001234 std::unique_ptr<typename T::Content> content1(
1235 CreateMediaContentWithStream(1));
1236 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001237 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001238 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239
Peter Thatchera6d24442015-07-09 21:26:36 -07001240 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001241 std::unique_ptr<typename T::Content> content2(
1242 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001243 EXPECT_TRUE(
1244 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001245 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1246 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247
Peter Thatchera6d24442015-07-09 21:26:36 -07001248 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001249 std::unique_ptr<typename T::Content> content3(
1250 CreateMediaContentWithStream(3));
1251 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001252 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001253 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1254 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1255 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256 }
1257
zstein56162b92017-04-24 16:54:35 -07001258 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001259 CreateChannels(0, 0);
Tommic9625f02021-05-06 22:03:19 +02001260 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001261
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001262 network_thread_->PostTask(
1263 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001264 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001265 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001267 network_thread_->PostTask(
1268 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001269 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001270 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 }
1272
skvladdc1c62c2016-03-16 19:07:43 -07001273 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1274 typename T::Content content;
1275 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1276 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001277 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001278 }
1279
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001280 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001281 webrtc::RtpParameters parameters;
1282 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001283 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001284 parameters.encodings.push_back(encoding);
1285 return parameters;
1286 }
1287
1288 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001289 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001290 EXPECT_EQ(1UL, parameters.encodings.size());
1291 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1292 }
1293
1294 void DefaultMaxBitrateIsUnlimited() {
1295 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001296 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1297 SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02001298 EXPECT_EQ(media_channel1()->max_bps(), -1);
1299 VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001300 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001301 }
1302
Zhi Huange830e682018-03-30 10:48:35 -07001303 // Test that when a channel gets new RtpTransport with a call to
1304 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1305 // with the options on the new one.
1306
Steve Anton8a63f782017-10-23 13:08:53 -07001307 // For example, audio and video may use separate socket options, but initially
1308 // be unbundled, then later become bundled. When this happens, their preferred
1309 // socket options should be merged to the underlying transport they share.
1310 void SocketOptionsMergedOnSetTransport() {
1311 constexpr int kSndBufSize = 4000;
1312 constexpr int kRcvBufSize = 8000;
1313
Zhi Huange830e682018-03-30 10:48:35 -07001314 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001315
Zhi Huange830e682018-03-30 10:48:35 -07001316 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001317 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001318
Niels Möller92430882021-03-18 10:03:19 +01001319 bool rcv_success, send_success;
1320 int rcv_buf, send_buf;
1321 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tommic9625f02021-05-06 22:03:19 +02001322 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1323 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1324 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1325 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001326 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001327 send_success = fake_rtp_dtls_transport2_->GetOption(
1328 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1329 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1330 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1331 });
1332
1333 ASSERT_TRUE(send_success);
1334 EXPECT_EQ(kSndBufSize, send_buf);
1335 ASSERT_TRUE(rcv_success);
1336 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001337 }
1338
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001339 void CreateSimulcastContent(const std::vector<std::string>& rids,
1340 typename T::Content* content) {
1341 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001342 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001343 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1344 }
1345
1346 StreamParams stream;
1347 stream.set_rids(rid_descriptions);
1348 CreateContent(0, kPcmuCodec, kH264Codec, content);
1349 // This is for unified plan, so there can be only one StreamParams.
1350 content->mutable_streams().clear();
1351 content->AddStream(stream);
1352 }
1353
1354 void VerifySimulcastStreamParams(const StreamParams& expected,
1355 const typename T::Channel* channel) {
1356 const std::vector<StreamParams>& streams = channel->local_streams();
1357 ASSERT_EQ(1u, streams.size());
1358 const StreamParams& result = streams[0];
1359 EXPECT_EQ(expected.rids(), result.rids());
1360 EXPECT_TRUE(result.has_ssrcs());
1361 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1362 std::vector<uint32_t> primary_ssrcs;
1363 result.GetPrimarySsrcs(&primary_ssrcs);
1364 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1365 }
1366
1367 void TestUpdateLocalStreamsWithSimulcast() {
1368 CreateChannels(0, 0);
1369 typename T::Content content1, content2, content3;
1370 CreateSimulcastContent({"f", "h", "q"}, &content1);
1371 EXPECT_TRUE(
1372 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1373 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1374 StreamParams stream1 = channel1_->local_streams()[0];
1375
1376 // Create a similar offer. SetLocalContent should not remove and add.
1377 CreateSimulcastContent({"f", "h", "q"}, &content2);
1378 EXPECT_TRUE(
1379 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1380 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1381 StreamParams stream2 = channel1_->local_streams()[0];
1382 // Check that the streams are identical (SSRCs didn't change).
1383 EXPECT_EQ(stream1, stream2);
1384
1385 // Create third offer that has same RIDs in different order.
1386 CreateSimulcastContent({"f", "q", "h"}, &content3);
1387 EXPECT_TRUE(
1388 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1389 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1390 }
1391
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001392 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001393 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1394 static void ProcessThreadQueue(rtc::Thread* thread) {
1395 RTC_DCHECK(thread->IsCurrent());
1396 while (!thread->empty()) {
1397 thread->ProcessMessages(0);
1398 }
1399 }
Tommi1959f8f2021-04-26 10:20:19 +02001400 static void FlushCurrentThread() {
1401 rtc::Thread::Current()->ProcessMessages(0);
1402 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001403 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1404 // |threads| and current thread post packets to network thread.
1405 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001406 thread->Invoke<void>(RTC_FROM_HERE,
1407 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001408 }
1409 ProcessThreadQueue(rtc::Thread::Current());
1410 // Network thread move them around and post back to worker = current thread.
1411 if (!network_thread_->IsCurrent()) {
1412 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001413 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001414 }
1415 // Worker thread = current Thread process received messages.
1416 ProcessThreadQueue(rtc::Thread::Current());
1417 }
Tommic9625f02021-05-06 22:03:19 +02001418
1419 typename T::MediaChannel* media_channel1() {
1420 RTC_DCHECK(channel1_);
1421 RTC_DCHECK(channel1_->media_channel());
1422 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1423 }
1424
1425 typename T::MediaChannel* media_channel2() {
1426 RTC_DCHECK(channel2_);
1427 RTC_DCHECK(channel2_->media_channel());
1428 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1429 }
1430
Peter Boström34fbfff2015-09-24 19:20:30 +02001431 // TODO(pbos): Remove playout from all media channels and let renderers mute
1432 // themselves.
1433 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001434 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1435 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001436 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1437 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001438 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1439 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1440 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1441 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1442 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1443 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1444 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1445 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001446 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1447 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1448 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001449 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001450 std::unique_ptr<typename T::Channel> channel1_;
1451 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 typename T::Content local_media_content1_;
1453 typename T::Content local_media_content2_;
1454 typename T::Content remote_media_content1_;
1455 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001457 rtc::Buffer rtp_packet_;
1458 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001459 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001460 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461};
1462
Yves Gerey665174f2018-06-19 15:03:05 +02001463template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001464std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1465 rtc::Thread* worker_thread,
1466 rtc::Thread* network_thread,
1467 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1468 webrtc::RtpTransportInternal* rtp_transport,
1469 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001470 rtc::Thread* signaling_thread = rtc::Thread::Current();
1471 auto channel = std::make_unique<cricket::VoiceChannel>(
1472 worker_thread, network_thread, signaling_thread, std::move(ch),
1473 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1474 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001475 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001476 return channel;
1477}
1478
1479template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480void ChannelTest<VoiceTraits>::CreateContent(
1481 int flags,
1482 const cricket::AudioCodec& audio_codec,
1483 const cricket::VideoCodec& video_codec,
1484 cricket::AudioContentDescription* audio) {
1485 audio->AddCodec(audio_codec);
1486 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487}
1488
Yves Gerey665174f2018-06-19 15:03:05 +02001489template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490void ChannelTest<VoiceTraits>::CopyContent(
1491 const cricket::AudioContentDescription& source,
1492 cricket::AudioContentDescription* audio) {
1493 *audio = source;
1494}
1495
Yves Gerey665174f2018-06-19 15:03:05 +02001496template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1498 const cricket::AudioCodec& c2) {
1499 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001500 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501}
1502
Peter Boström0c4e06b2015-10-07 12:23:21 +02001503template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001505 uint32_t ssrc,
1506 int flags,
1507 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508 audio->AddLegacyStream(ssrc);
1509}
1510
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512 public:
solenberg1dd98f32015-09-10 01:57:14 -07001513 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001514 VoiceChannelSingleThreadTest()
1515 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1516};
1517
1518class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1519 public:
1520 typedef ChannelTest<VoiceTraits> Base;
1521 VoiceChannelDoubleThreadTest()
1522 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523};
1524
jbauch5869f502017-06-29 12:31:36 -07001525class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001526 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001527 public:
1528 typedef ChannelTest<VoiceTraits> Base;
1529 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001530 : Base(true,
1531 kPcmuFrameWithExtensions,
1532 kRtcpReport,
1533 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001534};
1535
1536class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001537 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001538 public:
1539 typedef ChannelTest<VoiceTraits> Base;
1540 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001541 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1542 }
jbauch5869f502017-06-29 12:31:36 -07001543};
1544
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001546template <>
Steve Anton8699a322017-11-06 15:53:33 -08001547std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001548 rtc::Thread* worker_thread,
1549 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001550 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001551 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001552 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001553 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001554 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001555 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001556 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1557 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001558 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559 return channel;
1560}
1561
Yves Gerey665174f2018-06-19 15:03:05 +02001562template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563void ChannelTest<VideoTraits>::CreateContent(
1564 int flags,
1565 const cricket::AudioCodec& audio_codec,
1566 const cricket::VideoCodec& video_codec,
1567 cricket::VideoContentDescription* video) {
1568 video->AddCodec(video_codec);
1569 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570}
1571
Yves Gerey665174f2018-06-19 15:03:05 +02001572template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573void ChannelTest<VideoTraits>::CopyContent(
1574 const cricket::VideoContentDescription& source,
1575 cricket::VideoContentDescription* video) {
1576 *video = source;
1577}
1578
Yves Gerey665174f2018-06-19 15:03:05 +02001579template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1581 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001582 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583}
1584
Peter Boström0c4e06b2015-10-07 12:23:21 +02001585template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001587 uint32_t ssrc,
1588 int flags,
1589 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 video->AddLegacyStream(ssrc);
1591}
1592
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001593class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594 public:
solenberg1dd98f32015-09-10 01:57:14 -07001595 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001596 VideoChannelSingleThreadTest()
1597 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598};
1599
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001600class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1601 public:
1602 typedef ChannelTest<VideoTraits> Base;
1603 VideoChannelDoubleThreadTest()
1604 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1605};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001607TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001609 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1610 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611}
1612
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001613TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1614 Base::TestDeinit();
1615}
1616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001617TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 Base::TestSetContents();
1619}
1620
Johannes Kron9190b822018-10-29 11:22:05 +01001621TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1622 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1623}
1624
1625TEST_F(VoiceChannelSingleThreadTest,
1626 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1627 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1628}
1629
1630TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1631 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1632}
1633
1634TEST_F(VoiceChannelSingleThreadTest,
1635 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1636 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 Base::TestSetContentsNullOffer();
1641}
1642
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 Base::TestSetContentsRtcpMux();
1645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 Base::TestSetContentsRtcpMux();
1649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 Base::TestChangeStreamParamsInContent();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::TestPlayoutAndSendingStates();
1657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 Base::TestMediaContentDirection();
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001664 Base::TestNetworkRouteChanges();
1665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 Base::TestCallSetup();
1669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 Base::TestCallTeardownRtcpMux();
1673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 Base::SendRtpToRtp();
1677}
1678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001680 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681}
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001684 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692 Base::SendRtpToRtpOnThread();
1693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 Base::SendWithWritabilityLoss();
1697}
1698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001699TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 Base::TestSetContentFailure();
1701}
1702
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 Base::TestSendTwoOffers();
1705}
1706
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001707TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708 Base::TestReceiveTwoOffers();
1709}
1710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 Base::TestSendPrAnswer();
1713}
1714
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001715TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 Base::TestReceivePrAnswer();
1717}
1718
zstein56162b92017-04-24 16:54:35 -07001719TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1720 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721}
1722
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001723TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001724 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725}
1726
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001727TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001728 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001729}
1730
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001731TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001732 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001733}
1734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001735TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001736 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737}
1738
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001739TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001740 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001741}
1742
Steve Anton8a63f782017-10-23 13:08:53 -07001743TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1744 Base::SocketOptionsMergedOnSetTransport();
1745}
1746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001747// VoiceChannelDoubleThreadTest
1748TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001750 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1751 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752}
1753
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001754TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1755 Base::TestDeinit();
1756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 Base::TestSetContents();
1760}
1761
Johannes Kron9190b822018-10-29 11:22:05 +01001762TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1763 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1764}
1765
1766TEST_F(VoiceChannelDoubleThreadTest,
1767 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1768 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1769}
1770
1771TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1772 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1773}
1774
1775TEST_F(VoiceChannelDoubleThreadTest,
1776 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1777 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1778}
1779
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 Base::TestSetContentsNullOffer();
1782}
1783
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001784TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 Base::TestSetContentsRtcpMux();
1786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 Base::TestSetContentsRtcpMux();
1790}
1791
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001792TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793 Base::TestChangeStreamParamsInContent();
1794}
1795
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 Base::TestPlayoutAndSendingStates();
1798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1801 Base::TestMediaContentDirection();
1802}
1803
1804TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1805 Base::TestNetworkRouteChanges();
1806}
1807
1808TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1809 Base::TestCallSetup();
1810}
1811
1812TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1813 Base::TestCallTeardownRtcpMux();
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1817 Base::SendRtpToRtp();
1818}
1819
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001820TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001821 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001822}
1823
1824TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001825 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001826}
1827
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001828TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1829 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1830}
1831
1832TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1833 Base::SendRtpToRtpOnThread();
1834}
1835
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001836TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1837 Base::SendWithWritabilityLoss();
1838}
1839
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001840TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1841 Base::TestSetContentFailure();
1842}
1843
1844TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1845 Base::TestSendTwoOffers();
1846}
1847
1848TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1849 Base::TestReceiveTwoOffers();
1850}
1851
1852TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1853 Base::TestSendPrAnswer();
1854}
1855
1856TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1857 Base::TestReceivePrAnswer();
1858}
1859
zstein56162b92017-04-24 16:54:35 -07001860TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1861 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001862}
1863
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001864TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1865 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1866}
1867
1868TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1869 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1870}
1871
1872TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1873 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1874}
1875
1876TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1877 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1878}
1879
1880TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1881 Base::DefaultMaxBitrateIsUnlimited();
1882}
1883
Steve Anton8a63f782017-10-23 13:08:53 -07001884TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1885 Base::SocketOptionsMergedOnSetTransport();
1886}
1887
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001888// VideoChannelSingleThreadTest
1889TEST_F(VideoChannelSingleThreadTest, TestInit) {
1890 Base::TestInit();
1891}
1892
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001893TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1894 Base::TestDeinit();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1898 Base::TestSetContents();
1899}
1900
Johannes Kron9190b822018-10-29 11:22:05 +01001901TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1902 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1903}
1904
1905TEST_F(VideoChannelSingleThreadTest,
1906 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1907 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1908}
1909
1910TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1911 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1912}
1913
1914TEST_F(VideoChannelSingleThreadTest,
1915 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1916 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1920 Base::TestSetContentsNullOffer();
1921}
1922
1923TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1924 Base::TestSetContentsRtcpMux();
1925}
1926
1927TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1928 Base::TestSetContentsRtcpMux();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1932 Base::TestChangeStreamParamsInContent();
1933}
1934
1935TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1936 Base::TestPlayoutAndSendingStates();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940 Base::TestMediaContentDirection();
1941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001944 Base::TestNetworkRouteChanges();
1945}
1946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 Base::TestCallSetup();
1949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 Base::TestCallTeardownRtcpMux();
1953}
1954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 Base::SendRtpToRtp();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001960 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961}
1962
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001964 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965}
1966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1969}
1970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 Base::SendRtpToRtpOnThread();
1973}
1974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 Base::SendWithWritabilityLoss();
1977}
1978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 Base::TestSetContentFailure();
1981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 Base::TestSendTwoOffers();
1985}
1986
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001987TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988 Base::TestReceiveTwoOffers();
1989}
1990
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992 Base::TestSendPrAnswer();
1993}
1994
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001995TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996 Base::TestReceivePrAnswer();
1997}
1998
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001999TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002000 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001}
2002
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002003TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002004 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002005}
2006
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002007TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002008 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002009}
2010
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002011TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002012 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013}
2014
zstein56162b92017-04-24 16:54:35 -07002015TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2016 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017}
2018
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002019TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002020 Base::DefaultMaxBitrateIsUnlimited();
2021}
2022
Steve Anton8a63f782017-10-23 13:08:53 -07002023TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2024 Base::SocketOptionsMergedOnSetTransport();
2025}
2026
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002027TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2028 Base::TestUpdateLocalStreamsWithSimulcast();
2029}
2030
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002031TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2032 const cricket::VideoCodec kVp8Codec(97, "VP8");
2033 cricket::VideoCodec vp9_codec(98, "VP9");
2034 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2035 cricket::VideoContentDescription video;
2036 video.set_codecs({kVp8Codec, vp9_codec});
2037
2038 CreateChannels(0, 0);
2039
2040 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002041 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2042 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2043 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2044 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2045 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2046 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002047 cricket::kPacketizationParamRaw);
2048}
2049
2050TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2051 const cricket::VideoCodec kVp8Codec(97, "VP8");
2052 cricket::VideoCodec vp9_codec(98, "VP9");
2053 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2054 cricket::VideoContentDescription video;
2055 video.set_codecs({kVp8Codec, vp9_codec});
2056
2057 CreateChannels(0, 0);
2058
2059 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002060 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2061 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2062 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2063 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2064 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2065 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002066 cricket::kPacketizationParamRaw);
2067}
2068
2069TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2070 const cricket::VideoCodec kVp8Codec(97, "VP8");
2071 cricket::VideoCodec vp9_codec(98, "VP9");
2072 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2073 cricket::VideoContentDescription video;
2074 video.set_codecs({kVp8Codec, vp9_codec});
2075
2076 CreateChannels(0, 0);
2077
2078 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2079 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002080 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2081 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2082 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2083 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2084 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002085 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002086 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2087 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2088 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2089 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2090 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002091 cricket::kPacketizationParamRaw);
2092}
2093
2094TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2095 const cricket::VideoCodec kLocalCodec(98, "VP8");
2096 cricket::VideoCodec remote_codec(99, "VP8");
2097 remote_codec.packetization = cricket::kPacketizationParamRaw;
2098 cricket::VideoContentDescription local_video;
2099 local_video.set_codecs({kLocalCodec});
2100 cricket::VideoContentDescription remote_video;
2101 remote_video.set_codecs({remote_codec});
2102
2103 CreateChannels(0, 0);
2104
2105 EXPECT_TRUE(
2106 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2107 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002108 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2109 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2110 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2111 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002112}
2113
2114TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2115 cricket::VideoCodec local_codec(98, "VP8");
2116 local_codec.packetization = cricket::kPacketizationParamRaw;
2117 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2118 cricket::VideoContentDescription local_video;
2119 local_video.set_codecs({local_codec});
2120 cricket::VideoContentDescription remote_video;
2121 remote_video.set_codecs({kRemoteCodec});
2122
2123 CreateChannels(0, 0);
2124
2125 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2126 EXPECT_TRUE(
2127 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002128 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2129 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2130 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2131 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002132}
2133
2134TEST_F(VideoChannelSingleThreadTest,
2135 TestSetRemoteAnswerWithInvalidPacketization) {
2136 cricket::VideoCodec local_codec(98, "VP8");
2137 local_codec.packetization = cricket::kPacketizationParamRaw;
2138 cricket::VideoCodec remote_codec(99, "VP8");
2139 remote_codec.packetization = "unknownpacketizationattributevalue";
2140 cricket::VideoContentDescription local_video;
2141 local_video.set_codecs({local_codec});
2142 cricket::VideoContentDescription remote_video;
2143 remote_video.set_codecs({remote_codec});
2144
2145 CreateChannels(0, 0);
2146
2147 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2148 EXPECT_FALSE(
2149 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002150 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2151 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002152 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002153 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002154}
2155
2156TEST_F(VideoChannelSingleThreadTest,
2157 TestSetLocalAnswerWithInvalidPacketization) {
2158 cricket::VideoCodec local_codec(98, "VP8");
2159 local_codec.packetization = cricket::kPacketizationParamRaw;
2160 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2161 cricket::VideoContentDescription local_video;
2162 local_video.set_codecs({local_codec});
2163 cricket::VideoContentDescription remote_video;
2164 remote_video.set_codecs({kRemoteCodec});
2165
2166 CreateChannels(0, 0);
2167
2168 EXPECT_TRUE(
2169 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2170 EXPECT_FALSE(
2171 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002172 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2173 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2174 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002175}
2176
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002177// VideoChannelDoubleThreadTest
2178TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2179 Base::TestInit();
2180}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002182TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2183 Base::TestDeinit();
2184}
2185
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002186TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2187 Base::TestSetContents();
2188}
2189
Johannes Kron9190b822018-10-29 11:22:05 +01002190TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2191 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2192}
2193
2194TEST_F(VideoChannelDoubleThreadTest,
2195 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2196 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2197}
2198
2199TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2200 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2201}
2202
2203TEST_F(VideoChannelDoubleThreadTest,
2204 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2205 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2206}
2207
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002208TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2209 Base::TestSetContentsNullOffer();
2210}
2211
2212TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2213 Base::TestSetContentsRtcpMux();
2214}
2215
2216TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2217 Base::TestSetContentsRtcpMux();
2218}
2219
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002220TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2221 Base::TestChangeStreamParamsInContent();
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2225 Base::TestPlayoutAndSendingStates();
2226}
2227
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002228TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2229 Base::TestMediaContentDirection();
2230}
2231
2232TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2233 Base::TestNetworkRouteChanges();
2234}
2235
2236TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2237 Base::TestCallSetup();
2238}
2239
2240TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2241 Base::TestCallTeardownRtcpMux();
2242}
2243
2244TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2245 Base::SendRtpToRtp();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002249 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002250}
2251
2252TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002253 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254}
2255
2256TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2257 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2258}
2259
2260TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2261 Base::SendRtpToRtpOnThread();
2262}
2263
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002264TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2265 Base::SendWithWritabilityLoss();
2266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2269 Base::TestSetContentFailure();
2270}
2271
2272TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2273 Base::TestSendTwoOffers();
2274}
2275
2276TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2277 Base::TestReceiveTwoOffers();
2278}
2279
2280TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2281 Base::TestSendPrAnswer();
2282}
2283
2284TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2285 Base::TestReceivePrAnswer();
2286}
2287
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002288TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2289 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2290}
2291
2292TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2293 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2294}
2295
2296TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2297 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2298}
2299
2300TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2301 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2302}
2303
zstein56162b92017-04-24 16:54:35 -07002304TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2305 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306}
2307
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2309 Base::DefaultMaxBitrateIsUnlimited();
2310}
2311
Steve Anton8a63f782017-10-23 13:08:53 -07002312TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2313 Base::SocketOptionsMergedOnSetTransport();
2314}
2315
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317// TODO(pthatcher): TestSetReceiver?