blob: 725ee349189db90f5434de11f686c70c6330c2b6 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "media/base/fake_media_engine.h"
24#include "media/base/fake_rtp.h"
25#include "media/base/media_channel.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000026#include "media/base/media_constants.h"
27#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080028#include "p2p/base/candidate_pair_interface.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000029#include "p2p/base/dtls_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "p2p/base/fake_dtls_transport.h"
31#include "p2p/base/fake_packet_transport.h"
32#include "p2p/base/ice_transport_internal.h"
33#include "p2p/base/p2p_constants.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000034#include "p2p/base/packet_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "pc/dtls_srtp_transport.h"
36#include "pc/jsep_transport.h"
37#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010038#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020039#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080040#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020041#include "rtc_base/checks.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000042#include "rtc_base/location.h"
Steve Anton10542f22019-01-11 09:11:00 -080043#include "rtc_base/rtc_certificate.h"
44#include "rtc_base/ssl_identity.h"
Tommic9625f02021-05-06 22:03:19 +020045#include "rtc_base/task_utils/pending_task_safety_flag.h"
46#include "rtc_base/task_utils/to_queued_task.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_) {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100137 network_thread_->Invoke<void>(RTC_FROM_HERE, [this]() {
138 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;
288 network_thread_->Invoke<void>(RTC_FROM_HERE, [this]() {
289 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
Niels Möller92430882021-03-18 10:03:19 +0100306 network_thread_->Invoke<void>(
307 RTC_FROM_HERE,
308 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
309 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
310 if (rtcp_packet_transport) {
311 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
312 }
313 });
Zhi Huange830e682018-03-30 10:48:35 -0700314 return rtp_transport;
315 }
316
317 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
318 cricket::DtlsTransportInternal* rtp_dtls_transport,
319 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200320 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100321 rtcp_dtls_transport == nullptr, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700322
Niels Möller92430882021-03-18 10:03:19 +0100323 network_thread_->Invoke<void>(
324 RTC_FROM_HERE,
325 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
326 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
327 rtcp_dtls_transport);
328 });
Zhi Huange830e682018-03-30 10:48:35 -0700329 return dtls_srtp_transport;
330 }
331
deadbeeff5346592017-01-24 21:51:21 -0800332 void ConnectFakeTransports() {
333 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
334 bool asymmetric = false;
335 // Depending on test flags, could be using DTLS or raw packet transport.
336 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
337 fake_rtp_dtls_transport1_->SetDestination(
338 fake_rtp_dtls_transport2_.get(), asymmetric);
339 }
340 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
341 fake_rtcp_dtls_transport1_->SetDestination(
342 fake_rtcp_dtls_transport2_.get(), asymmetric);
343 }
344 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
345 fake_rtp_packet_transport1_->SetDestination(
346 fake_rtp_packet_transport2_.get(), asymmetric);
347 }
348 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
349 fake_rtcp_packet_transport1_->SetDestination(
350 fake_rtcp_packet_transport2_.get(), asymmetric);
351 }
352 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800353 // The transport becoming writable will asynchronously update the send state
354 // on the worker thread; since this test uses the main thread as the worker
355 // thread, we must process the message queue for this to occur.
356 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800357 }
358
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 bool SendInitiate() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000360 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000361 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000362 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 if (result) {
364 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200365 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000366 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000367 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800369 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000370 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000371 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372 }
373 }
374 return result;
375 }
376
377 bool SendAccept() {
378 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200379 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000380 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000382 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 }
384
385 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000386 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000387 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000388 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 if (result) {
390 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000391 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000392 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000393 }
394 return result;
395 }
396
397 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000398 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000400 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 if (result) {
402 channel2_->Enable(true);
403 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000404 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800405 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 }
407 return result;
408 }
409
410 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000411 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000412 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000413 SdpType::kAnswer, err);
414 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000415 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000416 SdpType::kAnswer, err);
417 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 return result;
419 }
420
Tommic9625f02021-05-06 22:03:19 +0200421 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
422 network_thread_->PostTask(webrtc::ToQueuedTask(
423 network_thread_safety_, [media_channel, data = std::move(data)]() {
424 media_channel->SendRtp(data.data(), data.size(),
425 rtc::PacketOptions());
426 }));
427 }
428
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200430 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Tommic9625f02021-05-06 22:03:19 +0200432
433 void SendRtp1(rtc::Buffer data) {
434 SendRtp(media_channel1(), std::move(data));
435 }
436
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200438 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 }
Tommic9625f02021-05-06 22:03:19 +0200440
441 void SendRtp2(rtc::Buffer data) {
442 SendRtp(media_channel2(), std::move(data));
443 }
444
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200447 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200450 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 bool CheckRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200454 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200457 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200460 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200461 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200462 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200464 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200466 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
469 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::SetBE32(data.data() + 8, ssrc);
472 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000473 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000475 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 return data;
477 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478
Tommic9625f02021-05-06 22:03:19 +0200479 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
480 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481
482 void CreateContent(int flags,
483 const cricket::AudioCodec& audio_codec,
484 const cricket::VideoCodec& video_codec,
485 typename T::Content* content) {
486 // overridden in specialized classes
487 }
488 void CopyContent(const typename T::Content& source,
489 typename T::Content* content) {
490 // overridden in specialized classes
491 }
492
Steve Anton18ee1d52017-09-11 11:32:35 -0700493 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700495 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
496 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700497 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700498 AddLegacyStreamInContent(ssrc, 0, content);
499 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 }
501
ossu292d6582016-03-17 02:31:13 -0700502 // Will manage the lifetime of a CallThread, making sure it's
503 // destroyed before this object goes out of scope.
504 class ScopedCallThread {
505 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200506 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100507 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100508 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700509 thread_->Start();
Henrik Boström2deee4b2022-01-20 11:58:05 +0100510 thread_->PostTask(std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700511 }
512
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200513 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700514
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200515 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700516
517 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200518 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700519 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
522 return false; // overridden in specialized classes
523 }
524
Honghai Zhangcc411c02016-03-29 17:27:21 -0700525 cricket::CandidatePairInterface* last_selected_candidate_pair() {
526 return last_selected_candidate_pair_;
527 }
528
Peter Boström0c4e06b2015-10-07 12:23:21 +0200529 void AddLegacyStreamInContent(uint32_t ssrc,
530 int flags,
531 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 // Base implementation.
533 }
534
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200535 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200536 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200537 // network thread, which callers need to factor in.
538 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
539 RTC_DCHECK(channel.get());
540 return network_thread_->Invoke<bool>(
541 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
542 }
543
544 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
545 // returns true.
546 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
547 RTC_DCHECK(channel.get());
548 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
549 return channel->rtp_transport() &&
550 channel->rtp_transport()->rtcp_mux_enabled();
551 });
552 }
553
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 // Tests that can be used by derived classes.
555
556 // Basic sanity check.
557 void TestInit() {
558 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200559 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200560 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200561 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200562 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200563 }
Tommic9625f02021-05-06 22:03:19 +0200564 EXPECT_TRUE(media_channel1()->codecs().empty());
565 EXPECT_TRUE(media_channel1()->recv_streams().empty());
566 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 }
568
569 // Test that SetLocalContent and SetRemoteContent properly configure
570 // the codecs.
571 void TestSetContents() {
572 CreateChannels(0, 0);
573 typename T::Content content;
574 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000575 std::string err;
576 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200577 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000578 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200579 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200580 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200581 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 }
583
Johannes Kron9190b822018-10-29 11:22:05 +0100584 // Test that SetLocalContent and SetRemoteContent properly configure
585 // extmap-allow-mixed.
586 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
587 // For a caller, SetLocalContent() is called first with an offer and next
588 // SetRemoteContent() is called with the answer.
589 CreateChannels(0, 0);
590 typename T::Content content;
591 CreateContent(0, kPcmuCodec, kH264Codec, &content);
592 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
593 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
594 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000595 std::string err;
596 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100597 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000598 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200599 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100600 }
601 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
602 // For a callee, SetRemoteContent() is called first with an offer and next
603 // SetLocalContent() is called with the answer.
604 CreateChannels(0, 0);
605 typename T::Content content;
606 CreateContent(0, kPcmuCodec, kH264Codec, &content);
607 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
608 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
609 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000610 std::string err;
611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100612 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000613 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200614 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100615 }
616
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Test that SetLocalContent and SetRemoteContent properly deals
618 // with an empty offer.
619 void TestSetContentsNullOffer() {
620 CreateChannels(0, 0);
621 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000622 std::string err;
623 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tommic9625f02021-05-06 22:03:19 +0200625 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000626 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200627 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200628 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200629 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 }
631
632 // Test that SetLocalContent and SetRemoteContent properly set RTCP
633 // mux.
634 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800635 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 typename T::Content content;
637 CreateContent(0, kPcmuCodec, kH264Codec, &content);
638 // Both sides agree on mux. Should no longer be a separate RTCP channel.
639 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000640 std::string err;
641 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
642 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000644 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000646 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 }
648
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 // Test that SetLocalContent and SetRemoteContent properly
650 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800651 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 void TestChangeStreamParamsInContent() {
653 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 stream1.id = "stream1";
655 stream1.ssrcs.push_back(kSsrc1);
656 stream1.cname = "stream1_cname";
657
658 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 stream2.id = "stream2";
660 stream2.ssrcs.push_back(kSsrc2);
661 stream2.cname = "stream2_cname";
662
Artem Titov880fa812021-07-30 22:30:23 +0200663 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 CreateChannels(0, 0);
665 typename T::Content content1;
666 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
667 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000668 std::string err;
669 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200670 channel1_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200671 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000673 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200674 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800675 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676
677 // Channel 2 do not send anything.
678 typename T::Content content2;
679 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000680 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200681 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000682 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200683 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200684 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200686 SendCustomRtp1(kSsrc1, 0);
687 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
689
Artem Titov880fa812021-07-30 22:30:23 +0200690 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700692 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000694 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200695 ASSERT_EQ(1u, media_channel2()->send_streams().size());
696 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000698 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200699 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
700 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701
702 // Channel 1 replies but stop sending stream1.
703 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700704 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000705 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200706 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000708 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200709 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200711 SendCustomRtp2(kSsrc2, 0);
712 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
714 }
715
716 // Test that we only start playout and sending at the right times.
717 void TestPlayoutAndSendingStates() {
718 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200719 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200720 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200721 }
Tommic9625f02021-05-06 22:03:19 +0200722 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200723 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200724 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200725 }
Tommic9625f02021-05-06 22:03:19 +0200726 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200727 channel1_->Enable(true);
728 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200729 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200730 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200731 }
Tommic9625f02021-05-06 22:03:19 +0200732 EXPECT_FALSE(media_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000733 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000734 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000735 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200737 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200738 }
Tommic9625f02021-05-06 22:03:19 +0200739 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000741 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200743 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 }
Tommic9625f02021-05-06 22:03:19 +0200745 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000747 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200748 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200749 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200750 }
Tommic9625f02021-05-06 22:03:19 +0200751 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800752 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200753 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200754 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 }
Tommic9625f02021-05-06 22:03:19 +0200756 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200758 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200759 }
Tommic9625f02021-05-06 22:03:19 +0200760 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200761 channel2_->Enable(true);
762 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200765 }
Tommic9625f02021-05-06 22:03:19 +0200766 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000767 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000768 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200770 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200771 }
Tommic9625f02021-05-06 22:03:19 +0200772 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 }
774
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 // Test that changing the MediaContentDirection in the local and remote
776 // session description start playout and sending at the right time.
777 void TestMediaContentDirection() {
778 CreateChannels(0, 0);
779 typename T::Content content1;
780 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
781 typename T::Content content2;
782 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200783 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800784 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785
Tommi1959f8f2021-04-26 10:20:19 +0200786 channel1_->Enable(true);
787 channel2_->Enable(true);
788 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200789 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200790 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200791 }
Tommic9625f02021-05-06 22:03:19 +0200792 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200793 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200794 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200795 }
Tommic9625f02021-05-06 22:03:19 +0200796 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000798 std::string err;
799 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
800 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
801 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800802 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000803 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800804 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805
Peter Boström34fbfff2015-09-24 19:20:30 +0200806 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200807 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200808 }
Tommic9625f02021-05-06 22:03:19 +0200809 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200810 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200811 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200812 }
Tommic9625f02021-05-06 22:03:19 +0200813 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814
Artem Titov880fa812021-07-30 22:30:23 +0200815 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800816 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000817 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800818 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000819 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820
Peter Boström34fbfff2015-09-24 19:20:30 +0200821 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200822 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200823 }
Tommic9625f02021-05-06 22:03:19 +0200824 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200825 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200826 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200827 }
Tommic9625f02021-05-06 22:03:19 +0200828 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829
Artem Titov880fa812021-07-30 22:30:23 +0200830 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800831 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000832 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
833 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834
Peter Boström34fbfff2015-09-24 19:20:30 +0200835 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200836 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200837 }
Tommic9625f02021-05-06 22:03:19 +0200838 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200839 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200840 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200841 }
Tommic9625f02021-05-06 22:03:19 +0200842 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 }
844
Honghai Zhangcc411c02016-03-29 17:27:21 -0700845 // Tests that when the transport channel signals a candidate pair change
846 // event, the media channel will receive a call on the network route change.
847 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700848 static constexpr uint16_t kLocalNetId = 1;
849 static constexpr uint16_t kRemoteNetId = 2;
850 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800851 // Ipv4(20) + UDP(8).
852 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800853 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200854
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800855 CreateChannels(DTLS, DTLS);
856 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700857
Honghai Zhangcc411c02016-03-29 17:27:21 -0700858 typename T::MediaChannel* media_channel1 =
859 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200860 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700861
Zhi Huang942bc2e2017-11-13 13:26:07 -0800862 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200863 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800864 // when creating the channel.
865 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200866 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800867 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800868 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200869 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800870 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200871 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200872 });
873 WaitForThreads();
874 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700875 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200876 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700877
eladalon05b07bb2017-08-24 07:40:16 -0700878 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800879 rtc::NetworkRoute network_route;
880 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100881 network_route.local =
882 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
883 network_route.remote =
884 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800885 network_route.last_sent_packet_id = kLastPacketId;
886 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200887 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800888 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
889
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200890 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200891 });
892 WaitForThreads();
893 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100894 EXPECT_TRUE(media_channel1->last_network_route().connected);
895 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100896 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100897 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100898 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200899 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700900 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800901 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800902 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700903 }
904
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905 // Test setting up a call.
906 void TestCallSetup() {
907 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200908 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200910 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200911 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200912 }
Tommic9625f02021-05-06 22:03:19 +0200913 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200915 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200916 EXPECT_TRUE(media_channel1()->sending());
917 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200918 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200919 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200920 }
Tommic9625f02021-05-06 22:03:19 +0200921 EXPECT_TRUE(media_channel2()->sending());
922 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 }
924
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925 // Send voice RTP data to the other side and ensure it gets there.
926 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700927 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_TRUE(SendInitiate());
929 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200930 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
931 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200932 SendRtp1();
933 SendRtp2();
934 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935 EXPECT_TRUE(CheckRtp1());
936 EXPECT_TRUE(CheckRtp2());
937 EXPECT_TRUE(CheckNoRtp1());
938 EXPECT_TRUE(CheckNoRtp2());
939 }
940
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200941 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800942 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200943 EXPECT_TRUE(SendInitiate());
944 EXPECT_TRUE(SendAccept());
945 SendRtp1();
946 SendRtp2();
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100947
948 DeinitChannels();
949
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200950 // Do not wait, destroy channels.
951 channel1_.reset(nullptr);
952 channel2_.reset(nullptr);
953 }
954
Zhi Huange830e682018-03-30 10:48:35 -0700955 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
956 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200957 EXPECT_FALSE(IsSrtpActive(channel1_));
958 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200960 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200962 EXPECT_TRUE(IsSrtpActive(channel1_));
963 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200964 SendRtp1();
965 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200966 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000967 EXPECT_TRUE(CheckRtp1());
968 EXPECT_TRUE(CheckRtp2());
969 EXPECT_TRUE(CheckNoRtp1());
970 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 }
972
973 // Test that we can send and receive early media when a provisional answer is
974 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
975 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200976 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977
Yves Gerey665174f2018-06-19 15:03:05 +0200978 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
979 EXPECT_TRUE(SendOffer());
980 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200981 EXPECT_TRUE(IsSrtpActive(channel1_));
982 EXPECT_TRUE(IsSrtpActive(channel2_));
983 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
984 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200985 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200986 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
987 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200988 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989
Yves Gerey665174f2018-06-19 15:03:05 +0200990 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200991 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
992 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200993 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994
Yves Gerey665174f2018-06-19 15:03:05 +0200995 // Complete call setup and ensure everything is still OK.
996 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200997 EXPECT_TRUE(IsSrtpActive(channel1_));
998 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200999 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +02001000 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1001 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001002 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001003 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 }
1005
1006 // Test that we properly send RTP without SRTP from a thread.
1007 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001008 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 EXPECT_TRUE(SendInitiate());
1010 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001011 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1012 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001013 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001014 WaitForThreads(involved_threads);
1015 EXPECT_TRUE(CheckRtp1());
1016 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 EXPECT_TRUE(CheckNoRtp1());
1018 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 }
1020
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 // Test that the mediachannel retains its sending state after the transport
1022 // becomes non-writable.
1023 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001024 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 EXPECT_TRUE(SendInitiate());
1026 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001027 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1028 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001029 SendRtp1();
1030 SendRtp2();
1031 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(CheckRtp1());
1033 EXPECT_TRUE(CheckRtp2());
1034 EXPECT_TRUE(CheckNoRtp1());
1035 EXPECT_TRUE(CheckNoRtp2());
1036
wu@webrtc.org97077a32013-10-25 21:18:33 +00001037 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001038 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1039 fake_rtp_dtls_transport1_->SetWritable(false);
1040 });
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
deadbeeff5346592017-01-24 21:51:21 -08001048 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1049 fake_rtp_dtls_transport1_->SetWritable(true);
1050 });
Tommic9625f02021-05-06 22:03:19 +02001051 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001052 SendRtp1();
1053 SendRtp2();
1054 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 EXPECT_TRUE(CheckRtp1());
1056 EXPECT_TRUE(CheckRtp2());
1057 EXPECT_TRUE(CheckNoRtp1());
1058 EXPECT_TRUE(CheckNoRtp2());
1059
1060 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001061 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1062 bool asymmetric = true;
1063 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1064 });
Tommic9625f02021-05-06 22:03:19 +02001065 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066
wu@webrtc.org97077a32013-10-25 21:18:33 +00001067 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001068 SendRtp1();
1069 SendRtp2();
1070 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 EXPECT_TRUE(CheckRtp1());
1072 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001073 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001074
1075 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001076 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001077 bool asymmetric = true;
1078 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1079 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001080 });
Tommic9625f02021-05-06 22:03:19 +02001081 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 SendRtp1();
1083 SendRtp2();
1084 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 EXPECT_TRUE(CheckRtp1());
1086 EXPECT_TRUE(CheckRtp2());
1087 EXPECT_TRUE(CheckNoRtp1());
1088 EXPECT_TRUE(CheckNoRtp2());
1089 }
1090
Yves Gerey665174f2018-06-19 15:03:05 +02001091 void SendBundleToBundle(const int* pl_types,
1092 int len,
1093 bool rtcp_mux,
1094 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001095 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001097 // Only pl_type1 was added to the bundle filter for both `channel1_`
1098 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001099 int pl_type1 = pl_types[0];
1100 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001101 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001102 if (secure)
1103 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001104 if (rtcp_mux) {
1105 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001106 }
1107 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001110
1111 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001112 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1113 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1114 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001115 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001116 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1117 EXPECT_TRUE(CheckNoRtp1());
1118 EXPECT_TRUE(CheckNoRtp2());
1119
Zhi Huang365381f2018-04-13 16:44:34 -07001120 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1121 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001122 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001123 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1124 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 }
1126
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 void TestSetContentFailure() {
1128 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129
Peter Thatchera6d24442015-07-09 21:26:36 -07001130 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001131 std::unique_ptr<typename T::Content> content(
1132 CreateMediaContentWithStream(1));
1133
Tommic9625f02021-05-06 22:03:19 +02001134 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001135 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001136 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001137 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001138 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139
Tommic9625f02021-05-06 22:03:19 +02001140 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001141 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001142 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001143
Tommic9625f02021-05-06 22:03:19 +02001144 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001145 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001146 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 }
1148
1149 void TestSendTwoOffers() {
1150 CreateChannels(0, 0);
1151
Peter Thatchera6d24442015-07-09 21:26:36 -07001152 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001153 std::unique_ptr<typename T::Content> content1(
1154 CreateMediaContentWithStream(1));
1155 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001156 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001157 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158
Steve Anton18ee1d52017-09-11 11:32:35 -07001159 std::unique_ptr<typename T::Content> content2(
1160 CreateMediaContentWithStream(2));
1161 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001162 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001163 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1164 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 }
1166
1167 void TestReceiveTwoOffers() {
1168 CreateChannels(0, 0);
1169
Peter Thatchera6d24442015-07-09 21:26:36 -07001170 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001171 std::unique_ptr<typename T::Content> content1(
1172 CreateMediaContentWithStream(1));
1173 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001174 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001175 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176
Steve Anton18ee1d52017-09-11 11:32:35 -07001177 std::unique_ptr<typename T::Content> content2(
1178 CreateMediaContentWithStream(2));
1179 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001180 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001181 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1182 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 }
1184
1185 void TestSendPrAnswer() {
1186 CreateChannels(0, 0);
1187
Peter Thatchera6d24442015-07-09 21:26:36 -07001188 std::string err;
1189 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001190 std::unique_ptr<typename T::Content> content1(
1191 CreateMediaContentWithStream(1));
1192 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001193 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001194 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195
Peter Thatchera6d24442015-07-09 21:26:36 -07001196 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001197 std::unique_ptr<typename T::Content> content2(
1198 CreateMediaContentWithStream(2));
1199 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001200 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001201 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1202 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203
Peter Thatchera6d24442015-07-09 21:26:36 -07001204 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001205 std::unique_ptr<typename T::Content> content3(
1206 CreateMediaContentWithStream(3));
1207 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001208 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001209 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1210 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1211 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212 }
1213
1214 void TestReceivePrAnswer() {
1215 CreateChannels(0, 0);
1216
Peter Thatchera6d24442015-07-09 21:26:36 -07001217 std::string err;
1218 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001219 std::unique_ptr<typename T::Content> content1(
1220 CreateMediaContentWithStream(1));
1221 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001222 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001223 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224
Peter Thatchera6d24442015-07-09 21:26:36 -07001225 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001226 std::unique_ptr<typename T::Content> content2(
1227 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001228 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001229 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001230 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1231 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232
Peter Thatchera6d24442015-07-09 21:26:36 -07001233 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001234 std::unique_ptr<typename T::Content> content3(
1235 CreateMediaContentWithStream(3));
1236 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001237 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001238 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1239 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1240 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241 }
1242
zstein56162b92017-04-24 16:54:35 -07001243 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001244 CreateChannels(0, 0);
Tommic9625f02021-05-06 22:03:19 +02001245 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001247 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001248 [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001249 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001250 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001252 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001253 [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001254 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001255 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256 }
1257
skvladdc1c62c2016-03-16 19:07:43 -07001258 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1259 typename T::Content content;
1260 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1261 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001262 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001263 }
1264
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001265 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001266 webrtc::RtpParameters parameters;
1267 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001268 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001269 parameters.encodings.push_back(encoding);
1270 return parameters;
1271 }
1272
1273 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001274 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001275 EXPECT_EQ(1UL, parameters.encodings.size());
1276 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1277 }
1278
1279 void DefaultMaxBitrateIsUnlimited() {
1280 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001281 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001282 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001283 SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001284 EXPECT_EQ(media_channel1()->max_bps(), -1);
1285 VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001286 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001287 }
1288
Zhi Huange830e682018-03-30 10:48:35 -07001289 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001290 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001291 // with the options on the new one.
1292
Steve Anton8a63f782017-10-23 13:08:53 -07001293 // For example, audio and video may use separate socket options, but initially
1294 // be unbundled, then later become bundled. When this happens, their preferred
1295 // socket options should be merged to the underlying transport they share.
1296 void SocketOptionsMergedOnSetTransport() {
1297 constexpr int kSndBufSize = 4000;
1298 constexpr int kRcvBufSize = 8000;
1299
Zhi Huange830e682018-03-30 10:48:35 -07001300 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001301
Zhi Huange830e682018-03-30 10:48:35 -07001302 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001303 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001304
Niels Möller92430882021-03-18 10:03:19 +01001305 bool rcv_success, send_success;
1306 int rcv_buf, send_buf;
1307 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tommic9625f02021-05-06 22:03:19 +02001308 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1309 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1310 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1311 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001312 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001313 send_success = fake_rtp_dtls_transport2_->GetOption(
1314 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1315 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1316 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1317 });
1318
1319 ASSERT_TRUE(send_success);
1320 EXPECT_EQ(kSndBufSize, send_buf);
1321 ASSERT_TRUE(rcv_success);
1322 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001323 }
1324
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001325 void CreateSimulcastContent(const std::vector<std::string>& rids,
1326 typename T::Content* content) {
1327 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001328 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001329 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1330 }
1331
1332 StreamParams stream;
1333 stream.set_rids(rid_descriptions);
1334 CreateContent(0, kPcmuCodec, kH264Codec, content);
1335 // This is for unified plan, so there can be only one StreamParams.
1336 content->mutable_streams().clear();
1337 content->AddStream(stream);
1338 }
1339
1340 void VerifySimulcastStreamParams(const StreamParams& expected,
1341 const typename T::Channel* channel) {
1342 const std::vector<StreamParams>& streams = channel->local_streams();
1343 ASSERT_EQ(1u, streams.size());
1344 const StreamParams& result = streams[0];
1345 EXPECT_EQ(expected.rids(), result.rids());
1346 EXPECT_TRUE(result.has_ssrcs());
1347 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1348 std::vector<uint32_t> primary_ssrcs;
1349 result.GetPrimarySsrcs(&primary_ssrcs);
1350 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1351 }
1352
1353 void TestUpdateLocalStreamsWithSimulcast() {
1354 CreateChannels(0, 0);
1355 typename T::Content content1, content2, content3;
1356 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001357 std::string err;
1358 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001359 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1360 StreamParams stream1 = channel1_->local_streams()[0];
1361
1362 // Create a similar offer. SetLocalContent should not remove and add.
1363 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001364 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001365 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1366 StreamParams stream2 = channel1_->local_streams()[0];
1367 // Check that the streams are identical (SSRCs didn't change).
1368 EXPECT_EQ(stream1, stream2);
1369
1370 // Create third offer that has same RIDs in different order.
1371 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001372 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001373 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1374 }
1375
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001377 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1378 static void ProcessThreadQueue(rtc::Thread* thread) {
1379 RTC_DCHECK(thread->IsCurrent());
1380 while (!thread->empty()) {
1381 thread->ProcessMessages(0);
1382 }
1383 }
Tommi1959f8f2021-04-26 10:20:19 +02001384 static void FlushCurrentThread() {
1385 rtc::Thread::Current()->ProcessMessages(0);
1386 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001387 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001388 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001389 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001390 thread->Invoke<void>(RTC_FROM_HERE,
1391 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001392 }
1393 ProcessThreadQueue(rtc::Thread::Current());
1394 // Network thread move them around and post back to worker = current thread.
1395 if (!network_thread_->IsCurrent()) {
1396 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001397 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001398 }
1399 // Worker thread = current Thread process received messages.
1400 ProcessThreadQueue(rtc::Thread::Current());
1401 }
Tommic9625f02021-05-06 22:03:19 +02001402
1403 typename T::MediaChannel* media_channel1() {
1404 RTC_DCHECK(channel1_);
1405 RTC_DCHECK(channel1_->media_channel());
1406 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1407 }
1408
1409 typename T::MediaChannel* media_channel2() {
1410 RTC_DCHECK(channel2_);
1411 RTC_DCHECK(channel2_->media_channel());
1412 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1413 }
1414
Peter Boström34fbfff2015-09-24 19:20:30 +02001415 // TODO(pbos): Remove playout from all media channels and let renderers mute
1416 // themselves.
1417 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001418 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1419 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001420 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1421 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001422 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1423 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1424 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1425 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1426 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1427 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1428 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1429 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001430 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1431 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1432 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001433 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001434 std::unique_ptr<typename T::Channel> channel1_;
1435 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001436 typename T::Content local_media_content1_;
1437 typename T::Content local_media_content2_;
1438 typename T::Content remote_media_content1_;
1439 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001441 rtc::Buffer rtp_packet_;
1442 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001443 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001444 rtc::UniqueRandomIdGenerator ssrc_generator_;
Jonas Orelanded99dae2022-03-09 09:28:10 +01001445 webrtc::test::ScopedKeyValueConfig field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446};
1447
Yves Gerey665174f2018-06-19 15:03:05 +02001448template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001449std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1450 rtc::Thread* worker_thread,
1451 rtc::Thread* network_thread,
1452 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1453 webrtc::RtpTransportInternal* rtp_transport,
1454 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001455 rtc::Thread* signaling_thread = rtc::Thread::Current();
1456 auto channel = std::make_unique<cricket::VoiceChannel>(
1457 worker_thread, network_thread, signaling_thread, std::move(ch),
1458 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1459 &ssrc_generator_);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001460 network_thread->Invoke<void>(RTC_FROM_HERE, [&]() {
1461 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001462 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001463 });
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001464 return channel;
1465}
1466
1467template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468void ChannelTest<VoiceTraits>::CreateContent(
1469 int flags,
1470 const cricket::AudioCodec& audio_codec,
1471 const cricket::VideoCodec& video_codec,
1472 cricket::AudioContentDescription* audio) {
1473 audio->AddCodec(audio_codec);
1474 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001475}
1476
Yves Gerey665174f2018-06-19 15:03:05 +02001477template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478void ChannelTest<VoiceTraits>::CopyContent(
1479 const cricket::AudioContentDescription& source,
1480 cricket::AudioContentDescription* audio) {
1481 *audio = source;
1482}
1483
Yves Gerey665174f2018-06-19 15:03:05 +02001484template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001485bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1486 const cricket::AudioCodec& c2) {
1487 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001488 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001489}
1490
Peter Boström0c4e06b2015-10-07 12:23:21 +02001491template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001493 uint32_t ssrc,
1494 int flags,
1495 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496 audio->AddLegacyStream(ssrc);
1497}
1498
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001499class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500 public:
solenberg1dd98f32015-09-10 01:57:14 -07001501 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001502 VoiceChannelSingleThreadTest()
1503 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1504};
1505
1506class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1507 public:
1508 typedef ChannelTest<VoiceTraits> Base;
1509 VoiceChannelDoubleThreadTest()
1510 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511};
1512
jbauch5869f502017-06-29 12:31:36 -07001513class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001514 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001515 public:
1516 typedef ChannelTest<VoiceTraits> Base;
1517 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001518 : Base(true,
1519 kPcmuFrameWithExtensions,
1520 kRtcpReport,
1521 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001522};
1523
1524class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001525 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001526 public:
1527 typedef ChannelTest<VoiceTraits> Base;
1528 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001529 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1530 }
jbauch5869f502017-06-29 12:31:36 -07001531};
1532
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001534template <>
Steve Anton8699a322017-11-06 15:53:33 -08001535std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001536 rtc::Thread* worker_thread,
1537 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001538 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001539 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001540 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001541 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001542 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001543 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001544 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1545 &ssrc_generator_);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001546 network_thread->Invoke<void>(RTC_FROM_HERE, [&]() {
1547 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001548 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001549 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 return channel;
1551}
1552
Yves Gerey665174f2018-06-19 15:03:05 +02001553template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554void ChannelTest<VideoTraits>::CreateContent(
1555 int flags,
1556 const cricket::AudioCodec& audio_codec,
1557 const cricket::VideoCodec& video_codec,
1558 cricket::VideoContentDescription* video) {
1559 video->AddCodec(video_codec);
1560 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561}
1562
Yves Gerey665174f2018-06-19 15:03:05 +02001563template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564void ChannelTest<VideoTraits>::CopyContent(
1565 const cricket::VideoContentDescription& source,
1566 cricket::VideoContentDescription* video) {
1567 *video = source;
1568}
1569
Yves Gerey665174f2018-06-19 15:03:05 +02001570template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1572 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001573 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001574}
1575
Peter Boström0c4e06b2015-10-07 12:23:21 +02001576template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001578 uint32_t ssrc,
1579 int flags,
1580 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 video->AddLegacyStream(ssrc);
1582}
1583
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001584class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585 public:
solenberg1dd98f32015-09-10 01:57:14 -07001586 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001587 VideoChannelSingleThreadTest()
1588 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001589};
1590
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001591class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1592 public:
1593 typedef ChannelTest<VideoTraits> Base;
1594 VideoChannelDoubleThreadTest()
1595 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1596};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001598TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001600 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1601 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602}
1603
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001604TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1605 Base::TestDeinit();
1606}
1607
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001608TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 Base::TestSetContents();
1610}
1611
Johannes Kron9190b822018-10-29 11:22:05 +01001612TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1613 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1614}
1615
1616TEST_F(VoiceChannelSingleThreadTest,
1617 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1618 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1619}
1620
1621TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1622 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1623}
1624
1625TEST_F(VoiceChannelSingleThreadTest,
1626 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1627 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 Base::TestSetContentsNullOffer();
1632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::TestSetContentsRtcpMux();
1636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 Base::TestSetContentsRtcpMux();
1640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 Base::TestChangeStreamParamsInContent();
1644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 Base::TestPlayoutAndSendingStates();
1648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 Base::TestMediaContentDirection();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001655 Base::TestNetworkRouteChanges();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::TestCallSetup();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::SendRtpToRtp();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001667 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001671 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::SendRtpToRtpOnThread();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::SendWithWritabilityLoss();
1684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 Base::TestSetContentFailure();
1688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::TestSendTwoOffers();
1692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 Base::TestReceiveTwoOffers();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 Base::TestSendPrAnswer();
1700}
1701
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 Base::TestReceivePrAnswer();
1704}
1705
zstein56162b92017-04-24 16:54:35 -07001706TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1707 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708}
1709
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001711 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712}
1713
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001715 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001719 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001723 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001727 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001728}
1729
Steve Anton8a63f782017-10-23 13:08:53 -07001730TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1731 Base::SocketOptionsMergedOnSetTransport();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734// VoiceChannelDoubleThreadTest
1735TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001736 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001737 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1738 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739}
1740
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001741TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1742 Base::TestDeinit();
1743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 Base::TestSetContents();
1747}
1748
Johannes Kron9190b822018-10-29 11:22:05 +01001749TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1750 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1751}
1752
1753TEST_F(VoiceChannelDoubleThreadTest,
1754 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1755 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1756}
1757
1758TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1759 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1760}
1761
1762TEST_F(VoiceChannelDoubleThreadTest,
1763 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1764 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1765}
1766
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001767TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 Base::TestSetContentsNullOffer();
1769}
1770
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001771TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 Base::TestSetContentsRtcpMux();
1773}
1774
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001775TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 Base::TestSetContentsRtcpMux();
1777}
1778
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001779TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 Base::TestChangeStreamParamsInContent();
1781}
1782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 Base::TestPlayoutAndSendingStates();
1785}
1786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1788 Base::TestMediaContentDirection();
1789}
1790
1791TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1792 Base::TestNetworkRouteChanges();
1793}
1794
1795TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1796 Base::TestCallSetup();
1797}
1798
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001799TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1800 Base::SendRtpToRtp();
1801}
1802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001803TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001804 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001805}
1806
1807TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001808 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001809}
1810
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001811TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1812 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1813}
1814
1815TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1816 Base::SendRtpToRtpOnThread();
1817}
1818
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001819TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1820 Base::SendWithWritabilityLoss();
1821}
1822
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1824 Base::TestSetContentFailure();
1825}
1826
1827TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1828 Base::TestSendTwoOffers();
1829}
1830
1831TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1832 Base::TestReceiveTwoOffers();
1833}
1834
1835TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1836 Base::TestSendPrAnswer();
1837}
1838
1839TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1840 Base::TestReceivePrAnswer();
1841}
1842
zstein56162b92017-04-24 16:54:35 -07001843TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1844 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001845}
1846
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1848 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1849}
1850
1851TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1852 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1853}
1854
1855TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1856 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1857}
1858
1859TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1860 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1861}
1862
1863TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1864 Base::DefaultMaxBitrateIsUnlimited();
1865}
1866
Steve Anton8a63f782017-10-23 13:08:53 -07001867TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1868 Base::SocketOptionsMergedOnSetTransport();
1869}
1870
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001871// VideoChannelSingleThreadTest
1872TEST_F(VideoChannelSingleThreadTest, TestInit) {
1873 Base::TestInit();
1874}
1875
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001876TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1877 Base::TestDeinit();
1878}
1879
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001880TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1881 Base::TestSetContents();
1882}
1883
Johannes Kron9190b822018-10-29 11:22:05 +01001884TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1885 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1886}
1887
1888TEST_F(VideoChannelSingleThreadTest,
1889 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1890 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1891}
1892
1893TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1894 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1895}
1896
1897TEST_F(VideoChannelSingleThreadTest,
1898 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1899 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1903 Base::TestSetContentsNullOffer();
1904}
1905
1906TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1907 Base::TestSetContentsRtcpMux();
1908}
1909
1910TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1911 Base::TestSetContentsRtcpMux();
1912}
1913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001914TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1915 Base::TestChangeStreamParamsInContent();
1916}
1917
1918TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1919 Base::TestPlayoutAndSendingStates();
1920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 Base::TestMediaContentDirection();
1924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001927 Base::TestNetworkRouteChanges();
1928}
1929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 Base::TestCallSetup();
1932}
1933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 Base::SendRtpToRtp();
1936}
1937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001938TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001939 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940}
1941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001943 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944}
1945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 Base::SendRtpToRtpOnThread();
1952}
1953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 Base::SendWithWritabilityLoss();
1956}
1957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 Base::TestSetContentFailure();
1960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 Base::TestSendTwoOffers();
1964}
1965
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001966TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 Base::TestReceiveTwoOffers();
1968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 Base::TestSendPrAnswer();
1972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 Base::TestReceivePrAnswer();
1976}
1977
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001978TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001979 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001983 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001984}
1985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001986TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001987 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001988}
1989
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001990TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001991 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
zstein56162b92017-04-24 16:54:35 -07001994TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1995 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996}
1997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001999 Base::DefaultMaxBitrateIsUnlimited();
2000}
2001
Steve Anton8a63f782017-10-23 13:08:53 -07002002TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2003 Base::SocketOptionsMergedOnSetTransport();
2004}
2005
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002006TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2007 Base::TestUpdateLocalStreamsWithSimulcast();
2008}
2009
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002010TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2011 const cricket::VideoCodec kVp8Codec(97, "VP8");
2012 cricket::VideoCodec vp9_codec(98, "VP9");
2013 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2014 cricket::VideoContentDescription video;
2015 video.set_codecs({kVp8Codec, vp9_codec});
2016
2017 CreateChannels(0, 0);
2018
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002019 std::string err;
2020 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02002021 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2022 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
Jonas Oreland4476b822022-03-10 15:21:28 +01002023 EXPECT_TRUE(
2024 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002025 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
Jonas Oreland4476b822022-03-10 15:21:28 +01002026 EXPECT_TRUE(
2027 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002028 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002029 cricket::kPacketizationParamRaw);
2030}
2031
2032TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2033 const cricket::VideoCodec kVp8Codec(97, "VP8");
2034 cricket::VideoCodec vp9_codec(98, "VP9");
2035 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2036 cricket::VideoContentDescription video;
2037 video.set_codecs({kVp8Codec, vp9_codec});
2038
2039 CreateChannels(0, 0);
2040
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002041 std::string err;
2042 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2043 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002044 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2045 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
Jonas Oreland4476b822022-03-10 15:21:28 +01002046 EXPECT_TRUE(
2047 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002048 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Jonas Oreland4476b822022-03-10 15:21:28 +01002049 EXPECT_TRUE(
2050 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002051 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002052 cricket::kPacketizationParamRaw);
2053}
2054
2055TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2056 const cricket::VideoCodec kVp8Codec(97, "VP8");
2057 cricket::VideoCodec vp9_codec(98, "VP9");
2058 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2059 cricket::VideoContentDescription video;
2060 video.set_codecs({kVp8Codec, vp9_codec});
2061
2062 CreateChannels(0, 0);
2063
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002064 std::string err;
2065 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2066 EXPECT_TRUE(err.empty());
2067 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2068 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002069 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
Jonas Oreland4476b822022-03-10 15:21:28 +01002070 EXPECT_TRUE(
2071 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002072 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
Jonas Oreland4476b822022-03-10 15:21:28 +01002073 EXPECT_TRUE(
2074 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002075 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002076 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002077 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
Jonas Oreland4476b822022-03-10 15:21:28 +01002078 EXPECT_TRUE(
2079 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002080 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Jonas Oreland4476b822022-03-10 15:21:28 +01002081 EXPECT_TRUE(
2082 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
Tommic9625f02021-05-06 22:03:19 +02002083 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002084 cricket::kPacketizationParamRaw);
2085}
2086
2087TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2088 const cricket::VideoCodec kLocalCodec(98, "VP8");
2089 cricket::VideoCodec remote_codec(99, "VP8");
2090 remote_codec.packetization = cricket::kPacketizationParamRaw;
2091 cricket::VideoContentDescription local_video;
2092 local_video.set_codecs({kLocalCodec});
2093 cricket::VideoContentDescription remote_video;
2094 remote_video.set_codecs({remote_codec});
2095
2096 CreateChannels(0, 0);
2097
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002098 std::string err;
2099 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2100 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002101 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2102 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2103 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2104 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002105}
2106
2107TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2108 cricket::VideoCodec local_codec(98, "VP8");
2109 local_codec.packetization = cricket::kPacketizationParamRaw;
2110 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2111 cricket::VideoContentDescription local_video;
2112 local_video.set_codecs({local_codec});
2113 cricket::VideoContentDescription remote_video;
2114 remote_video.set_codecs({kRemoteCodec});
2115
2116 CreateChannels(0, 0);
2117
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002118 std::string err;
2119 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002120 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002121 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002122 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2123 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2124 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2125 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002126}
2127
2128TEST_F(VideoChannelSingleThreadTest,
2129 TestSetRemoteAnswerWithInvalidPacketization) {
2130 cricket::VideoCodec local_codec(98, "VP8");
2131 local_codec.packetization = cricket::kPacketizationParamRaw;
2132 cricket::VideoCodec remote_codec(99, "VP8");
2133 remote_codec.packetization = "unknownpacketizationattributevalue";
2134 cricket::VideoContentDescription local_video;
2135 local_video.set_codecs({local_codec});
2136 cricket::VideoContentDescription remote_video;
2137 remote_video.set_codecs({remote_codec});
2138
2139 CreateChannels(0, 0);
2140
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002141 std::string err;
2142 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2143 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002144 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002145 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2146 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002147 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2148 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002149 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002150 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002151}
2152
2153TEST_F(VideoChannelSingleThreadTest,
2154 TestSetLocalAnswerWithInvalidPacketization) {
2155 cricket::VideoCodec local_codec(98, "VP8");
2156 local_codec.packetization = cricket::kPacketizationParamRaw;
2157 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2158 cricket::VideoContentDescription local_video;
2159 local_video.set_codecs({local_codec});
2160 cricket::VideoContentDescription remote_video;
2161 remote_video.set_codecs({kRemoteCodec});
2162
2163 CreateChannels(0, 0);
2164
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002165 std::string err;
2166 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2167 EXPECT_TRUE(err.empty());
2168 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2169 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002170 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2171 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2172 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002173}
2174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002175// VideoChannelDoubleThreadTest
2176TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2177 Base::TestInit();
2178}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002180TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2181 Base::TestDeinit();
2182}
2183
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002184TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2185 Base::TestSetContents();
2186}
2187
Johannes Kron9190b822018-10-29 11:22:05 +01002188TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2189 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2190}
2191
2192TEST_F(VideoChannelDoubleThreadTest,
2193 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2194 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2198 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2199}
2200
2201TEST_F(VideoChannelDoubleThreadTest,
2202 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2203 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2204}
2205
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002206TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2207 Base::TestSetContentsNullOffer();
2208}
2209
2210TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2211 Base::TestSetContentsRtcpMux();
2212}
2213
2214TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2215 Base::TestSetContentsRtcpMux();
2216}
2217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002218TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2219 Base::TestChangeStreamParamsInContent();
2220}
2221
2222TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2223 Base::TestPlayoutAndSendingStates();
2224}
2225
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002226TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2227 Base::TestMediaContentDirection();
2228}
2229
2230TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2231 Base::TestNetworkRouteChanges();
2232}
2233
2234TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2235 Base::TestCallSetup();
2236}
2237
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002238TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2239 Base::SendRtpToRtp();
2240}
2241
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002242TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002243 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244}
2245
2246TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002247 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248}
2249
2250TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2251 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2252}
2253
2254TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2255 Base::SendRtpToRtpOnThread();
2256}
2257
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002258TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2259 Base::SendWithWritabilityLoss();
2260}
2261
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002262TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2263 Base::TestSetContentFailure();
2264}
2265
2266TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2267 Base::TestSendTwoOffers();
2268}
2269
2270TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2271 Base::TestReceiveTwoOffers();
2272}
2273
2274TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2275 Base::TestSendPrAnswer();
2276}
2277
2278TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2279 Base::TestReceivePrAnswer();
2280}
2281
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002282TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2283 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2284}
2285
2286TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2287 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2288}
2289
2290TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2291 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2292}
2293
2294TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2295 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2296}
2297
zstein56162b92017-04-24 16:54:35 -07002298TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2299 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002300}
2301
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2303 Base::DefaultMaxBitrateIsUnlimited();
2304}
2305
Steve Anton8a63f782017-10-23 13:08:53 -07002306TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2307 Base::SocketOptionsMergedOnSetTransport();
2308}
2309
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311// TODO(pthatcher): TestSetReceiver?