blob: 42497b86df405a46f2a934ee425377faeec8ae02 [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_) {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100129 network_thread_->Invoke<void>(RTC_FROM_HERE, [this]() {
130 network_thread_safety_->SetNotAlive();
131 DeinitChannels();
132 });
Tommic9625f02021-05-06 22:03:19 +0200133 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200134 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200137 CreateChannels(std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200138 nullptr, typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200139 std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200140 nullptr, typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200141 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Steve Anton8699a322017-11-06 15:53:33 -0800143 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
144 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200145 int flags1,
146 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200147 RTC_DCHECK(!channel1_);
148 RTC_DCHECK(!channel2_);
149
deadbeeff5346592017-01-24 21:51:21 -0800150 // Network thread is started in CreateChannels, to allow the test to
151 // configure a fake clock before any threads are spawned and attempt to
152 // access the time.
153 if (network_thread_keeper_) {
154 network_thread_keeper_->Start();
155 }
Zhi Huange830e682018-03-30 10:48:35 -0700156
deadbeeff5346592017-01-24 21:51:21 -0800157 // Make sure if using raw packet transports, they're used for both
158 // channels.
159 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200160 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeeff5346592017-01-24 21:51:21 -0800161 // Based on flags, create fake DTLS or raw packet transports.
162 if (flags1 & RAW_PACKET_TRANSPORT) {
163 fake_rtp_packet_transport1_.reset(
164 new rtc::FakePacketTransport("channel1_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700165 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800166 fake_rtcp_packet_transport1_.reset(
167 new rtc::FakePacketTransport("channel1_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800168 }
169 } else {
170 // Confirmed to work with KT_RSA and KT_ECDSA.
171 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100172 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700173 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800174 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100175 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
176 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800177 }
178 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100179 auto cert1 = rtc::RTCCertificate::Create(
180 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800181 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
182 if (fake_rtcp_dtls_transport1_) {
183 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
184 }
185 }
186 }
187 // Based on flags, create fake DTLS or raw packet transports.
188 if (flags2 & RAW_PACKET_TRANSPORT) {
189 fake_rtp_packet_transport2_.reset(
190 new rtc::FakePacketTransport("channel2_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700191 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800192 fake_rtcp_packet_transport2_.reset(
193 new rtc::FakePacketTransport("channel2_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800194 }
195 } else {
196 // Confirmed to work with KT_RSA and KT_ECDSA.
197 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100198 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700199 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800200 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100201 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
202 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800203 }
204 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100205 auto cert2 = rtc::RTCCertificate::Create(
206 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800207 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
208 if (fake_rtcp_dtls_transport2_) {
209 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
210 }
211 }
212 }
Zhi Huange830e682018-03-30 10:48:35 -0700213 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
214 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
215 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
216 flags1);
217 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
218 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
219 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
220 flags2);
221
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800222 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
223 rtp_transport1_.get(), flags1);
224 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
225 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200226 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
227 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228 CopyContent(local_media_content1_, &remote_media_content1_);
229 CopyContent(local_media_content2_, &remote_media_content2_);
230
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 // Add stream information (SSRC) to the local content but not to the remote
232 // content. This means that we per default know the SSRC of what we send but
233 // not what we receive.
234 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
235 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
236
237 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
238 if (flags1 & SSRC_MUX) {
239 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
240 }
241 if (flags2 & SSRC_MUX) {
242 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
243 }
244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200246 rtc::Thread* worker_thread,
247 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800248 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700249 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200250 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000251
Zhi Huange830e682018-03-30 10:48:35 -0700252 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
253 rtc::PacketTransportInternal* rtp_packet_transport,
254 rtc::PacketTransportInternal* rtcp_packet_transport,
255 DtlsTransportInternal* rtp_dtls_transport,
256 DtlsTransportInternal* rtcp_dtls_transport,
257 int flags) {
258 if (flags & RTCP_MUX) {
259 rtcp_packet_transport = nullptr;
260 rtcp_dtls_transport = nullptr;
261 }
262
263 if (flags & DTLS) {
264 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
265 } else {
266 if (flags & RAW_PACKET_TRANSPORT) {
267 return CreateUnencryptedTransport(rtp_packet_transport,
268 rtcp_packet_transport);
269 } else {
270 return CreateUnencryptedTransport(rtp_dtls_transport,
271 rtcp_dtls_transport);
272 }
273 }
274 }
275
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100276 // Unininitializes the channels on the network thread.
277 void DeinitChannels() {
278 if (!channel1_ && !channel2_)
279 return;
280 network_thread_->Invoke<void>(RTC_FROM_HERE, [this]() {
281 if (channel1_) {
282 RTC_DCHECK_RUN_ON(channel1_->network_thread());
283 channel1_->Deinit_n();
284 }
285 if (channel2_) {
286 RTC_DCHECK_RUN_ON(channel2_->network_thread());
287 channel2_->Deinit_n();
288 }
289 });
290 }
291
Zhi Huange830e682018-03-30 10:48:35 -0700292 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
293 rtc::PacketTransportInternal* rtp_packet_transport,
294 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200295 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200296 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700297
Niels Möller92430882021-03-18 10:03:19 +0100298 network_thread_->Invoke<void>(
299 RTC_FROM_HERE,
300 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
301 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
302 if (rtcp_packet_transport) {
303 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
304 }
305 });
Zhi Huange830e682018-03-30 10:48:35 -0700306 return rtp_transport;
307 }
308
309 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
310 cricket::DtlsTransportInternal* rtp_dtls_transport,
311 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200312 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700313 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700314
Niels Möller92430882021-03-18 10:03:19 +0100315 network_thread_->Invoke<void>(
316 RTC_FROM_HERE,
317 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
318 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
319 rtcp_dtls_transport);
320 });
Zhi Huange830e682018-03-30 10:48:35 -0700321 return dtls_srtp_transport;
322 }
323
deadbeeff5346592017-01-24 21:51:21 -0800324 void ConnectFakeTransports() {
325 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
326 bool asymmetric = false;
327 // Depending on test flags, could be using DTLS or raw packet transport.
328 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
329 fake_rtp_dtls_transport1_->SetDestination(
330 fake_rtp_dtls_transport2_.get(), asymmetric);
331 }
332 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
333 fake_rtcp_dtls_transport1_->SetDestination(
334 fake_rtcp_dtls_transport2_.get(), asymmetric);
335 }
336 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
337 fake_rtp_packet_transport1_->SetDestination(
338 fake_rtp_packet_transport2_.get(), asymmetric);
339 }
340 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
341 fake_rtcp_packet_transport1_->SetDestination(
342 fake_rtcp_packet_transport2_.get(), asymmetric);
343 }
344 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800345 // The transport becoming writable will asynchronously update the send state
346 // on the worker thread; since this test uses the main thread as the worker
347 // thread, we must process the message queue for this to occur.
348 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800349 }
350
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 bool SendInitiate() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000352 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000354 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 if (result) {
356 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200357 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000359 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800361 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000363 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 }
366 return result;
367 }
368
369 bool SendAccept() {
370 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200371 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000372 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000373 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000374 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 }
376
377 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000378 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000379 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000380 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 if (result) {
382 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000383 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000384 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 }
386 return result;
387 }
388
389 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000390 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000392 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000393 if (result) {
394 channel2_->Enable(true);
395 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000396 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800397 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 }
399 return result;
400 }
401
402 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000403 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000404 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000405 SdpType::kAnswer, err);
406 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000407 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000408 SdpType::kAnswer, err);
409 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 return result;
411 }
412
Tommic9625f02021-05-06 22:03:19 +0200413 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
414 network_thread_->PostTask(webrtc::ToQueuedTask(
415 network_thread_safety_, [media_channel, data = std::move(data)]() {
416 media_channel->SendRtp(data.data(), data.size(),
417 rtc::PacketOptions());
418 }));
419 }
420
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200422 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
Tommic9625f02021-05-06 22:03:19 +0200424
425 void SendRtp1(rtc::Buffer data) {
426 SendRtp(media_channel1(), std::move(data));
427 }
428
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200430 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Tommic9625f02021-05-06 22:03:19 +0200432
433 void SendRtp2(rtc::Buffer data) {
434 SendRtp(media_channel2(), std::move(data));
435 }
436
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200438 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200439 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200442 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 bool CheckRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200446 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200449 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200452 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200453 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200454 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200456 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200457 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200458 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
461 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200463 rtc::SetBE32(data.data() + 8, ssrc);
464 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000465 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000467 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 return data;
469 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470
Tommic9625f02021-05-06 22:03:19 +0200471 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
472 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473
474 void CreateContent(int flags,
475 const cricket::AudioCodec& audio_codec,
476 const cricket::VideoCodec& video_codec,
477 typename T::Content* content) {
478 // overridden in specialized classes
479 }
480 void CopyContent(const typename T::Content& source,
481 typename T::Content* content) {
482 // overridden in specialized classes
483 }
484
Steve Anton18ee1d52017-09-11 11:32:35 -0700485 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700487 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
488 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700489 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700490 AddLegacyStreamInContent(ssrc, 0, content);
491 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492 }
493
ossu292d6582016-03-17 02:31:13 -0700494 // Will manage the lifetime of a CallThread, making sure it's
495 // destroyed before this object goes out of scope.
496 class ScopedCallThread {
497 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200498 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100499 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100500 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700501 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100502 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700503 }
504
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200505 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700506
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200507 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700508
509 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200510 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700511 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
514 return false; // overridden in specialized classes
515 }
516
Honghai Zhangcc411c02016-03-29 17:27:21 -0700517 cricket::CandidatePairInterface* last_selected_candidate_pair() {
518 return last_selected_candidate_pair_;
519 }
520
Peter Boström0c4e06b2015-10-07 12:23:21 +0200521 void AddLegacyStreamInContent(uint32_t ssrc,
522 int flags,
523 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524 // Base implementation.
525 }
526
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200527 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200528 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200529 // network thread, which callers need to factor in.
530 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
531 RTC_DCHECK(channel.get());
532 return network_thread_->Invoke<bool>(
533 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
534 }
535
536 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
537 // returns true.
538 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
539 RTC_DCHECK(channel.get());
540 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
541 return channel->rtp_transport() &&
542 channel->rtp_transport()->rtcp_mux_enabled();
543 });
544 }
545
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 // Tests that can be used by derived classes.
547
548 // Basic sanity check.
549 void TestInit() {
550 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200551 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200552 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200553 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200554 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200555 }
Tommic9625f02021-05-06 22:03:19 +0200556 EXPECT_TRUE(media_channel1()->codecs().empty());
557 EXPECT_TRUE(media_channel1()->recv_streams().empty());
558 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 }
560
561 // Test that SetLocalContent and SetRemoteContent properly configure
562 // the codecs.
563 void TestSetContents() {
564 CreateChannels(0, 0);
565 typename T::Content content;
566 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000567 std::string err;
568 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200569 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000570 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200571 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200572 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200573 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 }
575
Johannes Kron9190b822018-10-29 11:22:05 +0100576 // Test that SetLocalContent and SetRemoteContent properly configure
577 // extmap-allow-mixed.
578 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
579 // For a caller, SetLocalContent() is called first with an offer and next
580 // SetRemoteContent() is called with the answer.
581 CreateChannels(0, 0);
582 typename T::Content content;
583 CreateContent(0, kPcmuCodec, kH264Codec, &content);
584 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
585 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
586 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000587 std::string err;
588 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100589 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000590 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200591 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100592 }
593 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
594 // For a callee, SetRemoteContent() is called first with an offer and next
595 // SetLocalContent() is called with the answer.
596 CreateChannels(0, 0);
597 typename T::Content content;
598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
600 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
601 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000602 std::string err;
603 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100604 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000605 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200606 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100607 }
608
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 // Test that SetLocalContent and SetRemoteContent properly deals
610 // with an empty offer.
611 void TestSetContentsNullOffer() {
612 CreateChannels(0, 0);
613 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000614 std::string err;
615 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tommic9625f02021-05-06 22:03:19 +0200617 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000618 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200619 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200620 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200621 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 }
623
624 // Test that SetLocalContent and SetRemoteContent properly set RTCP
625 // mux.
626 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800627 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 typename T::Content content;
629 CreateContent(0, kPcmuCodec, kH264Codec, &content);
630 // Both sides agree on mux. Should no longer be a separate RTCP channel.
631 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000632 std::string err;
633 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
634 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000636 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000638 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 }
640
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 // Test that SetLocalContent and SetRemoteContent properly
642 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800643 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 void TestChangeStreamParamsInContent() {
645 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 stream1.id = "stream1";
647 stream1.ssrcs.push_back(kSsrc1);
648 stream1.cname = "stream1_cname";
649
650 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 stream2.id = "stream2";
652 stream2.ssrcs.push_back(kSsrc2);
653 stream2.cname = "stream2_cname";
654
Artem Titov880fa812021-07-30 22:30:23 +0200655 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 CreateChannels(0, 0);
657 typename T::Content content1;
658 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
659 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000660 std::string err;
661 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200662 channel1_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200663 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000665 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200666 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800667 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668
669 // Channel 2 do not send anything.
670 typename T::Content content2;
671 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000672 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200673 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000674 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200675 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200676 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200678 SendCustomRtp1(kSsrc1, 0);
679 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
681
Artem Titov880fa812021-07-30 22:30:23 +0200682 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700684 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000686 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200687 ASSERT_EQ(1u, media_channel2()->send_streams().size());
688 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000690 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200691 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
692 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693
694 // Channel 1 replies but stop sending stream1.
695 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700696 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000697 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200698 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000700 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200701 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200703 SendCustomRtp2(kSsrc2, 0);
704 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
706 }
707
708 // Test that we only start playout and sending at the right times.
709 void TestPlayoutAndSendingStates() {
710 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200711 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200712 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200713 }
Tommic9625f02021-05-06 22:03:19 +0200714 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200715 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200716 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200717 }
Tommic9625f02021-05-06 22:03:19 +0200718 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200719 channel1_->Enable(true);
720 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200721 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200722 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200723 }
Tommic9625f02021-05-06 22:03:19 +0200724 EXPECT_FALSE(media_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000725 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000726 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000727 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200728 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200729 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 }
Tommic9625f02021-05-06 22:03:19 +0200731 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000732 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000733 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200734 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200735 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 }
Tommic9625f02021-05-06 22:03:19 +0200737 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000738 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000739 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200740 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200741 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 }
Tommic9625f02021-05-06 22:03:19 +0200743 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800744 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200745 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200746 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 }
Tommic9625f02021-05-06 22:03:19 +0200748 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200749 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200750 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 }
Tommic9625f02021-05-06 22:03:19 +0200752 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200753 channel2_->Enable(true);
754 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200756 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 }
Tommic9625f02021-05-06 22:03:19 +0200758 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000759 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000760 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200762 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 }
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765 }
766
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 // Test that changing the MediaContentDirection in the local and remote
768 // session description start playout and sending at the right time.
769 void TestMediaContentDirection() {
770 CreateChannels(0, 0);
771 typename T::Content content1;
772 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
773 typename T::Content content2;
774 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200775 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800776 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777
Tommi1959f8f2021-04-26 10:20:19 +0200778 channel1_->Enable(true);
779 channel2_->Enable(true);
780 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200781 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200782 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200783 }
Tommic9625f02021-05-06 22:03:19 +0200784 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200786 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 }
Tommic9625f02021-05-06 22:03:19 +0200788 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000790 std::string err;
791 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
792 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
793 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800794 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000795 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800796 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200799 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200800 }
Tommic9625f02021-05-06 22:03:19 +0200801 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200802 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200803 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200804 }
Tommic9625f02021-05-06 22:03:19 +0200805 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
Artem Titov880fa812021-07-30 22:30:23 +0200807 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800808 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000809 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800810 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000811 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812
Peter Boström34fbfff2015-09-24 19:20:30 +0200813 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200814 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200815 }
Tommic9625f02021-05-06 22:03:19 +0200816 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200817 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200818 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200819 }
Tommic9625f02021-05-06 22:03:19 +0200820 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821
Artem Titov880fa812021-07-30 22:30:23 +0200822 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800823 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000824 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
825 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826
Peter Boström34fbfff2015-09-24 19:20:30 +0200827 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200828 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200829 }
Tommic9625f02021-05-06 22:03:19 +0200830 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200831 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200832 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200833 }
Tommic9625f02021-05-06 22:03:19 +0200834 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 }
836
Honghai Zhangcc411c02016-03-29 17:27:21 -0700837 // Tests that when the transport channel signals a candidate pair change
838 // event, the media channel will receive a call on the network route change.
839 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700840 static constexpr uint16_t kLocalNetId = 1;
841 static constexpr uint16_t kRemoteNetId = 2;
842 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800843 // Ipv4(20) + UDP(8).
844 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800845 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200846
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800847 CreateChannels(DTLS, DTLS);
848 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700849
Honghai Zhangcc411c02016-03-29 17:27:21 -0700850 typename T::MediaChannel* media_channel1 =
851 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200852 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700853
Zhi Huang942bc2e2017-11-13 13:26:07 -0800854 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200855 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800856 // when creating the channel.
857 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200858 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800859 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800860 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200861 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800862 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200863 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200864 });
865 WaitForThreads();
866 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700867 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200868 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700869
eladalon05b07bb2017-08-24 07:40:16 -0700870 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800871 rtc::NetworkRoute network_route;
872 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100873 network_route.local =
874 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
875 network_route.remote =
876 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800877 network_route.last_sent_packet_id = kLastPacketId;
878 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200879 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800880 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
881
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200882 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200883 });
884 WaitForThreads();
885 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100886 EXPECT_TRUE(media_channel1->last_network_route().connected);
887 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100888 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100889 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100890 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200891 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700892 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800893 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800894 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700895 }
896
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 // Test setting up a call.
898 void TestCallSetup() {
899 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200900 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000901 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200902 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200903 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200904 }
Tommic9625f02021-05-06 22:03:19 +0200905 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200907 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200908 EXPECT_TRUE(media_channel1()->sending());
909 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200910 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200911 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200912 }
Tommic9625f02021-05-06 22:03:19 +0200913 EXPECT_TRUE(media_channel2()->sending());
914 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 }
916
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 // Send voice RTP data to the other side and ensure it gets there.
918 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700919 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 EXPECT_TRUE(SendInitiate());
921 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200922 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
923 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200924 SendRtp1();
925 SendRtp2();
926 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 EXPECT_TRUE(CheckRtp1());
928 EXPECT_TRUE(CheckRtp2());
929 EXPECT_TRUE(CheckNoRtp1());
930 EXPECT_TRUE(CheckNoRtp2());
931 }
932
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200933 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800934 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200935 EXPECT_TRUE(SendInitiate());
936 EXPECT_TRUE(SendAccept());
937 SendRtp1();
938 SendRtp2();
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100939
940 DeinitChannels();
941
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200942 // Do not wait, destroy channels.
943 channel1_.reset(nullptr);
944 channel2_.reset(nullptr);
945 }
946
Zhi Huange830e682018-03-30 10:48:35 -0700947 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
948 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200949 EXPECT_FALSE(IsSrtpActive(channel1_));
950 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200952 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200954 EXPECT_TRUE(IsSrtpActive(channel1_));
955 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200956 SendRtp1();
957 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200958 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_TRUE(CheckRtp1());
960 EXPECT_TRUE(CheckRtp2());
961 EXPECT_TRUE(CheckNoRtp1());
962 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963 }
964
965 // Test that we can send and receive early media when a provisional answer is
966 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
967 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200968 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969
Yves Gerey665174f2018-06-19 15:03:05 +0200970 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
971 EXPECT_TRUE(SendOffer());
972 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200973 EXPECT_TRUE(IsSrtpActive(channel1_));
974 EXPECT_TRUE(IsSrtpActive(channel2_));
975 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
976 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200977 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200978 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
979 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200980 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981
Yves Gerey665174f2018-06-19 15:03:05 +0200982 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200983 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
984 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200985 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986
Yves Gerey665174f2018-06-19 15:03:05 +0200987 // Complete call setup and ensure everything is still OK.
988 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200989 EXPECT_TRUE(IsSrtpActive(channel1_));
990 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200991 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200992 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
993 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200994 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200995 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 }
997
998 // Test that we properly send RTP without SRTP from a thread.
999 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001000 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 EXPECT_TRUE(SendInitiate());
1002 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001003 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1004 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001005 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001006 WaitForThreads(involved_threads);
1007 EXPECT_TRUE(CheckRtp1());
1008 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 EXPECT_TRUE(CheckNoRtp1());
1010 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011 }
1012
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 // Test that the mediachannel retains its sending state after the transport
1014 // becomes non-writable.
1015 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001016 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 EXPECT_TRUE(SendInitiate());
1018 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001019 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1020 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001021 SendRtp1();
1022 SendRtp2();
1023 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 EXPECT_TRUE(CheckRtp1());
1025 EXPECT_TRUE(CheckRtp2());
1026 EXPECT_TRUE(CheckNoRtp1());
1027 EXPECT_TRUE(CheckNoRtp2());
1028
wu@webrtc.org97077a32013-10-25 21:18:33 +00001029 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001030 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1031 fake_rtp_dtls_transport1_->SetWritable(false);
1032 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001033 SendRtp1();
1034 SendRtp2();
1035 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 EXPECT_TRUE(CheckRtp1());
1037 EXPECT_TRUE(CheckNoRtp2());
1038
1039 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001040 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1041 fake_rtp_dtls_transport1_->SetWritable(true);
1042 });
Tommic9625f02021-05-06 22:03:19 +02001043 EXPECT_TRUE(media_channel1()->sending());
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
1052 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001053 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1054 bool asymmetric = true;
1055 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1056 });
Tommic9625f02021-05-06 22:03:19 +02001057 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058
wu@webrtc.org97077a32013-10-25 21:18:33 +00001059 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001060 SendRtp1();
1061 SendRtp2();
1062 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001063 EXPECT_TRUE(CheckRtp1());
1064 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001065 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066
1067 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001068 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001069 bool asymmetric = true;
1070 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1071 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001072 });
Tommic9625f02021-05-06 22:03:19 +02001073 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001074 SendRtp1();
1075 SendRtp2();
1076 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077 EXPECT_TRUE(CheckRtp1());
1078 EXPECT_TRUE(CheckRtp2());
1079 EXPECT_TRUE(CheckNoRtp1());
1080 EXPECT_TRUE(CheckNoRtp2());
1081 }
1082
Yves Gerey665174f2018-06-19 15:03:05 +02001083 void SendBundleToBundle(const int* pl_types,
1084 int len,
1085 bool rtcp_mux,
1086 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001087 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001089 // Only pl_type1 was added to the bundle filter for both `channel1_`
1090 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001091 int pl_type1 = pl_types[0];
1092 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001093 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001094 if (secure)
1095 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001096 if (rtcp_mux) {
1097 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001098 }
1099 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001102
1103 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001104 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1105 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1106 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001107 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001108 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1109 EXPECT_TRUE(CheckNoRtp1());
1110 EXPECT_TRUE(CheckNoRtp2());
1111
Zhi Huang365381f2018-04-13 16:44:34 -07001112 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1113 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001114 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001115 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1116 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 }
1118
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 void TestSetContentFailure() {
1120 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121
Peter Thatchera6d24442015-07-09 21:26:36 -07001122 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001123 std::unique_ptr<typename T::Content> content(
1124 CreateMediaContentWithStream(1));
1125
Tommic9625f02021-05-06 22:03:19 +02001126 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001127 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001128 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001129 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001130 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131
Tommic9625f02021-05-06 22:03:19 +02001132 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001133 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001134 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001135
Tommic9625f02021-05-06 22:03:19 +02001136 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001137 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001138 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 }
1140
1141 void TestSendTwoOffers() {
1142 CreateChannels(0, 0);
1143
Peter Thatchera6d24442015-07-09 21:26:36 -07001144 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001145 std::unique_ptr<typename T::Content> content1(
1146 CreateMediaContentWithStream(1));
1147 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001148 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001149 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150
Steve Anton18ee1d52017-09-11 11:32:35 -07001151 std::unique_ptr<typename T::Content> content2(
1152 CreateMediaContentWithStream(2));
1153 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001154 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001155 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1156 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 }
1158
1159 void TestReceiveTwoOffers() {
1160 CreateChannels(0, 0);
1161
Peter Thatchera6d24442015-07-09 21:26:36 -07001162 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001163 std::unique_ptr<typename T::Content> content1(
1164 CreateMediaContentWithStream(1));
1165 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001166 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001167 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168
Steve Anton18ee1d52017-09-11 11:32:35 -07001169 std::unique_ptr<typename T::Content> content2(
1170 CreateMediaContentWithStream(2));
1171 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001172 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001173 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1174 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 }
1176
1177 void TestSendPrAnswer() {
1178 CreateChannels(0, 0);
1179
Peter Thatchera6d24442015-07-09 21:26:36 -07001180 std::string err;
1181 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001182 std::unique_ptr<typename T::Content> content1(
1183 CreateMediaContentWithStream(1));
1184 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001185 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001186 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187
Peter Thatchera6d24442015-07-09 21:26:36 -07001188 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001189 std::unique_ptr<typename T::Content> content2(
1190 CreateMediaContentWithStream(2));
1191 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001192 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001193 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1194 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195
Peter Thatchera6d24442015-07-09 21:26:36 -07001196 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001197 std::unique_ptr<typename T::Content> content3(
1198 CreateMediaContentWithStream(3));
1199 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001200 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001201 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1202 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1203 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 }
1205
1206 void TestReceivePrAnswer() {
1207 CreateChannels(0, 0);
1208
Peter Thatchera6d24442015-07-09 21:26:36 -07001209 std::string err;
1210 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001211 std::unique_ptr<typename T::Content> content1(
1212 CreateMediaContentWithStream(1));
1213 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001214 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001215 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216
Peter Thatchera6d24442015-07-09 21:26:36 -07001217 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001218 std::unique_ptr<typename T::Content> content2(
1219 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001220 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001221 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001222 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1223 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224
Peter Thatchera6d24442015-07-09 21:26:36 -07001225 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001226 std::unique_ptr<typename T::Content> content3(
1227 CreateMediaContentWithStream(3));
1228 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001229 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001230 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1231 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1232 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 }
1234
zstein56162b92017-04-24 16:54:35 -07001235 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001236 CreateChannels(0, 0);
Tommic9625f02021-05-06 22:03:19 +02001237 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001238
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001239 network_thread_->PostTask(
1240 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001241 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001242 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001243
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001244 network_thread_->PostTask(
1245 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001247 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 }
1249
skvladdc1c62c2016-03-16 19:07:43 -07001250 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1251 typename T::Content content;
1252 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1253 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001254 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001255 }
1256
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001257 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001258 webrtc::RtpParameters parameters;
1259 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001260 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001261 parameters.encodings.push_back(encoding);
1262 return parameters;
1263 }
1264
1265 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001266 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001267 EXPECT_EQ(1UL, parameters.encodings.size());
1268 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1269 }
1270
1271 void DefaultMaxBitrateIsUnlimited() {
1272 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001273 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001274 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001275 SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001276 EXPECT_EQ(media_channel1()->max_bps(), -1);
1277 VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001278 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001279 }
1280
Zhi Huange830e682018-03-30 10:48:35 -07001281 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001282 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001283 // with the options on the new one.
1284
Steve Anton8a63f782017-10-23 13:08:53 -07001285 // For example, audio and video may use separate socket options, but initially
1286 // be unbundled, then later become bundled. When this happens, their preferred
1287 // socket options should be merged to the underlying transport they share.
1288 void SocketOptionsMergedOnSetTransport() {
1289 constexpr int kSndBufSize = 4000;
1290 constexpr int kRcvBufSize = 8000;
1291
Zhi Huange830e682018-03-30 10:48:35 -07001292 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001293
Zhi Huange830e682018-03-30 10:48:35 -07001294 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001295 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001296
Niels Möller92430882021-03-18 10:03:19 +01001297 bool rcv_success, send_success;
1298 int rcv_buf, send_buf;
1299 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tommic9625f02021-05-06 22:03:19 +02001300 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1301 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1302 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1303 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001304 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001305 send_success = fake_rtp_dtls_transport2_->GetOption(
1306 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1307 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1308 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1309 });
1310
1311 ASSERT_TRUE(send_success);
1312 EXPECT_EQ(kSndBufSize, send_buf);
1313 ASSERT_TRUE(rcv_success);
1314 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001315 }
1316
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001317 void CreateSimulcastContent(const std::vector<std::string>& rids,
1318 typename T::Content* content) {
1319 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001320 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001321 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1322 }
1323
1324 StreamParams stream;
1325 stream.set_rids(rid_descriptions);
1326 CreateContent(0, kPcmuCodec, kH264Codec, content);
1327 // This is for unified plan, so there can be only one StreamParams.
1328 content->mutable_streams().clear();
1329 content->AddStream(stream);
1330 }
1331
1332 void VerifySimulcastStreamParams(const StreamParams& expected,
1333 const typename T::Channel* channel) {
1334 const std::vector<StreamParams>& streams = channel->local_streams();
1335 ASSERT_EQ(1u, streams.size());
1336 const StreamParams& result = streams[0];
1337 EXPECT_EQ(expected.rids(), result.rids());
1338 EXPECT_TRUE(result.has_ssrcs());
1339 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1340 std::vector<uint32_t> primary_ssrcs;
1341 result.GetPrimarySsrcs(&primary_ssrcs);
1342 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1343 }
1344
1345 void TestUpdateLocalStreamsWithSimulcast() {
1346 CreateChannels(0, 0);
1347 typename T::Content content1, content2, content3;
1348 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001349 std::string err;
1350 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001351 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1352 StreamParams stream1 = channel1_->local_streams()[0];
1353
1354 // Create a similar offer. SetLocalContent should not remove and add.
1355 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001356 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001357 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1358 StreamParams stream2 = channel1_->local_streams()[0];
1359 // Check that the streams are identical (SSRCs didn't change).
1360 EXPECT_EQ(stream1, stream2);
1361
1362 // Create third offer that has same RIDs in different order.
1363 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001364 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001365 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1366 }
1367
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001369 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1370 static void ProcessThreadQueue(rtc::Thread* thread) {
1371 RTC_DCHECK(thread->IsCurrent());
1372 while (!thread->empty()) {
1373 thread->ProcessMessages(0);
1374 }
1375 }
Tommi1959f8f2021-04-26 10:20:19 +02001376 static void FlushCurrentThread() {
1377 rtc::Thread::Current()->ProcessMessages(0);
1378 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001379 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001380 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001381 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001382 thread->Invoke<void>(RTC_FROM_HERE,
1383 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001384 }
1385 ProcessThreadQueue(rtc::Thread::Current());
1386 // Network thread move them around and post back to worker = current thread.
1387 if (!network_thread_->IsCurrent()) {
1388 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001389 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 }
1391 // Worker thread = current Thread process received messages.
1392 ProcessThreadQueue(rtc::Thread::Current());
1393 }
Tommic9625f02021-05-06 22:03:19 +02001394
1395 typename T::MediaChannel* media_channel1() {
1396 RTC_DCHECK(channel1_);
1397 RTC_DCHECK(channel1_->media_channel());
1398 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1399 }
1400
1401 typename T::MediaChannel* media_channel2() {
1402 RTC_DCHECK(channel2_);
1403 RTC_DCHECK(channel2_->media_channel());
1404 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1405 }
1406
Peter Boström34fbfff2015-09-24 19:20:30 +02001407 // TODO(pbos): Remove playout from all media channels and let renderers mute
1408 // themselves.
1409 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001410 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1411 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001412 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1413 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001414 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1415 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1416 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1417 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1418 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1419 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1420 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1421 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001422 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1423 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1424 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001425 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001426 std::unique_ptr<typename T::Channel> channel1_;
1427 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428 typename T::Content local_media_content1_;
1429 typename T::Content local_media_content2_;
1430 typename T::Content remote_media_content1_;
1431 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001433 rtc::Buffer rtp_packet_;
1434 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001435 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001436 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437};
1438
Yves Gerey665174f2018-06-19 15:03:05 +02001439template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001440std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1441 rtc::Thread* worker_thread,
1442 rtc::Thread* network_thread,
1443 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1444 webrtc::RtpTransportInternal* rtp_transport,
1445 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001446 rtc::Thread* signaling_thread = rtc::Thread::Current();
1447 auto channel = std::make_unique<cricket::VoiceChannel>(
1448 worker_thread, network_thread, signaling_thread, std::move(ch),
1449 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1450 &ssrc_generator_);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001451 network_thread->Invoke<void>(RTC_FROM_HERE, [&]() {
1452 RTC_DCHECK_RUN_ON(channel->network_thread());
1453 channel->Init_n(rtp_transport);
1454 });
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001455 return channel;
1456}
1457
1458template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001459void ChannelTest<VoiceTraits>::CreateContent(
1460 int flags,
1461 const cricket::AudioCodec& audio_codec,
1462 const cricket::VideoCodec& video_codec,
1463 cricket::AudioContentDescription* audio) {
1464 audio->AddCodec(audio_codec);
1465 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466}
1467
Yves Gerey665174f2018-06-19 15:03:05 +02001468template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469void ChannelTest<VoiceTraits>::CopyContent(
1470 const cricket::AudioContentDescription& source,
1471 cricket::AudioContentDescription* audio) {
1472 *audio = source;
1473}
1474
Yves Gerey665174f2018-06-19 15:03:05 +02001475template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1477 const cricket::AudioCodec& c2) {
1478 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001479 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480}
1481
Peter Boström0c4e06b2015-10-07 12:23:21 +02001482template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001484 uint32_t ssrc,
1485 int flags,
1486 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487 audio->AddLegacyStream(ssrc);
1488}
1489
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001490class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 public:
solenberg1dd98f32015-09-10 01:57:14 -07001492 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 VoiceChannelSingleThreadTest()
1494 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1495};
1496
1497class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1498 public:
1499 typedef ChannelTest<VoiceTraits> Base;
1500 VoiceChannelDoubleThreadTest()
1501 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502};
1503
jbauch5869f502017-06-29 12:31:36 -07001504class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001505 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001506 public:
1507 typedef ChannelTest<VoiceTraits> Base;
1508 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001509 : Base(true,
1510 kPcmuFrameWithExtensions,
1511 kRtcpReport,
1512 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001513};
1514
1515class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001516 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001517 public:
1518 typedef ChannelTest<VoiceTraits> Base;
1519 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001520 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1521 }
jbauch5869f502017-06-29 12:31:36 -07001522};
1523
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001525template <>
Steve Anton8699a322017-11-06 15:53:33 -08001526std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001527 rtc::Thread* worker_thread,
1528 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001529 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001530 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001531 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001532 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001533 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001534 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001535 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1536 &ssrc_generator_);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001537 network_thread->Invoke<void>(RTC_FROM_HERE, [&]() {
1538 RTC_DCHECK_RUN_ON(channel->network_thread());
1539 channel->Init_n(rtp_transport);
1540 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 return channel;
1542}
1543
Yves Gerey665174f2018-06-19 15:03:05 +02001544template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545void ChannelTest<VideoTraits>::CreateContent(
1546 int flags,
1547 const cricket::AudioCodec& audio_codec,
1548 const cricket::VideoCodec& video_codec,
1549 cricket::VideoContentDescription* video) {
1550 video->AddCodec(video_codec);
1551 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552}
1553
Yves Gerey665174f2018-06-19 15:03:05 +02001554template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555void ChannelTest<VideoTraits>::CopyContent(
1556 const cricket::VideoContentDescription& source,
1557 cricket::VideoContentDescription* video) {
1558 *video = source;
1559}
1560
Yves Gerey665174f2018-06-19 15:03:05 +02001561template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1563 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001564 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001565}
1566
Peter Boström0c4e06b2015-10-07 12:23:21 +02001567template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001569 uint32_t ssrc,
1570 int flags,
1571 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572 video->AddLegacyStream(ssrc);
1573}
1574
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001575class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576 public:
solenberg1dd98f32015-09-10 01:57:14 -07001577 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001578 VideoChannelSingleThreadTest()
1579 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580};
1581
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001582class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1583 public:
1584 typedef ChannelTest<VideoTraits> Base;
1585 VideoChannelDoubleThreadTest()
1586 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1587};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001589TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001591 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1592 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593}
1594
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001595TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1596 Base::TestDeinit();
1597}
1598
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001599TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 Base::TestSetContents();
1601}
1602
Johannes Kron9190b822018-10-29 11:22:05 +01001603TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1604 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1605}
1606
1607TEST_F(VoiceChannelSingleThreadTest,
1608 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1609 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1610}
1611
1612TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1613 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1614}
1615
1616TEST_F(VoiceChannelSingleThreadTest,
1617 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1618 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1619}
1620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001621TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 Base::TestSetContentsNullOffer();
1623}
1624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 Base::TestSetContentsRtcpMux();
1627}
1628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001629TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 Base::TestSetContentsRtcpMux();
1631}
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 Base::TestChangeStreamParamsInContent();
1635}
1636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001638 Base::TestPlayoutAndSendingStates();
1639}
1640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 Base::TestMediaContentDirection();
1643}
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001646 Base::TestNetworkRouteChanges();
1647}
1648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001649TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001650 Base::TestCallSetup();
1651}
1652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 Base::SendRtpToRtp();
1655}
1656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001657TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001658 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659}
1660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001661TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001662 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001663}
1664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1667}
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 Base::SendRtpToRtpOnThread();
1671}
1672
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001673TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 Base::SendWithWritabilityLoss();
1675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 Base::TestSetContentFailure();
1679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 Base::TestSendTwoOffers();
1683}
1684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001685TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 Base::TestReceiveTwoOffers();
1687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 Base::TestSendPrAnswer();
1691}
1692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001693TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 Base::TestReceivePrAnswer();
1695}
1696
zstein56162b92017-04-24 16:54:35 -07001697TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1698 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699}
1700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001701TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001702 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703}
1704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001705TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001706 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001707}
1708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001710 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001711}
1712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001714 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001718 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001719}
1720
Steve Anton8a63f782017-10-23 13:08:53 -07001721TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1722 Base::SocketOptionsMergedOnSetTransport();
1723}
1724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725// VoiceChannelDoubleThreadTest
1726TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001728 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1729 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730}
1731
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001732TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1733 Base::TestDeinit();
1734}
1735
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001736TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 Base::TestSetContents();
1738}
1739
Johannes Kron9190b822018-10-29 11:22:05 +01001740TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1741 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1742}
1743
1744TEST_F(VoiceChannelDoubleThreadTest,
1745 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1746 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1747}
1748
1749TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1750 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1751}
1752
1753TEST_F(VoiceChannelDoubleThreadTest,
1754 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1755 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 Base::TestSetContentsNullOffer();
1760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 Base::TestSetContentsRtcpMux();
1764}
1765
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001766TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 Base::TestSetContentsRtcpMux();
1768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 Base::TestChangeStreamParamsInContent();
1772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 Base::TestPlayoutAndSendingStates();
1776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1779 Base::TestMediaContentDirection();
1780}
1781
1782TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1783 Base::TestNetworkRouteChanges();
1784}
1785
1786TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1787 Base::TestCallSetup();
1788}
1789
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001790TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1791 Base::SendRtpToRtp();
1792}
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001795 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001799 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001800}
1801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1803 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1804}
1805
1806TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1807 Base::SendRtpToRtpOnThread();
1808}
1809
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001810TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1811 Base::SendWithWritabilityLoss();
1812}
1813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1815 Base::TestSetContentFailure();
1816}
1817
1818TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1819 Base::TestSendTwoOffers();
1820}
1821
1822TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1823 Base::TestReceiveTwoOffers();
1824}
1825
1826TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1827 Base::TestSendPrAnswer();
1828}
1829
1830TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1831 Base::TestReceivePrAnswer();
1832}
1833
zstein56162b92017-04-24 16:54:35 -07001834TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1835 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001836}
1837
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001838TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1839 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1840}
1841
1842TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1843 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1844}
1845
1846TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1847 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1848}
1849
1850TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1851 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1852}
1853
1854TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1855 Base::DefaultMaxBitrateIsUnlimited();
1856}
1857
Steve Anton8a63f782017-10-23 13:08:53 -07001858TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1859 Base::SocketOptionsMergedOnSetTransport();
1860}
1861
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001862// VideoChannelSingleThreadTest
1863TEST_F(VideoChannelSingleThreadTest, TestInit) {
1864 Base::TestInit();
1865}
1866
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001867TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1868 Base::TestDeinit();
1869}
1870
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001871TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1872 Base::TestSetContents();
1873}
1874
Johannes Kron9190b822018-10-29 11:22:05 +01001875TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1876 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1877}
1878
1879TEST_F(VideoChannelSingleThreadTest,
1880 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1881 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1882}
1883
1884TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1885 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1886}
1887
1888TEST_F(VideoChannelSingleThreadTest,
1889 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1890 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1891}
1892
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001893TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1894 Base::TestSetContentsNullOffer();
1895}
1896
1897TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1898 Base::TestSetContentsRtcpMux();
1899}
1900
1901TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1902 Base::TestSetContentsRtcpMux();
1903}
1904
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001905TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1906 Base::TestChangeStreamParamsInContent();
1907}
1908
1909TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1910 Base::TestPlayoutAndSendingStates();
1911}
1912
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001913TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 Base::TestMediaContentDirection();
1915}
1916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001918 Base::TestNetworkRouteChanges();
1919}
1920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 Base::TestCallSetup();
1923}
1924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001925TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 Base::SendRtpToRtp();
1927}
1928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001929TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001930 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931}
1932
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001933TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001934 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935}
1936
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001937TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1939}
1940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 Base::SendRtpToRtpOnThread();
1943}
1944
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001945TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 Base::SendWithWritabilityLoss();
1947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 Base::TestSetContentFailure();
1951}
1952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001953TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 Base::TestSendTwoOffers();
1955}
1956
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 Base::TestReceiveTwoOffers();
1959}
1960
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001961TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 Base::TestSendPrAnswer();
1963}
1964
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 Base::TestReceivePrAnswer();
1967}
1968
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001969TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001970 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971}
1972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001974 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001975}
1976
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001977TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001978 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001979}
1980
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001981TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001982 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001983}
1984
zstein56162b92017-04-24 16:54:35 -07001985TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1986 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001987}
1988
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001989TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001990 Base::DefaultMaxBitrateIsUnlimited();
1991}
1992
Steve Anton8a63f782017-10-23 13:08:53 -07001993TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1994 Base::SocketOptionsMergedOnSetTransport();
1995}
1996
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001997TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1998 Base::TestUpdateLocalStreamsWithSimulcast();
1999}
2000
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002001TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2002 const cricket::VideoCodec kVp8Codec(97, "VP8");
2003 cricket::VideoCodec vp9_codec(98, "VP9");
2004 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2005 cricket::VideoContentDescription video;
2006 video.set_codecs({kVp8Codec, vp9_codec});
2007
2008 CreateChannels(0, 0);
2009
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002010 std::string err;
2011 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02002012 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2013 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2014 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2015 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2016 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2017 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002018 cricket::kPacketizationParamRaw);
2019}
2020
2021TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2022 const cricket::VideoCodec kVp8Codec(97, "VP8");
2023 cricket::VideoCodec vp9_codec(98, "VP9");
2024 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2025 cricket::VideoContentDescription video;
2026 video.set_codecs({kVp8Codec, vp9_codec});
2027
2028 CreateChannels(0, 0);
2029
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002030 std::string err;
2031 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2032 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002033 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2034 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2035 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2036 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2037 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2038 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002039 cricket::kPacketizationParamRaw);
2040}
2041
2042TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2043 const cricket::VideoCodec kVp8Codec(97, "VP8");
2044 cricket::VideoCodec vp9_codec(98, "VP9");
2045 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2046 cricket::VideoContentDescription video;
2047 video.set_codecs({kVp8Codec, vp9_codec});
2048
2049 CreateChannels(0, 0);
2050
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002051 std::string err;
2052 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2053 EXPECT_TRUE(err.empty());
2054 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2055 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002056 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2057 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2058 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2059 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2060 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002061 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002062 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2063 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2064 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2065 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2066 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002067 cricket::kPacketizationParamRaw);
2068}
2069
2070TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2071 const cricket::VideoCodec kLocalCodec(98, "VP8");
2072 cricket::VideoCodec remote_codec(99, "VP8");
2073 remote_codec.packetization = cricket::kPacketizationParamRaw;
2074 cricket::VideoContentDescription local_video;
2075 local_video.set_codecs({kLocalCodec});
2076 cricket::VideoContentDescription remote_video;
2077 remote_video.set_codecs({remote_codec});
2078
2079 CreateChannels(0, 0);
2080
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002081 std::string err;
2082 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2083 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002084 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2085 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2086 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2087 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002088}
2089
2090TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2091 cricket::VideoCodec local_codec(98, "VP8");
2092 local_codec.packetization = cricket::kPacketizationParamRaw;
2093 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2094 cricket::VideoContentDescription local_video;
2095 local_video.set_codecs({local_codec});
2096 cricket::VideoContentDescription remote_video;
2097 remote_video.set_codecs({kRemoteCodec});
2098
2099 CreateChannels(0, 0);
2100
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002101 std::string err;
2102 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002103 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002104 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002105 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2106 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2107 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2108 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002109}
2110
2111TEST_F(VideoChannelSingleThreadTest,
2112 TestSetRemoteAnswerWithInvalidPacketization) {
2113 cricket::VideoCodec local_codec(98, "VP8");
2114 local_codec.packetization = cricket::kPacketizationParamRaw;
2115 cricket::VideoCodec remote_codec(99, "VP8");
2116 remote_codec.packetization = "unknownpacketizationattributevalue";
2117 cricket::VideoContentDescription local_video;
2118 local_video.set_codecs({local_codec});
2119 cricket::VideoContentDescription remote_video;
2120 remote_video.set_codecs({remote_codec});
2121
2122 CreateChannels(0, 0);
2123
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002124 std::string err;
2125 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2126 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002127 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002128 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2129 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002130 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2131 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002132 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002133 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002134}
2135
2136TEST_F(VideoChannelSingleThreadTest,
2137 TestSetLocalAnswerWithInvalidPacketization) {
2138 cricket::VideoCodec local_codec(98, "VP8");
2139 local_codec.packetization = cricket::kPacketizationParamRaw;
2140 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2141 cricket::VideoContentDescription local_video;
2142 local_video.set_codecs({local_codec});
2143 cricket::VideoContentDescription remote_video;
2144 remote_video.set_codecs({kRemoteCodec});
2145
2146 CreateChannels(0, 0);
2147
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002148 std::string err;
2149 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2150 EXPECT_TRUE(err.empty());
2151 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2152 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002153 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2154 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2155 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002156}
2157
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002158// VideoChannelDoubleThreadTest
2159TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2160 Base::TestInit();
2161}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002163TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2164 Base::TestDeinit();
2165}
2166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002167TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2168 Base::TestSetContents();
2169}
2170
Johannes Kron9190b822018-10-29 11:22:05 +01002171TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2172 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2173}
2174
2175TEST_F(VideoChannelDoubleThreadTest,
2176 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2177 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2178}
2179
2180TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2181 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2182}
2183
2184TEST_F(VideoChannelDoubleThreadTest,
2185 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2186 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2187}
2188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002189TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2190 Base::TestSetContentsNullOffer();
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2194 Base::TestSetContentsRtcpMux();
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2198 Base::TestSetContentsRtcpMux();
2199}
2200
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002201TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2202 Base::TestChangeStreamParamsInContent();
2203}
2204
2205TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2206 Base::TestPlayoutAndSendingStates();
2207}
2208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2210 Base::TestMediaContentDirection();
2211}
2212
2213TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2214 Base::TestNetworkRouteChanges();
2215}
2216
2217TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2218 Base::TestCallSetup();
2219}
2220
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002221TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2222 Base::SendRtpToRtp();
2223}
2224
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002225TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002226 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002227}
2228
2229TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002230 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231}
2232
2233TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2234 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2235}
2236
2237TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2238 Base::SendRtpToRtpOnThread();
2239}
2240
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2242 Base::SendWithWritabilityLoss();
2243}
2244
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2246 Base::TestSetContentFailure();
2247}
2248
2249TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2250 Base::TestSendTwoOffers();
2251}
2252
2253TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2254 Base::TestReceiveTwoOffers();
2255}
2256
2257TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2258 Base::TestSendPrAnswer();
2259}
2260
2261TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2262 Base::TestReceivePrAnswer();
2263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2266 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2267}
2268
2269TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2270 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2271}
2272
2273TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2274 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2275}
2276
2277TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2278 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2279}
2280
zstein56162b92017-04-24 16:54:35 -07002281TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2282 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2286 Base::DefaultMaxBitrateIsUnlimited();
2287}
2288
Steve Anton8a63f782017-10-23 13:08:53 -07002289TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2290 Base::SocketOptionsMergedOnSetTransport();
2291}
2292
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294// TODO(pthatcher): TestSetReceiver?