blob: 583c2923dfa3c5e778943ec223300b354627a4cb [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
Harald Alvestrandc24a2182022-02-23 13:44:59 +000013#include <stddef.h>
14
Yves Gerey3e707812018-11-28 16:47:49 +010015#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000016#include <string>
17#include <type_traits>
kwiberg31022942016-03-11 14:18:21 -080018
Danil Chapovalova30439b2022-07-07 10:08:49 +020019#include "absl/functional/any_invocable.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/rtp_parameters.h"
Artem Titovc374d112022-06-16 21:27:45 +020023#include "api/task_queue/pending_task_safety_flag.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "media/base/fake_media_engine.h"
26#include "media/base/fake_rtp.h"
27#include "media/base/media_channel.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000028#include "media/base/media_constants.h"
29#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "p2p/base/candidate_pair_interface.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000031#include "p2p/base/dtls_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080032#include "p2p/base/fake_dtls_transport.h"
33#include "p2p/base/fake_packet_transport.h"
34#include "p2p/base/ice_transport_internal.h"
35#include "p2p/base/p2p_constants.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000036#include "p2p/base/packet_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "pc/dtls_srtp_transport.h"
38#include "pc/jsep_transport.h"
39#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020041#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080042#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020043#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080044#include "rtc_base/rtc_certificate.h"
45#include "rtc_base/ssl_identity.h"
Danil Chapovalov2aaef452022-08-12 15:55:11 +020046#include "rtc_base/task_queue_for_test.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020047#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "test/gtest.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010049#include "test/scoped_key_value_config.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
zhihuangb2cdd932017-01-19 16:54:25 -080051using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080053using cricket::RidDescription;
54using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080056using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080057using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058
Danil Chapovalov33b01f22016-05-11 19:55:27 +020059namespace {
60const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
61const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
62const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070063const cricket::VideoCodec kH264Codec(97, "H264");
64const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065const uint32_t kSsrc1 = 0x1111;
66const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070067const uint32_t kSsrc3 = 0x3333;
68const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020069const int kAudioPts[] = {0, 8};
70const int kVideoPts[] = {97, 99};
71enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010072
Danil Chapovalov33b01f22016-05-11 19:55:27 +020073} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
deadbeefcbecd352015-09-23 11:50:27 -070075template <class ChannelT,
76 class MediaChannelT,
77 class ContentT,
78 class CodecT,
79 class MediaInfoT,
80 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081class Traits {
82 public:
83 typedef ChannelT Channel;
84 typedef MediaChannelT MediaChannel;
85 typedef ContentT Content;
86 typedef CodecT Codec;
87 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020088 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089};
90
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091class VoiceTraits : public Traits<cricket::VoiceChannel,
92 cricket::FakeVoiceMediaChannel,
93 cricket::AudioContentDescription,
94 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020095 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070096 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097
98class VideoTraits : public Traits<cricket::VideoChannel,
99 cricket::FakeVideoMediaChannel,
100 cricket::VideoContentDescription,
101 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200102 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700103 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
Harald Alvestrand48171ec2021-04-20 15:06:03 +0000105// Base class for Voice/Video tests
Yves Gerey665174f2018-06-19 15:03:05 +0200106template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200107class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 public:
deadbeefac22f702017-01-12 21:59:29 -0800109 enum Flags {
110 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800111 SSRC_MUX = 0x8,
112 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800113 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800114 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700115 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800116 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117
Peter Boström34fbfff2015-09-24 19:20:30 +0200118 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 rtc::ArrayView<const uint8_t> rtp_data,
120 rtc::ArrayView<const uint8_t> rtcp_data,
121 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200122 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800124 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200125 if (network_is_worker == NetworkIsWorker::Yes) {
126 network_thread_ = rtc::Thread::Current();
127 } else {
128 network_thread_keeper_ = rtc::Thread::Create();
129 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 network_thread_ = network_thread_keeper_.get();
131 }
Tommic9625f02021-05-06 22:03:19 +0200132 RTC_DCHECK(network_thread_);
133 }
134
135 ~ChannelTest() {
136 if (network_thread_) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200137 SendTask(network_thread_, [this]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100138 network_thread_safety_->SetNotAlive();
139 DeinitChannels();
140 });
Tommic9625f02021-05-06 22:03:19 +0200141 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200142 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200145 CreateChannels(std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200146 nullptr, typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200147 std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200148 nullptr, typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200149 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 }
Steve Anton8699a322017-11-06 15:53:33 -0800151 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
152 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200153 int flags1,
154 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200155 RTC_DCHECK(!channel1_);
156 RTC_DCHECK(!channel2_);
157
deadbeeff5346592017-01-24 21:51:21 -0800158 // Network thread is started in CreateChannels, to allow the test to
159 // configure a fake clock before any threads are spawned and attempt to
160 // access the time.
161 if (network_thread_keeper_) {
162 network_thread_keeper_->Start();
163 }
Zhi Huange830e682018-03-30 10:48:35 -0700164
deadbeeff5346592017-01-24 21:51:21 -0800165 // Make sure if using raw packet transports, they're used for both
166 // channels.
167 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200168 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeeff5346592017-01-24 21:51:21 -0800169 // Based on flags, create fake DTLS or raw packet transports.
170 if (flags1 & RAW_PACKET_TRANSPORT) {
171 fake_rtp_packet_transport1_.reset(
172 new rtc::FakePacketTransport("channel1_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700173 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800174 fake_rtcp_packet_transport1_.reset(
175 new rtc::FakePacketTransport("channel1_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800176 }
177 } else {
178 // Confirmed to work with KT_RSA and KT_ECDSA.
179 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100180 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700181 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800182 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100183 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
184 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800185 }
186 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100187 auto cert1 = rtc::RTCCertificate::Create(
188 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800189 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
190 if (fake_rtcp_dtls_transport1_) {
191 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
192 }
193 }
194 }
195 // Based on flags, create fake DTLS or raw packet transports.
196 if (flags2 & RAW_PACKET_TRANSPORT) {
197 fake_rtp_packet_transport2_.reset(
198 new rtc::FakePacketTransport("channel2_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700199 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800200 fake_rtcp_packet_transport2_.reset(
201 new rtc::FakePacketTransport("channel2_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800202 }
203 } else {
204 // Confirmed to work with KT_RSA and KT_ECDSA.
205 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100206 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700207 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800208 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100209 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
210 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800211 }
212 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100213 auto cert2 = rtc::RTCCertificate::Create(
214 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800215 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
216 if (fake_rtcp_dtls_transport2_) {
217 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
218 }
219 }
220 }
Zhi Huange830e682018-03-30 10:48:35 -0700221 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
222 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
223 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
224 flags1);
225 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
226 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
227 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
228 flags2);
229
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800230 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
231 rtp_transport1_.get(), flags1);
232 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
233 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200234 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
235 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 CopyContent(local_media_content1_, &remote_media_content1_);
237 CopyContent(local_media_content2_, &remote_media_content2_);
238
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 // Add stream information (SSRC) to the local content but not to the remote
240 // content. This means that we per default know the SSRC of what we send but
241 // not what we receive.
242 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
243 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
244
245 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
246 if (flags1 & SSRC_MUX) {
247 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
248 }
249 if (flags2 & SSRC_MUX) {
250 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
251 }
252 }
Steve Anton8699a322017-11-06 15:53:33 -0800253 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200254 rtc::Thread* worker_thread,
255 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800256 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700257 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200258 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259
Zhi Huange830e682018-03-30 10:48:35 -0700260 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
261 rtc::PacketTransportInternal* rtp_packet_transport,
262 rtc::PacketTransportInternal* rtcp_packet_transport,
263 DtlsTransportInternal* rtp_dtls_transport,
264 DtlsTransportInternal* rtcp_dtls_transport,
265 int flags) {
266 if (flags & RTCP_MUX) {
267 rtcp_packet_transport = nullptr;
268 rtcp_dtls_transport = nullptr;
269 }
270
271 if (flags & DTLS) {
272 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
273 } else {
274 if (flags & RAW_PACKET_TRANSPORT) {
275 return CreateUnencryptedTransport(rtp_packet_transport,
276 rtcp_packet_transport);
277 } else {
278 return CreateUnencryptedTransport(rtp_dtls_transport,
279 rtcp_dtls_transport);
280 }
281 }
282 }
283
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100284 // Unininitializes the channels on the network thread.
285 void DeinitChannels() {
286 if (!channel1_ && !channel2_)
287 return;
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200288 SendTask(network_thread_, [this]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100289 if (channel1_) {
290 RTC_DCHECK_RUN_ON(channel1_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100291 channel1_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100292 }
293 if (channel2_) {
294 RTC_DCHECK_RUN_ON(channel2_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100295 channel2_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100296 }
297 });
298 }
299
Zhi Huange830e682018-03-30 10:48:35 -0700300 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
301 rtc::PacketTransportInternal* rtp_packet_transport,
302 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200303 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200304 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700305
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200306 SendTask(network_thread_,
307 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
308 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
309 if (rtcp_packet_transport) {
310 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
311 }
312 });
Zhi Huange830e682018-03-30 10:48:35 -0700313 return rtp_transport;
314 }
315
316 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
317 cricket::DtlsTransportInternal* rtp_dtls_transport,
318 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200319 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100320 rtcp_dtls_transport == nullptr, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700321
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200322 SendTask(network_thread_,
323 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
324 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
325 rtcp_dtls_transport);
326 });
Zhi Huange830e682018-03-30 10:48:35 -0700327 return dtls_srtp_transport;
328 }
329
deadbeeff5346592017-01-24 21:51:21 -0800330 void ConnectFakeTransports() {
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200331 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -0800332 bool asymmetric = false;
333 // Depending on test flags, could be using DTLS or raw packet transport.
334 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
335 fake_rtp_dtls_transport1_->SetDestination(
336 fake_rtp_dtls_transport2_.get(), asymmetric);
337 }
338 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
339 fake_rtcp_dtls_transport1_->SetDestination(
340 fake_rtcp_dtls_transport2_.get(), asymmetric);
341 }
342 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
343 fake_rtp_packet_transport1_->SetDestination(
344 fake_rtp_packet_transport2_.get(), asymmetric);
345 }
346 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
347 fake_rtcp_packet_transport1_->SetDestination(
348 fake_rtcp_packet_transport2_.get(), asymmetric);
349 }
350 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800351 // The transport becoming writable will asynchronously update the send state
352 // on the worker thread; since this test uses the main thread as the worker
353 // thread, we must process the message queue for this to occur.
354 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800355 }
356
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 bool SendInitiate() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000358 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000360 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 if (result) {
362 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200363 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000364 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000365 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800367 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000368 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000369 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 }
371 }
372 return result;
373 }
374
375 bool SendAccept() {
376 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200377 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000378 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000379 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000380 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 }
382
383 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000384 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000385 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000386 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 if (result) {
388 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000389 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000390 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 }
392 return result;
393 }
394
395 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000396 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000398 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 if (result) {
400 channel2_->Enable(true);
401 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000402 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800403 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404 }
405 return result;
406 }
407
408 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000409 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000410 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000411 SdpType::kAnswer, err);
412 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000413 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000414 SdpType::kAnswer, err);
415 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 return result;
417 }
418
Tommic9625f02021-05-06 22:03:19 +0200419 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
Danil Chapovalova30439b2022-07-07 10:08:49 +0200420 network_thread_->PostTask(webrtc::SafeTask(
Tommic9625f02021-05-06 22:03:19 +0200421 network_thread_safety_, [media_channel, data = std::move(data)]() {
422 media_channel->SendRtp(data.data(), data.size(),
423 rtc::PacketOptions());
424 }));
425 }
426
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200428 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
Tommic9625f02021-05-06 22:03:19 +0200430
431 void SendRtp1(rtc::Buffer data) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000432 SendRtp(media_send_channel1(), std::move(data));
Tommic9625f02021-05-06 22:03:19 +0200433 }
434
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200436 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Tommic9625f02021-05-06 22:03:19 +0200438
439 void SendRtp2(rtc::Buffer data) {
440 SendRtp(media_channel2(), std::move(data));
441 }
442
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200445 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200447 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200448 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 bool CheckRtp1() {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000452 return media_send_channel1()->CheckRtp(rtp_packet_.data(),
453 rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 }
455 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200456 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000461 return media_send_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200465 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200467 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
468 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::SetBE32(data.data() + 8, ssrc);
471 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000472 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000474 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 return data;
476 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000478 bool CheckNoRtp1() { return media_send_channel1()->CheckNoRtp(); }
Tommic9625f02021-05-06 22:03:19 +0200479 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480
481 void CreateContent(int flags,
482 const cricket::AudioCodec& audio_codec,
483 const cricket::VideoCodec& video_codec,
484 typename T::Content* content) {
485 // overridden in specialized classes
486 }
487 void CopyContent(const typename T::Content& source,
488 typename T::Content* content) {
489 // overridden in specialized classes
490 }
491
Steve Anton18ee1d52017-09-11 11:32:35 -0700492 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700494 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
495 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700496 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700497 AddLegacyStreamInContent(ssrc, 0, content);
498 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 }
500
ossu292d6582016-03-17 02:31:13 -0700501 // Will manage the lifetime of a CallThread, making sure it's
502 // destroyed before this object goes out of scope.
503 class ScopedCallThread {
504 public:
Danil Chapovalova30439b2022-07-07 10:08:49 +0200505 explicit ScopedCallThread(absl::AnyInvocable<void() &&> functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100506 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700507 thread_->Start();
Danil Chapovalova30439b2022-07-07 10:08:49 +0200508 thread_->PostTask(std::move(functor));
ossu292d6582016-03-17 02:31:13 -0700509 }
510
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200511 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700512
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200513 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700514
515 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200516 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700517 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
520 return false; // overridden in specialized classes
521 }
522
Honghai Zhangcc411c02016-03-29 17:27:21 -0700523 cricket::CandidatePairInterface* last_selected_candidate_pair() {
524 return last_selected_candidate_pair_;
525 }
526
Peter Boström0c4e06b2015-10-07 12:23:21 +0200527 void AddLegacyStreamInContent(uint32_t ssrc,
528 int flags,
529 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 // Base implementation.
531 }
532
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200533 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200534 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200535 // network thread, which callers need to factor in.
536 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
537 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200538 bool result;
539 SendTask(network_thread_, [&] { result = channel->srtp_active(); });
540 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200541 }
542
543 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
544 // returns true.
545 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
546 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200547 bool result;
548 SendTask(network_thread_, [&] {
549 result = channel->rtp_transport() &&
550 channel->rtp_transport()->rtcp_mux_enabled();
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200551 });
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200552 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200553 }
554
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 // Tests that can be used by derived classes.
556
557 // Basic sanity check.
558 void TestInit() {
559 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200560 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000561 EXPECT_FALSE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200562 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000563 EXPECT_FALSE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200564 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000565 EXPECT_TRUE(media_send_channel1()->codecs().empty());
566 EXPECT_TRUE(media_send_channel1()->recv_streams().empty());
567 EXPECT_TRUE(media_send_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 }
569
570 // Test that SetLocalContent and SetRemoteContent properly configure
571 // the codecs.
572 void TestSetContents() {
573 CreateChannels(0, 0);
574 typename T::Content content;
575 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000576 std::string err;
577 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000578 EXPECT_EQ(0U, media_send_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000579 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000580 ASSERT_EQ(1U, media_send_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200581 EXPECT_TRUE(
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000582 CodecMatches(content.codecs()[0], media_send_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 }
584
Johannes Kron9190b822018-10-29 11:22:05 +0100585 // Test that SetLocalContent and SetRemoteContent properly configure
586 // extmap-allow-mixed.
587 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
588 // For a caller, SetLocalContent() is called first with an offer and next
589 // SetRemoteContent() is called with the answer.
590 CreateChannels(0, 0);
591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
593 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
594 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
595 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000596 std::string err;
597 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100598 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000599 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000600 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100601 }
602 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
603 // For a callee, SetRemoteContent() is called first with an offer and next
604 // SetLocalContent() is called with the answer.
605 CreateChannels(0, 0);
606 typename T::Content content;
607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
609 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
610 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000611 std::string err;
612 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100613 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000614 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000615 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100616 }
617
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 // Test that SetLocalContent and SetRemoteContent properly deals
619 // with an empty offer.
620 void TestSetContentsNullOffer() {
621 CreateChannels(0, 0);
622 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000623 std::string err;
624 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000626 EXPECT_EQ(0U, media_send_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000627 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000628 ASSERT_EQ(1U, media_send_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200629 EXPECT_TRUE(
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000630 CodecMatches(content.codecs()[0], media_send_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
633 // Test that SetLocalContent and SetRemoteContent properly set RTCP
634 // mux.
635 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800636 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 typename T::Content content;
638 CreateContent(0, kPcmuCodec, kH264Codec, &content);
639 // Both sides agree on mux. Should no longer be a separate RTCP channel.
640 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000641 std::string err;
642 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000645 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000647 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 }
649
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 // Test that SetLocalContent and SetRemoteContent properly
651 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800652 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 void TestChangeStreamParamsInContent() {
654 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 stream1.id = "stream1";
656 stream1.ssrcs.push_back(kSsrc1);
657 stream1.cname = "stream1_cname";
658
659 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 stream2.id = "stream2";
661 stream2.ssrcs.push_back(kSsrc2);
662 stream2.cname = "stream2_cname";
663
Artem Titov880fa812021-07-30 22:30:23 +0200664 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 CreateChannels(0, 0);
666 typename T::Content content1;
667 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
668 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000669 std::string err;
670 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200671 channel1_->Enable(true);
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000672 EXPECT_EQ(1u, media_send_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000674 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200675 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800676 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677
678 // Channel 2 do not send anything.
679 typename T::Content content2;
680 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000681 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000682 EXPECT_EQ(0u, media_send_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000683 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200684 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200685 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200687 SendCustomRtp1(kSsrc1, 0);
688 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
690
Artem Titov880fa812021-07-30 22:30:23 +0200691 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700693 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000695 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200696 ASSERT_EQ(1u, media_channel2()->send_streams().size());
697 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000699 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000700 ASSERT_EQ(1u, media_send_channel1()->recv_streams().size());
701 EXPECT_EQ(stream2, media_send_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
703 // Channel 1 replies but stop sending stream1.
704 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700705 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000706 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000707 EXPECT_EQ(0u, media_send_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000709 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200710 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200712 SendCustomRtp2(kSsrc2, 0);
713 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
715 }
716
717 // Test that we only start playout and sending at the right times.
718 void TestPlayoutAndSendingStates() {
719 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200720 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000721 EXPECT_FALSE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200722 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000723 EXPECT_FALSE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200725 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200726 }
Tommic9625f02021-05-06 22:03:19 +0200727 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200728 channel1_->Enable(true);
729 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000731 EXPECT_FALSE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000733 EXPECT_FALSE(media_send_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000734 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000735 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000736 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000738 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200739 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000740 EXPECT_FALSE(media_send_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000741 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000742 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200743 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200744 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200745 }
Tommic9625f02021-05-06 22:03:19 +0200746 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000747 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000748 SdpType::kAnswer, err));
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());
deadbeeff5346592017-01-24 21:51:21 -0800753 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200754 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000755 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200756 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000757 EXPECT_FALSE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200758 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200759 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200760 }
Tommic9625f02021-05-06 22:03:19 +0200761 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200762 channel2_->Enable(true);
763 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200764 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200765 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200766 }
Tommic9625f02021-05-06 22:03:19 +0200767 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000769 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200770 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000771 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000773 EXPECT_TRUE(media_send_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 }
775
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 // Test that changing the MediaContentDirection in the local and remote
777 // session description start playout and sending at the right time.
778 void TestMediaContentDirection() {
779 CreateChannels(0, 0);
780 typename T::Content content1;
781 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
782 typename T::Content content2;
783 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200784 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800785 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786
Tommi1959f8f2021-04-26 10:20:19 +0200787 channel1_->Enable(true);
788 channel2_->Enable(true);
789 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200790 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000791 EXPECT_FALSE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200792 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000793 EXPECT_FALSE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200794 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200795 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200796 }
Tommic9625f02021-05-06 22:03:19 +0200797 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000799 std::string err;
800 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
801 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
802 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800803 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000804 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800805 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
Peter Boström34fbfff2015-09-24 19:20:30 +0200807 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000808 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200809 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000810 EXPECT_FALSE(media_send_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200811 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200812 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200813 }
Tommic9625f02021-05-06 22:03:19 +0200814 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815
Artem Titov880fa812021-07-30 22:30:23 +0200816 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800817 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000818 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800819 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000820 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821
Peter Boström34fbfff2015-09-24 19:20:30 +0200822 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000823 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200824 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000825 EXPECT_TRUE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200826 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200827 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200828 }
Tommic9625f02021-05-06 22:03:19 +0200829 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830
Artem Titov880fa812021-07-30 22:30:23 +0200831 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800832 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000833 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
834 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000837 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200838 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000839 EXPECT_TRUE(media_send_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200841 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200842 }
Tommic9625f02021-05-06 22:03:19 +0200843 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 }
845
Honghai Zhangcc411c02016-03-29 17:27:21 -0700846 // Tests that when the transport channel signals a candidate pair change
847 // event, the media channel will receive a call on the network route change.
848 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700849 static constexpr uint16_t kLocalNetId = 1;
850 static constexpr uint16_t kRemoteNetId = 2;
851 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800852 // Ipv4(20) + UDP(8).
853 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800854 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200855
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800856 CreateChannels(DTLS, DTLS);
857 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700858
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000859 typename T::MediaChannel* media_send_channel1 =
860 static_cast<typename T::MediaChannel*>(channel1_->media_send_channel());
861 ASSERT_TRUE(media_send_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700862
Zhi Huang942bc2e2017-11-13 13:26:07 -0800863 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200864 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800865 // when creating the channel.
866 WaitForThreads();
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000867 media_send_channel1->set_num_network_route_changes(0);
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200868 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800869 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200870 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800871 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200872 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200873 });
874 WaitForThreads();
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000875 EXPECT_EQ(1, media_send_channel1->num_network_route_changes());
876 EXPECT_FALSE(media_send_channel1->last_network_route().connected);
877 media_send_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700878
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200879 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800880 rtc::NetworkRoute network_route;
881 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100882 network_route.local =
883 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
884 network_route.remote =
885 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800886 network_route.last_sent_packet_id = kLastPacketId;
887 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200888 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800889 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
890
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200891 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 });
893 WaitForThreads();
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000894 EXPECT_EQ(1, media_send_channel1->num_network_route_changes());
895 EXPECT_TRUE(media_send_channel1->last_network_route().connected);
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100896 EXPECT_EQ(kLocalNetId,
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000897 media_send_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100898 EXPECT_EQ(kRemoteNetId,
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000899 media_send_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200900 EXPECT_EQ(kLastPacketId,
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000901 media_send_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800902 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000903 media_send_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700904 }
905
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 // Test setting up a call.
907 void TestCallSetup() {
908 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200909 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200911 if (verify_playout_) {
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000912 EXPECT_TRUE(media_send_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200913 }
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000914 EXPECT_FALSE(media_send_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200916 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000917 EXPECT_TRUE(media_send_channel1()->sending());
918 EXPECT_EQ(1U, media_send_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200919 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200920 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200921 }
Tommic9625f02021-05-06 22:03:19 +0200922 EXPECT_TRUE(media_channel2()->sending());
923 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000924 }
925
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 // Send voice RTP data to the other side and ensure it gets there.
927 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700928 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 EXPECT_TRUE(SendInitiate());
930 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200931 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
932 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200933 SendRtp1();
934 SendRtp2();
935 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 EXPECT_TRUE(CheckRtp1());
937 EXPECT_TRUE(CheckRtp2());
938 EXPECT_TRUE(CheckNoRtp1());
939 EXPECT_TRUE(CheckNoRtp2());
940 }
941
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200942 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800943 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200944 EXPECT_TRUE(SendInitiate());
945 EXPECT_TRUE(SendAccept());
946 SendRtp1();
947 SendRtp2();
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100948
949 DeinitChannels();
950
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200951 // Do not wait, destroy channels.
952 channel1_.reset(nullptr);
953 channel2_.reset(nullptr);
954 }
955
Zhi Huange830e682018-03-30 10:48:35 -0700956 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
957 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200958 EXPECT_FALSE(IsSrtpActive(channel1_));
959 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200961 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200963 EXPECT_TRUE(IsSrtpActive(channel1_));
964 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200965 SendRtp1();
966 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200967 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 EXPECT_TRUE(CheckRtp1());
969 EXPECT_TRUE(CheckRtp2());
970 EXPECT_TRUE(CheckNoRtp1());
971 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972 }
973
974 // Test that we can send and receive early media when a provisional answer is
975 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
976 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200977 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978
Yves Gerey665174f2018-06-19 15:03:05 +0200979 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
980 EXPECT_TRUE(SendOffer());
981 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200982 EXPECT_TRUE(IsSrtpActive(channel1_));
983 EXPECT_TRUE(IsSrtpActive(channel2_));
984 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
985 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200986 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200987 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
988 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200989 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990
Yves Gerey665174f2018-06-19 15:03:05 +0200991 // Send packets from callee and verify that it is received.
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(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995
Yves Gerey665174f2018-06-19 15:03:05 +0200996 // Complete call setup and ensure everything is still OK.
997 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200998 EXPECT_TRUE(IsSrtpActive(channel1_));
999 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +02001000 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +02001001 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1002 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001003 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001004 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001005 }
1006
1007 // Test that we properly send RTP without SRTP from a thread.
1008 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001009 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 EXPECT_TRUE(SendInitiate());
1011 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001012 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1013 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001014 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001015 WaitForThreads(involved_threads);
1016 EXPECT_TRUE(CheckRtp1());
1017 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_TRUE(CheckNoRtp1());
1019 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 }
1021
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 // Test that the mediachannel retains its sending state after the transport
1023 // becomes non-writable.
1024 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001025 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(SendInitiate());
1027 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001028 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1029 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001030 SendRtp1();
1031 SendRtp2();
1032 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 EXPECT_TRUE(CheckRtp1());
1034 EXPECT_TRUE(CheckRtp2());
1035 EXPECT_TRUE(CheckNoRtp1());
1036 EXPECT_TRUE(CheckNoRtp2());
1037
wu@webrtc.org97077a32013-10-25 21:18:33 +00001038 // Lose writability, which should fail.
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001039 SendTask(network_thread_,
1040 [this] { fake_rtp_dtls_transport1_->SetWritable(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001041 SendRtp1();
1042 SendRtp2();
1043 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 EXPECT_TRUE(CheckRtp1());
1045 EXPECT_TRUE(CheckNoRtp2());
1046
1047 // Regain writability
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001048 SendTask(network_thread_,
1049 [this] { fake_rtp_dtls_transport1_->SetWritable(true); });
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001050 EXPECT_TRUE(media_send_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001051 SendRtp1();
1052 SendRtp2();
1053 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 EXPECT_TRUE(CheckRtp1());
1055 EXPECT_TRUE(CheckRtp2());
1056 EXPECT_TRUE(CheckNoRtp1());
1057 EXPECT_TRUE(CheckNoRtp2());
1058
1059 // Lose writability completely
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001060 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001061 bool asymmetric = true;
1062 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1063 });
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001064 EXPECT_TRUE(media_send_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065
wu@webrtc.org97077a32013-10-25 21:18:33 +00001066 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001067 SendRtp1();
1068 SendRtp2();
1069 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001070 EXPECT_TRUE(CheckRtp1());
1071 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001072 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001073
1074 // Gain writability back
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001075 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001076 bool asymmetric = true;
1077 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1078 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001079 });
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001080 EXPECT_TRUE(media_send_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001081 SendRtp1();
1082 SendRtp2();
1083 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 EXPECT_TRUE(CheckRtp1());
1085 EXPECT_TRUE(CheckRtp2());
1086 EXPECT_TRUE(CheckNoRtp1());
1087 EXPECT_TRUE(CheckNoRtp2());
1088 }
1089
Yves Gerey665174f2018-06-19 15:03:05 +02001090 void SendBundleToBundle(const int* pl_types,
1091 int len,
1092 bool rtcp_mux,
1093 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001094 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001096 // Only pl_type1 was added to the bundle filter for both `channel1_`
1097 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001098 int pl_type1 = pl_types[0];
1099 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001100 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001101 if (secure)
1102 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001103 if (rtcp_mux) {
1104 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001105 }
1106 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001109
1110 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001111 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1112 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1113 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001114 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001115 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1116 EXPECT_TRUE(CheckNoRtp1());
1117 EXPECT_TRUE(CheckNoRtp2());
1118
Zhi Huang365381f2018-04-13 16:44:34 -07001119 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1120 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001121 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001122 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1123 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 }
1125
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 void TestSetContentFailure() {
1127 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128
Peter Thatchera6d24442015-07-09 21:26:36 -07001129 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001130 std::unique_ptr<typename T::Content> content(
1131 CreateMediaContentWithStream(1));
1132
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001133 media_send_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001134 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001135 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001136 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001137 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001139 media_send_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001140 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001141 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001142
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001143 media_send_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001144 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001145 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 }
1147
1148 void TestSendTwoOffers() {
1149 CreateChannels(0, 0);
1150
Peter Thatchera6d24442015-07-09 21:26:36 -07001151 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001152 std::unique_ptr<typename T::Content> content1(
1153 CreateMediaContentWithStream(1));
1154 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001155 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001156 EXPECT_TRUE(media_send_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157
Steve Anton18ee1d52017-09-11 11:32:35 -07001158 std::unique_ptr<typename T::Content> content2(
1159 CreateMediaContentWithStream(2));
1160 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001161 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001162 EXPECT_FALSE(media_send_channel1()->HasSendStream(1));
1163 EXPECT_TRUE(media_send_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 }
1165
1166 void TestReceiveTwoOffers() {
1167 CreateChannels(0, 0);
1168
Peter Thatchera6d24442015-07-09 21:26:36 -07001169 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001170 std::unique_ptr<typename T::Content> content1(
1171 CreateMediaContentWithStream(1));
1172 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001173 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001174 EXPECT_TRUE(media_send_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175
Steve Anton18ee1d52017-09-11 11:32:35 -07001176 std::unique_ptr<typename T::Content> content2(
1177 CreateMediaContentWithStream(2));
1178 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001179 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001180 EXPECT_FALSE(media_send_channel1()->HasRecvStream(1));
1181 EXPECT_TRUE(media_send_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 }
1183
1184 void TestSendPrAnswer() {
1185 CreateChannels(0, 0);
1186
Peter Thatchera6d24442015-07-09 21:26:36 -07001187 std::string err;
1188 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001189 std::unique_ptr<typename T::Content> content1(
1190 CreateMediaContentWithStream(1));
1191 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001192 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001193 EXPECT_TRUE(media_send_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194
Peter Thatchera6d24442015-07-09 21:26:36 -07001195 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001196 std::unique_ptr<typename T::Content> content2(
1197 CreateMediaContentWithStream(2));
1198 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001199 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001200 EXPECT_TRUE(media_send_channel1()->HasRecvStream(1));
1201 EXPECT_TRUE(media_send_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001202
Peter Thatchera6d24442015-07-09 21:26:36 -07001203 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001204 std::unique_ptr<typename T::Content> content3(
1205 CreateMediaContentWithStream(3));
1206 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001207 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001208 EXPECT_TRUE(media_send_channel1()->HasRecvStream(1));
1209 EXPECT_FALSE(media_send_channel1()->HasSendStream(2));
1210 EXPECT_TRUE(media_send_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 }
1212
1213 void TestReceivePrAnswer() {
1214 CreateChannels(0, 0);
1215
Peter Thatchera6d24442015-07-09 21:26:36 -07001216 std::string err;
1217 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001218 std::unique_ptr<typename T::Content> content1(
1219 CreateMediaContentWithStream(1));
1220 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001221 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001222 EXPECT_TRUE(media_send_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001223
Peter Thatchera6d24442015-07-09 21:26:36 -07001224 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001225 std::unique_ptr<typename T::Content> content2(
1226 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001227 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001228 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001229 EXPECT_TRUE(media_send_channel1()->HasSendStream(1));
1230 EXPECT_TRUE(media_send_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001231
Peter Thatchera6d24442015-07-09 21:26:36 -07001232 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001233 std::unique_ptr<typename T::Content> content3(
1234 CreateMediaContentWithStream(3));
1235 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001236 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001237 EXPECT_TRUE(media_send_channel1()->HasSendStream(1));
1238 EXPECT_FALSE(media_send_channel1()->HasRecvStream(2));
1239 EXPECT_TRUE(media_send_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 }
1241
zstein56162b92017-04-24 16:54:35 -07001242 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001243 CreateChannels(0, 0);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001244 EXPECT_FALSE(media_send_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001245
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001246 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001247 [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001248 WaitForThreads();
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001249 EXPECT_TRUE(media_send_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001250
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001251 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001252 [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001253 WaitForThreads();
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001254 EXPECT_FALSE(media_send_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001255 }
1256
skvladdc1c62c2016-03-16 19:07:43 -07001257 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1258 typename T::Content content;
1259 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1260 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001261 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001262 }
1263
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001264 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001265 webrtc::RtpParameters parameters;
1266 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001267 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001268 parameters.encodings.push_back(encoding);
1269 return parameters;
1270 }
1271
1272 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001273 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001274 EXPECT_EQ(1UL, parameters.encodings.size());
1275 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1276 }
1277
1278 void DefaultMaxBitrateIsUnlimited() {
1279 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001280 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001281 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001282 SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001283 EXPECT_EQ(media_send_channel1()->max_bps(), -1);
1284 VerifyMaxBitrate(media_send_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001285 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001286 }
1287
Zhi Huange830e682018-03-30 10:48:35 -07001288 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001289 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001290 // with the options on the new one.
1291
Steve Anton8a63f782017-10-23 13:08:53 -07001292 // For example, audio and video may use separate socket options, but initially
1293 // be unbundled, then later become bundled. When this happens, their preferred
1294 // socket options should be merged to the underlying transport they share.
1295 void SocketOptionsMergedOnSetTransport() {
1296 constexpr int kSndBufSize = 4000;
1297 constexpr int kRcvBufSize = 8000;
1298
Zhi Huange830e682018-03-30 10:48:35 -07001299 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001300
Zhi Huange830e682018-03-30 10:48:35 -07001301 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001302 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001303
Niels Möller92430882021-03-18 10:03:19 +01001304 bool rcv_success, send_success;
1305 int rcv_buf, send_buf;
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001306 SendTask(network_thread_, [&] {
Tommic9625f02021-05-06 22:03:19 +02001307 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1308 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1309 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1310 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001311 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001312 send_success = fake_rtp_dtls_transport2_->GetOption(
1313 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1314 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1315 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1316 });
1317
1318 ASSERT_TRUE(send_success);
1319 EXPECT_EQ(kSndBufSize, send_buf);
1320 ASSERT_TRUE(rcv_success);
1321 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001322 }
1323
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001324 void CreateSimulcastContent(const std::vector<std::string>& rids,
1325 typename T::Content* content) {
1326 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001327 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001328 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1329 }
1330
1331 StreamParams stream;
1332 stream.set_rids(rid_descriptions);
1333 CreateContent(0, kPcmuCodec, kH264Codec, content);
1334 // This is for unified plan, so there can be only one StreamParams.
1335 content->mutable_streams().clear();
1336 content->AddStream(stream);
1337 }
1338
1339 void VerifySimulcastStreamParams(const StreamParams& expected,
1340 const typename T::Channel* channel) {
1341 const std::vector<StreamParams>& streams = channel->local_streams();
1342 ASSERT_EQ(1u, streams.size());
1343 const StreamParams& result = streams[0];
1344 EXPECT_EQ(expected.rids(), result.rids());
1345 EXPECT_TRUE(result.has_ssrcs());
1346 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1347 std::vector<uint32_t> primary_ssrcs;
1348 result.GetPrimarySsrcs(&primary_ssrcs);
1349 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1350 }
1351
1352 void TestUpdateLocalStreamsWithSimulcast() {
1353 CreateChannels(0, 0);
1354 typename T::Content content1, content2, content3;
1355 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001356 std::string err;
1357 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001358 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1359 StreamParams stream1 = channel1_->local_streams()[0];
1360
1361 // Create a similar offer. SetLocalContent should not remove and add.
1362 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001363 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001364 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1365 StreamParams stream2 = channel1_->local_streams()[0];
1366 // Check that the streams are identical (SSRCs didn't change).
1367 EXPECT_EQ(stream1, stream2);
1368
1369 // Create third offer that has same RIDs in different order.
1370 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001371 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001372 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1373 }
1374
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001375 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001376 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1377 static void ProcessThreadQueue(rtc::Thread* thread) {
1378 RTC_DCHECK(thread->IsCurrent());
1379 while (!thread->empty()) {
1380 thread->ProcessMessages(0);
1381 }
1382 }
Tommi1959f8f2021-04-26 10:20:19 +02001383 static void FlushCurrentThread() {
1384 rtc::Thread::Current()->ProcessMessages(0);
1385 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001386 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001387 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001388 for (rtc::Thread* thread : threads) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001389 SendTask(thread, [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 }
1391 ProcessThreadQueue(rtc::Thread::Current());
1392 // Network thread move them around and post back to worker = current thread.
1393 if (!network_thread_->IsCurrent()) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001394 SendTask(network_thread_,
1395 [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001396 }
1397 // Worker thread = current Thread process received messages.
1398 ProcessThreadQueue(rtc::Thread::Current());
1399 }
Tommic9625f02021-05-06 22:03:19 +02001400
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001401 typename T::MediaChannel* media_send_channel1() {
Tommic9625f02021-05-06 22:03:19 +02001402 RTC_DCHECK(channel1_);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001403 RTC_DCHECK(channel1_->media_send_channel());
1404 return static_cast<typename T::MediaChannel*>(
1405 channel1_->media_send_channel());
Tommic9625f02021-05-06 22:03:19 +02001406 }
1407
1408 typename T::MediaChannel* media_channel2() {
1409 RTC_DCHECK(channel2_);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001410 RTC_DCHECK(channel2_->media_send_channel());
1411 return static_cast<typename T::MediaChannel*>(
1412 channel2_->media_send_channel());
Tommic9625f02021-05-06 22:03:19 +02001413 }
1414
Niels Möller83830f32022-05-20 09:12:57 +02001415 rtc::AutoThread main_thread_;
Peter Boström34fbfff2015-09-24 19:20:30 +02001416 // TODO(pbos): Remove playout from all media channels and let renderers mute
1417 // themselves.
1418 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001419 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1420 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001421 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1422 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001423 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1424 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1425 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1426 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1427 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1428 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1429 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1430 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001431 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1432 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1433 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001434 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001435 std::unique_ptr<typename T::Channel> channel1_;
1436 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437 typename T::Content local_media_content1_;
1438 typename T::Content local_media_content2_;
1439 typename T::Content remote_media_content1_;
1440 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001442 rtc::Buffer rtp_packet_;
1443 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001444 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001445 rtc::UniqueRandomIdGenerator ssrc_generator_;
Jonas Orelanded99dae2022-03-09 09:28:10 +01001446 webrtc::test::ScopedKeyValueConfig field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447};
1448
Yves Gerey665174f2018-06-19 15:03:05 +02001449template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001450std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1451 rtc::Thread* worker_thread,
1452 rtc::Thread* network_thread,
1453 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1454 webrtc::RtpTransportInternal* rtp_transport,
1455 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001456 rtc::Thread* signaling_thread = rtc::Thread::Current();
1457 auto channel = std::make_unique<cricket::VoiceChannel>(
1458 worker_thread, network_thread, signaling_thread, std::move(ch),
1459 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1460 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001461 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001462 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001463 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001464 });
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001465 return channel;
1466}
1467
1468template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469void ChannelTest<VoiceTraits>::CreateContent(
1470 int flags,
1471 const cricket::AudioCodec& audio_codec,
1472 const cricket::VideoCodec& video_codec,
1473 cricket::AudioContentDescription* audio) {
1474 audio->AddCodec(audio_codec);
1475 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476}
1477
Yves Gerey665174f2018-06-19 15:03:05 +02001478template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001479void ChannelTest<VoiceTraits>::CopyContent(
1480 const cricket::AudioContentDescription& source,
1481 cricket::AudioContentDescription* audio) {
1482 *audio = source;
1483}
1484
Yves Gerey665174f2018-06-19 15:03:05 +02001485template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1487 const cricket::AudioCodec& c2) {
1488 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001489 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490}
1491
Peter Boström0c4e06b2015-10-07 12:23:21 +02001492template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001494 uint32_t ssrc,
1495 int flags,
1496 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497 audio->AddLegacyStream(ssrc);
1498}
1499
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001500class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501 public:
solenberg1dd98f32015-09-10 01:57:14 -07001502 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001503 VoiceChannelSingleThreadTest()
1504 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1505};
1506
1507class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1508 public:
1509 typedef ChannelTest<VoiceTraits> Base;
1510 VoiceChannelDoubleThreadTest()
1511 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512};
1513
jbauch5869f502017-06-29 12:31:36 -07001514class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001515 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001516 public:
1517 typedef ChannelTest<VoiceTraits> Base;
1518 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001519 : Base(true,
1520 kPcmuFrameWithExtensions,
1521 kRtcpReport,
1522 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001523};
1524
1525class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001526 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001527 public:
1528 typedef ChannelTest<VoiceTraits> Base;
1529 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001530 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1531 }
jbauch5869f502017-06-29 12:31:36 -07001532};
1533
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001535template <>
Steve Anton8699a322017-11-06 15:53:33 -08001536std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001537 rtc::Thread* worker_thread,
1538 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001539 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001540 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001541 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001542 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001543 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001544 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001545 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1546 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001547 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001548 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001549 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001550 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 return channel;
1552}
1553
Yves Gerey665174f2018-06-19 15:03:05 +02001554template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555void ChannelTest<VideoTraits>::CreateContent(
1556 int flags,
1557 const cricket::AudioCodec& audio_codec,
1558 const cricket::VideoCodec& video_codec,
1559 cricket::VideoContentDescription* video) {
1560 video->AddCodec(video_codec);
1561 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562}
1563
Yves Gerey665174f2018-06-19 15:03:05 +02001564template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001565void ChannelTest<VideoTraits>::CopyContent(
1566 const cricket::VideoContentDescription& source,
1567 cricket::VideoContentDescription* video) {
1568 *video = source;
1569}
1570
Yves Gerey665174f2018-06-19 15:03:05 +02001571template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1573 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001574 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575}
1576
Peter Boström0c4e06b2015-10-07 12:23:21 +02001577template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001579 uint32_t ssrc,
1580 int flags,
1581 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 video->AddLegacyStream(ssrc);
1583}
1584
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001585class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586 public:
solenberg1dd98f32015-09-10 01:57:14 -07001587 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001588 VideoChannelSingleThreadTest()
1589 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590};
1591
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001592class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1593 public:
1594 typedef ChannelTest<VideoTraits> Base;
1595 VideoChannelDoubleThreadTest()
1596 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1597};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001599TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 Base::TestInit();
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001601 EXPECT_FALSE(media_send_channel1()->IsStreamMuted(0));
1602 EXPECT_TRUE(media_send_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603}
1604
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001605TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1606 Base::TestDeinit();
1607}
1608
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001609TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610 Base::TestSetContents();
1611}
1612
Johannes Kron9190b822018-10-29 11:22:05 +01001613TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1614 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1615}
1616
1617TEST_F(VoiceChannelSingleThreadTest,
1618 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1619 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1620}
1621
1622TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1623 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1624}
1625
1626TEST_F(VoiceChannelSingleThreadTest,
1627 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1628 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 Base::TestSetContentsNullOffer();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::TestSetContentsRtcpMux();
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 Base::TestSetContentsRtcpMux();
1641}
1642
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 Base::TestChangeStreamParamsInContent();
1645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 Base::TestPlayoutAndSendingStates();
1649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 Base::TestMediaContentDirection();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001656 Base::TestNetworkRouteChanges();
1657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 Base::TestCallSetup();
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 Base::SendRtpToRtp();
1665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001668 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001672 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1677}
1678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 Base::SendRtpToRtpOnThread();
1681}
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 Base::SendWithWritabilityLoss();
1685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 Base::TestSetContentFailure();
1689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692 Base::TestSendTwoOffers();
1693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 Base::TestReceiveTwoOffers();
1697}
1698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001699TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 Base::TestSendPrAnswer();
1701}
1702
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 Base::TestReceivePrAnswer();
1705}
1706
zstein56162b92017-04-24 16:54:35 -07001707TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1708 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709}
1710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001712 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713}
1714
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001715TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001716 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001717}
1718
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001719TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001720 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001721}
1722
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001723TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001724 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725}
1726
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001727TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001728 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001729}
1730
Steve Anton8a63f782017-10-23 13:08:53 -07001731TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1732 Base::SocketOptionsMergedOnSetTransport();
1733}
1734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001735// VoiceChannelDoubleThreadTest
1736TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 Base::TestInit();
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001738 EXPECT_FALSE(media_send_channel1()->IsStreamMuted(0));
1739 EXPECT_TRUE(media_send_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740}
1741
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001742TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1743 Base::TestDeinit();
1744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 Base::TestSetContents();
1748}
1749
Johannes Kron9190b822018-10-29 11:22:05 +01001750TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1751 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1752}
1753
1754TEST_F(VoiceChannelDoubleThreadTest,
1755 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1756 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1757}
1758
1759TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1760 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1761}
1762
1763TEST_F(VoiceChannelDoubleThreadTest,
1764 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1765 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1766}
1767
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001768TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 Base::TestSetContentsNullOffer();
1770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001773 Base::TestSetContentsRtcpMux();
1774}
1775
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 Base::TestSetContentsRtcpMux();
1778}
1779
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 Base::TestChangeStreamParamsInContent();
1782}
1783
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001784TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 Base::TestPlayoutAndSendingStates();
1786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1789 Base::TestMediaContentDirection();
1790}
1791
1792TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1793 Base::TestNetworkRouteChanges();
1794}
1795
1796TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1797 Base::TestCallSetup();
1798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1801 Base::SendRtpToRtp();
1802}
1803
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001804TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001805 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806}
1807
1808TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001809 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001810}
1811
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001812TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1813 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1817 Base::SendRtpToRtpOnThread();
1818}
1819
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001820TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1821 Base::SendWithWritabilityLoss();
1822}
1823
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001824TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1825 Base::TestSetContentFailure();
1826}
1827
1828TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1829 Base::TestSendTwoOffers();
1830}
1831
1832TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1833 Base::TestReceiveTwoOffers();
1834}
1835
1836TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1837 Base::TestSendPrAnswer();
1838}
1839
1840TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1841 Base::TestReceivePrAnswer();
1842}
1843
zstein56162b92017-04-24 16:54:35 -07001844TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1845 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001846}
1847
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001848TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1849 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1850}
1851
1852TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1853 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1854}
1855
1856TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1857 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1858}
1859
1860TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1861 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1862}
1863
1864TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1865 Base::DefaultMaxBitrateIsUnlimited();
1866}
1867
Steve Anton8a63f782017-10-23 13:08:53 -07001868TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1869 Base::SocketOptionsMergedOnSetTransport();
1870}
1871
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001872// VideoChannelSingleThreadTest
1873TEST_F(VideoChannelSingleThreadTest, TestInit) {
1874 Base::TestInit();
1875}
1876
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001877TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1878 Base::TestDeinit();
1879}
1880
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001881TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1882 Base::TestSetContents();
1883}
1884
Johannes Kron9190b822018-10-29 11:22:05 +01001885TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1886 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1887}
1888
1889TEST_F(VideoChannelSingleThreadTest,
1890 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1891 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1892}
1893
1894TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1895 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1896}
1897
1898TEST_F(VideoChannelSingleThreadTest,
1899 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1900 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1904 Base::TestSetContentsNullOffer();
1905}
1906
1907TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1908 Base::TestSetContentsRtcpMux();
1909}
1910
1911TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1912 Base::TestSetContentsRtcpMux();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1916 Base::TestChangeStreamParamsInContent();
1917}
1918
1919TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1920 Base::TestPlayoutAndSendingStates();
1921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 Base::TestMediaContentDirection();
1925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001928 Base::TestNetworkRouteChanges();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 Base::TestCallSetup();
1933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 Base::SendRtpToRtp();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001940 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001944 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945}
1946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 Base::SendRtpToRtpOnThread();
1953}
1954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 Base::SendWithWritabilityLoss();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960 Base::TestSetContentFailure();
1961}
1962
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 Base::TestSendTwoOffers();
1965}
1966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 Base::TestReceiveTwoOffers();
1969}
1970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 Base::TestSendPrAnswer();
1973}
1974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 Base::TestReceivePrAnswer();
1977}
1978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001980 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001984 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001985}
1986
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001987TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001988 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001989}
1990
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001992 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993}
1994
zstein56162b92017-04-24 16:54:35 -07001995TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1996 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997}
1998
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001999TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002000 Base::DefaultMaxBitrateIsUnlimited();
2001}
2002
Steve Anton8a63f782017-10-23 13:08:53 -07002003TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2004 Base::SocketOptionsMergedOnSetTransport();
2005}
2006
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002007TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2008 Base::TestUpdateLocalStreamsWithSimulcast();
2009}
2010
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002011TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2012 const cricket::VideoCodec kVp8Codec(97, "VP8");
2013 cricket::VideoCodec vp9_codec(98, "VP9");
2014 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2015 cricket::VideoContentDescription video;
2016 video.set_codecs({kVp8Codec, vp9_codec});
2017
2018 CreateChannels(0, 0);
2019
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002020 std::string err;
2021 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002022 EXPECT_THAT(media_send_channel1()->send_codecs(), testing::IsEmpty());
2023 ASSERT_THAT(media_send_channel1()->recv_codecs(), testing::SizeIs(2));
2024 EXPECT_TRUE(media_send_channel1()->recv_codecs()[0].Matches(kVp8Codec,
2025 &field_trials_));
2026 EXPECT_EQ(media_send_channel1()->recv_codecs()[0].packetization,
2027 absl::nullopt);
2028 EXPECT_TRUE(media_send_channel1()->recv_codecs()[1].Matches(vp9_codec,
2029 &field_trials_));
2030 EXPECT_EQ(media_send_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002031 cricket::kPacketizationParamRaw);
2032}
2033
2034TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2035 const cricket::VideoCodec kVp8Codec(97, "VP8");
2036 cricket::VideoCodec vp9_codec(98, "VP9");
2037 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2038 cricket::VideoContentDescription video;
2039 video.set_codecs({kVp8Codec, vp9_codec});
2040
2041 CreateChannels(0, 0);
2042
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002043 std::string err;
2044 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2045 EXPECT_TRUE(err.empty());
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002046 EXPECT_THAT(media_send_channel1()->recv_codecs(), testing::IsEmpty());
2047 ASSERT_THAT(media_send_channel1()->send_codecs(), testing::SizeIs(2));
2048 EXPECT_TRUE(media_send_channel1()->send_codecs()[0].Matches(kVp8Codec,
2049 &field_trials_));
2050 EXPECT_EQ(media_send_channel1()->send_codecs()[0].packetization,
2051 absl::nullopt);
2052 EXPECT_TRUE(media_send_channel1()->send_codecs()[1].Matches(vp9_codec,
2053 &field_trials_));
2054 EXPECT_EQ(media_send_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002055 cricket::kPacketizationParamRaw);
2056}
2057
2058TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2059 const cricket::VideoCodec kVp8Codec(97, "VP8");
2060 cricket::VideoCodec vp9_codec(98, "VP9");
2061 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2062 cricket::VideoContentDescription video;
2063 video.set_codecs({kVp8Codec, vp9_codec});
2064
2065 CreateChannels(0, 0);
2066
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002067 std::string err;
2068 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2069 EXPECT_TRUE(err.empty());
2070 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2071 EXPECT_TRUE(err.empty());
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002072 ASSERT_THAT(media_send_channel1()->recv_codecs(), testing::SizeIs(2));
2073 EXPECT_TRUE(media_send_channel1()->recv_codecs()[0].Matches(kVp8Codec,
2074 &field_trials_));
2075 EXPECT_EQ(media_send_channel1()->recv_codecs()[0].packetization,
2076 absl::nullopt);
2077 EXPECT_TRUE(media_send_channel1()->recv_codecs()[1].Matches(vp9_codec,
2078 &field_trials_));
2079 EXPECT_EQ(media_send_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002080 cricket::kPacketizationParamRaw);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002081 EXPECT_THAT(media_send_channel1()->send_codecs(), testing::SizeIs(2));
2082 EXPECT_TRUE(media_send_channel1()->send_codecs()[0].Matches(kVp8Codec,
2083 &field_trials_));
2084 EXPECT_EQ(media_send_channel1()->send_codecs()[0].packetization,
2085 absl::nullopt);
2086 EXPECT_TRUE(media_send_channel1()->send_codecs()[1].Matches(vp9_codec,
2087 &field_trials_));
2088 EXPECT_EQ(media_send_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002089 cricket::kPacketizationParamRaw);
2090}
2091
2092TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2093 const cricket::VideoCodec kLocalCodec(98, "VP8");
2094 cricket::VideoCodec remote_codec(99, "VP8");
2095 remote_codec.packetization = cricket::kPacketizationParamRaw;
2096 cricket::VideoContentDescription local_video;
2097 local_video.set_codecs({kLocalCodec});
2098 cricket::VideoContentDescription remote_video;
2099 remote_video.set_codecs({remote_codec});
2100
2101 CreateChannels(0, 0);
2102
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002103 std::string err;
2104 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2105 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002106 ASSERT_THAT(media_send_channel1()->recv_codecs(), testing::SizeIs(1));
2107 EXPECT_EQ(media_send_channel1()->recv_codecs()[0].packetization,
2108 absl::nullopt);
2109 ASSERT_THAT(media_send_channel1()->send_codecs(), testing::SizeIs(1));
2110 EXPECT_EQ(media_send_channel1()->send_codecs()[0].packetization,
2111 absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002112}
2113
2114TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2115 cricket::VideoCodec local_codec(98, "VP8");
2116 local_codec.packetization = cricket::kPacketizationParamRaw;
2117 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2118 cricket::VideoContentDescription local_video;
2119 local_video.set_codecs({local_codec});
2120 cricket::VideoContentDescription remote_video;
2121 remote_video.set_codecs({kRemoteCodec});
2122
2123 CreateChannels(0, 0);
2124
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002125 std::string err;
2126 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002127 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002128 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002129 ASSERT_THAT(media_send_channel1()->recv_codecs(), testing::SizeIs(1));
2130 EXPECT_EQ(media_send_channel1()->recv_codecs()[0].packetization,
2131 absl::nullopt);
2132 ASSERT_THAT(media_send_channel1()->send_codecs(), testing::SizeIs(1));
2133 EXPECT_EQ(media_send_channel1()->send_codecs()[0].packetization,
2134 absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002135}
2136
2137TEST_F(VideoChannelSingleThreadTest,
2138 TestSetRemoteAnswerWithInvalidPacketization) {
2139 cricket::VideoCodec local_codec(98, "VP8");
2140 local_codec.packetization = cricket::kPacketizationParamRaw;
2141 cricket::VideoCodec remote_codec(99, "VP8");
2142 remote_codec.packetization = "unknownpacketizationattributevalue";
2143 cricket::VideoContentDescription local_video;
2144 local_video.set_codecs({local_codec});
2145 cricket::VideoContentDescription remote_video;
2146 remote_video.set_codecs({remote_codec});
2147
2148 CreateChannels(0, 0);
2149
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002150 std::string err;
2151 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2152 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002153 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002154 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2155 EXPECT_FALSE(err.empty());
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002156 ASSERT_THAT(media_send_channel1()->recv_codecs(), testing::SizeIs(1));
2157 EXPECT_EQ(media_send_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002158 cricket::kPacketizationParamRaw);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002159 EXPECT_THAT(media_send_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002160}
2161
2162TEST_F(VideoChannelSingleThreadTest,
2163 TestSetLocalAnswerWithInvalidPacketization) {
2164 cricket::VideoCodec local_codec(98, "VP8");
2165 local_codec.packetization = cricket::kPacketizationParamRaw;
2166 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2167 cricket::VideoContentDescription local_video;
2168 local_video.set_codecs({local_codec});
2169 cricket::VideoContentDescription remote_video;
2170 remote_video.set_codecs({kRemoteCodec});
2171
2172 CreateChannels(0, 0);
2173
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002174 std::string err;
2175 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2176 EXPECT_TRUE(err.empty());
2177 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2178 EXPECT_FALSE(err.empty());
Harald Alvestrand36fafc82022-12-08 08:47:42 +00002179 EXPECT_THAT(media_send_channel1()->recv_codecs(), testing::IsEmpty());
2180 ASSERT_THAT(media_send_channel1()->send_codecs(), testing::SizeIs(1));
2181 EXPECT_EQ(media_send_channel1()->send_codecs()[0].packetization,
2182 absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002183}
2184
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002185// VideoChannelDoubleThreadTest
2186TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2187 Base::TestInit();
2188}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002190TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2191 Base::TestDeinit();
2192}
2193
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002194TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2195 Base::TestSetContents();
2196}
2197
Johannes Kron9190b822018-10-29 11:22:05 +01002198TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2199 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2200}
2201
2202TEST_F(VideoChannelDoubleThreadTest,
2203 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2204 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2205}
2206
2207TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2208 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2209}
2210
2211TEST_F(VideoChannelDoubleThreadTest,
2212 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2213 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2214}
2215
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002216TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2217 Base::TestSetContentsNullOffer();
2218}
2219
2220TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2221 Base::TestSetContentsRtcpMux();
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2225 Base::TestSetContentsRtcpMux();
2226}
2227
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002228TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2229 Base::TestChangeStreamParamsInContent();
2230}
2231
2232TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2233 Base::TestPlayoutAndSendingStates();
2234}
2235
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002236TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2237 Base::TestMediaContentDirection();
2238}
2239
2240TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2241 Base::TestNetworkRouteChanges();
2242}
2243
2244TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2245 Base::TestCallSetup();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2249 Base::SendRtpToRtp();
2250}
2251
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002252TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002253 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254}
2255
2256TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002257 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002258}
2259
2260TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2261 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2262}
2263
2264TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2265 Base::SendRtpToRtpOnThread();
2266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2269 Base::SendWithWritabilityLoss();
2270}
2271
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002272TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2273 Base::TestSetContentFailure();
2274}
2275
2276TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2277 Base::TestSendTwoOffers();
2278}
2279
2280TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2281 Base::TestReceiveTwoOffers();
2282}
2283
2284TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2285 Base::TestSendPrAnswer();
2286}
2287
2288TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2289 Base::TestReceivePrAnswer();
2290}
2291
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002292TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2293 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2294}
2295
2296TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2297 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2298}
2299
2300TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2301 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2302}
2303
2304TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2305 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2306}
2307
zstein56162b92017-04-24 16:54:35 -07002308TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2309 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002310}
2311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002312TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2313 Base::DefaultMaxBitrateIsUnlimited();
2314}
2315
Steve Anton8a63f782017-10-23 13:08:53 -07002316TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2317 Base::SocketOptionsMergedOnSetTransport();
2318}
2319
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321// TODO(pthatcher): TestSetReceiver?