blob: 27ad96aa3fdff9b52b0e8bc701b07cc97eeced6f [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Harald Alvestrandc24a2182022-02-23 13:44:59 +000013#include <stddef.h>
14
Yves Gerey3e707812018-11-28 16:47:49 +010015#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000016#include <string>
17#include <type_traits>
kwiberg31022942016-03-11 14:18:21 -080018
Danil Chapovalova30439b2022-07-07 10:08:49 +020019#include "absl/functional/any_invocable.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/rtp_parameters.h"
Artem Titovc374d112022-06-16 21:27:45 +020023#include "api/task_queue/pending_task_safety_flag.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "media/base/fake_media_engine.h"
26#include "media/base/fake_rtp.h"
27#include "media/base/media_channel.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000028#include "media/base/media_constants.h"
29#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "p2p/base/candidate_pair_interface.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000031#include "p2p/base/dtls_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080032#include "p2p/base/fake_dtls_transport.h"
33#include "p2p/base/fake_packet_transport.h"
34#include "p2p/base/ice_transport_internal.h"
35#include "p2p/base/p2p_constants.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000036#include "p2p/base/packet_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "pc/dtls_srtp_transport.h"
38#include "pc/jsep_transport.h"
39#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020041#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080042#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020043#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080044#include "rtc_base/rtc_certificate.h"
45#include "rtc_base/ssl_identity.h"
Danil Chapovalov2aaef452022-08-12 15:55:11 +020046#include "rtc_base/task_queue_for_test.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020047#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "test/gtest.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010049#include "test/scoped_key_value_config.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
zhihuangb2cdd932017-01-19 16:54:25 -080051using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080053using cricket::RidDescription;
54using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080056using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080057using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058
Danil Chapovalov33b01f22016-05-11 19:55:27 +020059namespace {
60const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
61const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
62const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070063const cricket::VideoCodec kH264Codec(97, "H264");
64const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065const uint32_t kSsrc1 = 0x1111;
66const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070067const uint32_t kSsrc3 = 0x3333;
68const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020069const int kAudioPts[] = {0, 8};
70const int kVideoPts[] = {97, 99};
71enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010072
Danil Chapovalov33b01f22016-05-11 19:55:27 +020073} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
deadbeefcbecd352015-09-23 11:50:27 -070075template <class ChannelT,
76 class MediaChannelT,
Harald Alvestrand50454ef2022-12-15 16:49:13 +000077 class MediaSendChannelT,
78 class MediaReceiveChannelT,
deadbeefcbecd352015-09-23 11:50:27 -070079 class ContentT,
80 class CodecT,
81 class MediaInfoT,
82 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083class Traits {
84 public:
85 typedef ChannelT Channel;
86 typedef MediaChannelT MediaChannel;
Harald Alvestrand50454ef2022-12-15 16:49:13 +000087 typedef MediaSendChannelT MediaSendChannel;
88 typedef MediaReceiveChannelT MediaReceiveChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089 typedef ContentT Content;
90 typedef CodecT Codec;
91 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020092 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093};
94
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095class VoiceTraits : public Traits<cricket::VoiceChannel,
96 cricket::FakeVoiceMediaChannel,
Harald Alvestrand50454ef2022-12-15 16:49:13 +000097 cricket::VoiceMediaSendChannelInterface,
98 cricket::VoiceMediaReceiveChannelInterface,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 cricket::AudioContentDescription,
100 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200101 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700102 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
104class VideoTraits : public Traits<cricket::VideoChannel,
105 cricket::FakeVideoMediaChannel,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000106 cricket::VideoMediaSendChannelInterface,
107 cricket::VideoMediaReceiveChannelInterface,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 cricket::VideoContentDescription,
109 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200110 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700111 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112
Harald Alvestrand48171ec2021-04-20 15:06:03 +0000113// Base class for Voice/Video tests
Yves Gerey665174f2018-06-19 15:03:05 +0200114template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200115class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 public:
deadbeefac22f702017-01-12 21:59:29 -0800117 enum Flags {
118 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800119 SSRC_MUX = 0x8,
120 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800121 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800122 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700123 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800124 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125
Peter Boström34fbfff2015-09-24 19:20:30 +0200126 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 rtc::ArrayView<const uint8_t> rtp_data,
128 rtc::ArrayView<const uint8_t> rtcp_data,
129 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200130 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200131 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800132 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200133 if (network_is_worker == NetworkIsWorker::Yes) {
134 network_thread_ = rtc::Thread::Current();
135 } else {
136 network_thread_keeper_ = rtc::Thread::Create();
137 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 network_thread_ = network_thread_keeper_.get();
139 }
Tommic9625f02021-05-06 22:03:19 +0200140 RTC_DCHECK(network_thread_);
141 }
142
143 ~ChannelTest() {
144 if (network_thread_) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200145 SendTask(network_thread_, [this]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100146 network_thread_safety_->SetNotAlive();
147 DeinitChannels();
148 });
Tommic9625f02021-05-06 22:03:19 +0200149 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200150 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200153 CreateChannels(std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200154 nullptr, typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200155 std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200156 nullptr, typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200157 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 }
Steve Anton8699a322017-11-06 15:53:33 -0800159 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
160 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200161 int flags1,
162 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200163 RTC_DCHECK(!channel1_);
164 RTC_DCHECK(!channel2_);
165
deadbeeff5346592017-01-24 21:51:21 -0800166 // Network thread is started in CreateChannels, to allow the test to
167 // configure a fake clock before any threads are spawned and attempt to
168 // access the time.
169 if (network_thread_keeper_) {
170 network_thread_keeper_->Start();
171 }
Zhi Huange830e682018-03-30 10:48:35 -0700172
deadbeeff5346592017-01-24 21:51:21 -0800173 // Make sure if using raw packet transports, they're used for both
174 // channels.
175 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200176 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeeff5346592017-01-24 21:51:21 -0800177 // Based on flags, create fake DTLS or raw packet transports.
178 if (flags1 & RAW_PACKET_TRANSPORT) {
179 fake_rtp_packet_transport1_.reset(
180 new rtc::FakePacketTransport("channel1_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700181 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800182 fake_rtcp_packet_transport1_.reset(
183 new rtc::FakePacketTransport("channel1_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800184 }
185 } else {
186 // Confirmed to work with KT_RSA and KT_ECDSA.
187 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100188 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700189 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800190 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100191 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
192 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800193 }
194 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100195 auto cert1 = rtc::RTCCertificate::Create(
196 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800197 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
198 if (fake_rtcp_dtls_transport1_) {
199 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
200 }
201 }
202 }
203 // Based on flags, create fake DTLS or raw packet transports.
204 if (flags2 & RAW_PACKET_TRANSPORT) {
205 fake_rtp_packet_transport2_.reset(
206 new rtc::FakePacketTransport("channel2_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700207 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800208 fake_rtcp_packet_transport2_.reset(
209 new rtc::FakePacketTransport("channel2_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800210 }
211 } else {
212 // Confirmed to work with KT_RSA and KT_ECDSA.
213 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100214 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700215 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800216 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100217 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
218 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800219 }
220 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100221 auto cert2 = rtc::RTCCertificate::Create(
222 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800223 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
224 if (fake_rtcp_dtls_transport2_) {
225 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
226 }
227 }
228 }
Zhi Huange830e682018-03-30 10:48:35 -0700229 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
230 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
231 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
232 flags1);
233 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
234 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
235 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
236 flags2);
237
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800238 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
239 rtp_transport1_.get(), flags1);
240 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
241 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200242 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
243 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000244 CopyContent(local_media_content1_, &remote_media_content1_);
245 CopyContent(local_media_content2_, &remote_media_content2_);
246
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000247 // Add stream information (SSRC) to the local content but not to the remote
248 // content. This means that we per default know the SSRC of what we send but
249 // not what we receive.
250 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
251 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
252
253 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
254 if (flags1 & SSRC_MUX) {
255 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
256 }
257 if (flags2 & SSRC_MUX) {
258 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
259 }
260 }
Steve Anton8699a322017-11-06 15:53:33 -0800261 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200262 rtc::Thread* worker_thread,
263 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800264 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700265 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200266 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000267
Zhi Huange830e682018-03-30 10:48:35 -0700268 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
269 rtc::PacketTransportInternal* rtp_packet_transport,
270 rtc::PacketTransportInternal* rtcp_packet_transport,
271 DtlsTransportInternal* rtp_dtls_transport,
272 DtlsTransportInternal* rtcp_dtls_transport,
273 int flags) {
274 if (flags & RTCP_MUX) {
275 rtcp_packet_transport = nullptr;
276 rtcp_dtls_transport = nullptr;
277 }
278
279 if (flags & DTLS) {
280 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
281 } else {
282 if (flags & RAW_PACKET_TRANSPORT) {
283 return CreateUnencryptedTransport(rtp_packet_transport,
284 rtcp_packet_transport);
285 } else {
286 return CreateUnencryptedTransport(rtp_dtls_transport,
287 rtcp_dtls_transport);
288 }
289 }
290 }
291
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100292 // Unininitializes the channels on the network thread.
293 void DeinitChannels() {
294 if (!channel1_ && !channel2_)
295 return;
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200296 SendTask(network_thread_, [this]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100297 if (channel1_) {
298 RTC_DCHECK_RUN_ON(channel1_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100299 channel1_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100300 }
301 if (channel2_) {
302 RTC_DCHECK_RUN_ON(channel2_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100303 channel2_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100304 }
305 });
306 }
307
Zhi Huange830e682018-03-30 10:48:35 -0700308 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
309 rtc::PacketTransportInternal* rtp_packet_transport,
310 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200311 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200312 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700313
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200314 SendTask(network_thread_,
315 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
316 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
317 if (rtcp_packet_transport) {
318 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
319 }
320 });
Zhi Huange830e682018-03-30 10:48:35 -0700321 return rtp_transport;
322 }
323
324 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
325 cricket::DtlsTransportInternal* rtp_dtls_transport,
326 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200327 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100328 rtcp_dtls_transport == nullptr, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700329
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200330 SendTask(network_thread_,
331 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
332 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
333 rtcp_dtls_transport);
334 });
Zhi Huange830e682018-03-30 10:48:35 -0700335 return dtls_srtp_transport;
336 }
337
deadbeeff5346592017-01-24 21:51:21 -0800338 void ConnectFakeTransports() {
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200339 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -0800340 bool asymmetric = false;
341 // Depending on test flags, could be using DTLS or raw packet transport.
342 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
343 fake_rtp_dtls_transport1_->SetDestination(
344 fake_rtp_dtls_transport2_.get(), asymmetric);
345 }
346 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
347 fake_rtcp_dtls_transport1_->SetDestination(
348 fake_rtcp_dtls_transport2_.get(), asymmetric);
349 }
350 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
351 fake_rtp_packet_transport1_->SetDestination(
352 fake_rtp_packet_transport2_.get(), asymmetric);
353 }
354 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
355 fake_rtcp_packet_transport1_->SetDestination(
356 fake_rtcp_packet_transport2_.get(), asymmetric);
357 }
358 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800359 // The transport becoming writable will asynchronously update the send state
360 // on the worker thread; since this test uses the main thread as the worker
361 // thread, we must process the message queue for this to occur.
362 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800363 }
364
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000365 bool SendInitiate() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000366 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000368 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 if (result) {
370 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200371 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000372 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000373 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000374 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000376 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000377 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 }
379 }
380 return result;
381 }
382
383 bool SendAccept() {
384 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200385 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000386 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000387 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000388 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 }
390
391 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000392 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000393 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000394 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 if (result) {
396 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000397 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000398 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 }
400 return result;
401 }
402
403 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000404 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000406 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 if (result) {
408 channel2_->Enable(true);
409 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000410 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800411 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
413 return result;
414 }
415
416 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000417 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000418 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000419 SdpType::kAnswer, err);
420 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000421 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000422 SdpType::kAnswer, err);
423 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 return result;
425 }
426
Tommic9625f02021-05-06 22:03:19 +0200427 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
Danil Chapovalova30439b2022-07-07 10:08:49 +0200428 network_thread_->PostTask(webrtc::SafeTask(
Tommic9625f02021-05-06 22:03:19 +0200429 network_thread_safety_, [media_channel, data = std::move(data)]() {
430 media_channel->SendRtp(data.data(), data.size(),
431 rtc::PacketOptions());
432 }));
433 }
434
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200436 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Tommic9625f02021-05-06 22:03:19 +0200438
439 void SendRtp1(rtc::Buffer data) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000440 SendRtp(media_channel1(), std::move(data));
Tommic9625f02021-05-06 22:03:19 +0200441 }
442
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200444 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
Tommic9625f02021-05-06 22:03:19 +0200446
447 void SendRtp2(rtc::Buffer data) {
448 SendRtp(media_channel2(), std::move(data));
449 }
450
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200453 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200455 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200456 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 bool CheckRtp1() {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000460 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 }
462 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200463 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200466 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200467 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000468 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200470 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200472 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
475 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::SetBE32(data.data() + 8, ssrc);
478 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000479 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200480 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000481 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 return data;
483 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000485 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
Tommic9625f02021-05-06 22:03:19 +0200486 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487
488 void CreateContent(int flags,
489 const cricket::AudioCodec& audio_codec,
490 const cricket::VideoCodec& video_codec,
491 typename T::Content* content) {
492 // overridden in specialized classes
493 }
494 void CopyContent(const typename T::Content& source,
495 typename T::Content* content) {
496 // overridden in specialized classes
497 }
498
Steve Anton18ee1d52017-09-11 11:32:35 -0700499 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700501 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
502 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700503 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700504 AddLegacyStreamInContent(ssrc, 0, content);
505 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506 }
507
ossu292d6582016-03-17 02:31:13 -0700508 // Will manage the lifetime of a CallThread, making sure it's
509 // destroyed before this object goes out of scope.
510 class ScopedCallThread {
511 public:
Danil Chapovalova30439b2022-07-07 10:08:49 +0200512 explicit ScopedCallThread(absl::AnyInvocable<void() &&> functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100513 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700514 thread_->Start();
Danil Chapovalova30439b2022-07-07 10:08:49 +0200515 thread_->PostTask(std::move(functor));
ossu292d6582016-03-17 02:31:13 -0700516 }
517
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200518 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700519
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200520 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700521
522 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200523 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700524 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
527 return false; // overridden in specialized classes
528 }
529
Honghai Zhangcc411c02016-03-29 17:27:21 -0700530 cricket::CandidatePairInterface* last_selected_candidate_pair() {
531 return last_selected_candidate_pair_;
532 }
533
Peter Boström0c4e06b2015-10-07 12:23:21 +0200534 void AddLegacyStreamInContent(uint32_t ssrc,
535 int flags,
536 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 // Base implementation.
538 }
539
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200540 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200541 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200542 // network thread, which callers need to factor in.
543 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
544 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200545 bool result;
546 SendTask(network_thread_, [&] { result = channel->srtp_active(); });
547 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200548 }
549
550 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
551 // returns true.
552 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
553 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200554 bool result;
555 SendTask(network_thread_, [&] {
556 result = channel->rtp_transport() &&
557 channel->rtp_transport()->rtcp_mux_enabled();
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200558 });
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200559 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200560 }
561
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 // Tests that can be used by derived classes.
563
564 // Basic sanity check.
565 void TestInit() {
566 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200567 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000568 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200569 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000570 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200571 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000572 EXPECT_TRUE(media_channel1()->codecs().empty());
573 EXPECT_TRUE(media_channel1()->recv_streams().empty());
574 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
575 // Basic sanity test for send and receive channel objects
576 EXPECT_EQ(channel1_->media_send_channel()->media_type(),
577 media_channel1()->media_type());
578 EXPECT_EQ(channel1_->media_receive_channel()->media_type(),
579 media_channel1()->media_type());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 }
581
582 // Test that SetLocalContent and SetRemoteContent properly configure
583 // the codecs.
584 void TestSetContents() {
585 CreateChannels(0, 0);
586 typename T::Content content;
587 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000588 std::string err;
589 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000590 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000591 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000592 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200593 EXPECT_TRUE(
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000594 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 }
596
Johannes Kron9190b822018-10-29 11:22:05 +0100597 // Test that SetLocalContent and SetRemoteContent properly configure
598 // extmap-allow-mixed.
599 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
600 // For a caller, SetLocalContent() is called first with an offer and next
601 // SetRemoteContent() is called with the answer.
602 CreateChannels(0, 0);
603 typename T::Content content;
604 CreateContent(0, kPcmuCodec, kH264Codec, &content);
605 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
606 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
607 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000608 std::string err;
609 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100610 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000612 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100613 }
614 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
615 // For a callee, SetRemoteContent() is called first with an offer and next
616 // SetLocalContent() is called with the answer.
617 CreateChannels(0, 0);
618 typename T::Content content;
619 CreateContent(0, kPcmuCodec, kH264Codec, &content);
620 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
621 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
622 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000623 std::string err;
624 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100625 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000626 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000627 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100628 }
629
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 // Test that SetLocalContent and SetRemoteContent properly deals
631 // with an empty offer.
632 void TestSetContentsNullOffer() {
633 CreateChannels(0, 0);
634 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000635 std::string err;
636 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000638 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000639 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000640 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200641 EXPECT_TRUE(
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000642 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 }
644
645 // Test that SetLocalContent and SetRemoteContent properly set RTCP
646 // mux.
647 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800648 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 typename T::Content content;
650 CreateContent(0, kPcmuCodec, kH264Codec, &content);
651 // Both sides agree on mux. Should no longer be a separate RTCP channel.
652 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000653 std::string err;
654 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
655 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000657 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000659 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 }
661
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 // Test that SetLocalContent and SetRemoteContent properly
663 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800664 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 void TestChangeStreamParamsInContent() {
666 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 stream1.id = "stream1";
668 stream1.ssrcs.push_back(kSsrc1);
669 stream1.cname = "stream1_cname";
670
671 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 stream2.id = "stream2";
673 stream2.ssrcs.push_back(kSsrc2);
674 stream2.cname = "stream2_cname";
675
Artem Titov880fa812021-07-30 22:30:23 +0200676 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 CreateChannels(0, 0);
678 typename T::Content content1;
679 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
680 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000681 std::string err;
682 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200683 channel1_->Enable(true);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000684 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000686 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200687 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800688 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
690 // Channel 2 do not send anything.
691 typename T::Content content2;
692 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000693 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000694 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000695 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200696 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200697 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200699 SendCustomRtp1(kSsrc1, 0);
700 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
702
Artem Titov880fa812021-07-30 22:30:23 +0200703 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700705 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000707 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200708 ASSERT_EQ(1u, media_channel2()->send_streams().size());
709 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000711 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000712 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
713 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714
715 // Channel 1 replies but stop sending stream1.
716 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700717 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000718 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000719 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000721 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200722 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200724 SendCustomRtp2(kSsrc2, 0);
725 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
727 }
728
729 // Test that we only start playout and sending at the right times.
730 void TestPlayoutAndSendingStates() {
731 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000733 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200734 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000735 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200737 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200738 }
Tommic9625f02021-05-06 22:03:19 +0200739 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200740 channel1_->Enable(true);
741 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000743 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000745 EXPECT_FALSE(media_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000746 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000747 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000748 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200749 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000750 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000752 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000753 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000754 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200756 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 }
Tommic9625f02021-05-06 22:03:19 +0200758 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000759 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000760 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200762 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 }
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800765 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200766 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000767 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200768 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000769 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200770 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200771 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 }
Tommic9625f02021-05-06 22:03:19 +0200773 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200774 channel2_->Enable(true);
775 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200776 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200777 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 }
Tommic9625f02021-05-06 22:03:19 +0200779 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000780 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000781 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000783 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000785 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 }
787
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 // Test that changing the MediaContentDirection in the local and remote
789 // session description start playout and sending at the right time.
790 void TestMediaContentDirection() {
791 CreateChannels(0, 0);
792 typename T::Content content1;
793 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
794 typename T::Content content2;
795 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200796 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800797 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Tommi1959f8f2021-04-26 10:20:19 +0200799 channel1_->Enable(true);
800 channel2_->Enable(true);
801 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200802 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000803 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200804 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000805 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200806 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200807 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200808 }
Tommic9625f02021-05-06 22:03:19 +0200809 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000811 std::string err;
812 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
813 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
814 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800815 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000816 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800817 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818
Peter Boström34fbfff2015-09-24 19:20:30 +0200819 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000820 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200821 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000822 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200823 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200824 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200825 }
Tommic9625f02021-05-06 22:03:19 +0200826 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827
Artem Titov880fa812021-07-30 22:30:23 +0200828 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800829 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000830 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800831 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000832 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833
Peter Boström34fbfff2015-09-24 19:20:30 +0200834 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000835 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000837 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200838 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200839 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 }
Tommic9625f02021-05-06 22:03:19 +0200841 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842
Artem Titov880fa812021-07-30 22:30:23 +0200843 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800844 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000845 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
846 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847
Peter Boström34fbfff2015-09-24 19:20:30 +0200848 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000849 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200850 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000851 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200852 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200853 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200854 }
Tommic9625f02021-05-06 22:03:19 +0200855 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856 }
857
Honghai Zhangcc411c02016-03-29 17:27:21 -0700858 // Tests that when the transport channel signals a candidate pair change
859 // event, the media channel will receive a call on the network route change.
860 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700861 static constexpr uint16_t kLocalNetId = 1;
862 static constexpr uint16_t kRemoteNetId = 2;
863 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800864 // Ipv4(20) + UDP(8).
865 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800866 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200867
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800868 CreateChannels(DTLS, DTLS);
869 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700870
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000871 typename T::MediaChannel* media_channel1 = this->media_channel1();
872 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700873
Zhi Huang942bc2e2017-11-13 13:26:07 -0800874 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200875 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800876 // when creating the channel.
877 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000878 media_channel1->set_num_network_route_changes(0);
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200879 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800880 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200881 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800882 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200883 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 });
885 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000886 EXPECT_EQ(1, media_channel1->num_network_route_changes());
887 EXPECT_FALSE(media_channel1->last_network_route().connected);
888 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700889
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200890 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800891 rtc::NetworkRoute network_route;
892 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100893 network_route.local =
894 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
895 network_route.remote =
896 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800897 network_route.last_sent_packet_id = kLastPacketId;
898 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200899 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800900 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
901
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200902 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200903 });
904 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000905 EXPECT_EQ(1, media_channel1->num_network_route_changes());
906 EXPECT_TRUE(media_channel1->last_network_route().connected);
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100907 EXPECT_EQ(kLocalNetId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000908 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100909 EXPECT_EQ(kRemoteNetId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000910 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200911 EXPECT_EQ(kLastPacketId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000912 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800913 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000914 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700915 }
916
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 // Test setting up a call.
918 void TestCallSetup() {
919 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200920 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200922 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000923 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200924 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000925 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200927 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000928 EXPECT_TRUE(media_channel1()->sending());
929 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200930 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200931 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200932 }
Tommic9625f02021-05-06 22:03:19 +0200933 EXPECT_TRUE(media_channel2()->sending());
934 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935 }
936
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937 // Send voice RTP data to the other side and ensure it gets there.
938 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700939 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 EXPECT_TRUE(SendInitiate());
941 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200942 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
943 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200944 SendRtp1();
945 SendRtp2();
946 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 EXPECT_TRUE(CheckRtp1());
948 EXPECT_TRUE(CheckRtp2());
949 EXPECT_TRUE(CheckNoRtp1());
950 EXPECT_TRUE(CheckNoRtp2());
951 }
952
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200953 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800954 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200955 EXPECT_TRUE(SendInitiate());
956 EXPECT_TRUE(SendAccept());
957 SendRtp1();
958 SendRtp2();
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100959
960 DeinitChannels();
961
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200962 // Do not wait, destroy channels.
963 channel1_.reset(nullptr);
964 channel2_.reset(nullptr);
965 }
966
Zhi Huange830e682018-03-30 10:48:35 -0700967 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
968 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200969 EXPECT_FALSE(IsSrtpActive(channel1_));
970 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200972 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200974 EXPECT_TRUE(IsSrtpActive(channel1_));
975 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200976 SendRtp1();
977 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200978 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 EXPECT_TRUE(CheckRtp1());
980 EXPECT_TRUE(CheckRtp2());
981 EXPECT_TRUE(CheckNoRtp1());
982 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983 }
984
985 // Test that we can send and receive early media when a provisional answer is
986 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
987 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200988 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989
Yves Gerey665174f2018-06-19 15:03:05 +0200990 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
991 EXPECT_TRUE(SendOffer());
992 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200993 EXPECT_TRUE(IsSrtpActive(channel1_));
994 EXPECT_TRUE(IsSrtpActive(channel2_));
995 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
996 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200997 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200998 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
999 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001000 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001
Yves Gerey665174f2018-06-19 15:03:05 +02001002 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +02001003 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1004 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001005 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006
Yves Gerey665174f2018-06-19 15:03:05 +02001007 // Complete call setup and ensure everything is still OK.
1008 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001009 EXPECT_TRUE(IsSrtpActive(channel1_));
1010 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +02001011 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +02001012 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1013 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001014 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001015 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 }
1017
1018 // Test that we properly send RTP without SRTP from a thread.
1019 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001020 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 EXPECT_TRUE(SendInitiate());
1022 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1024 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001025 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001026 WaitForThreads(involved_threads);
1027 EXPECT_TRUE(CheckRtp1());
1028 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029 EXPECT_TRUE(CheckNoRtp1());
1030 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 }
1032
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 // Test that the mediachannel retains its sending state after the transport
1034 // becomes non-writable.
1035 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001036 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037 EXPECT_TRUE(SendInitiate());
1038 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001039 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1040 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
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(CheckRtp2());
1046 EXPECT_TRUE(CheckNoRtp1());
1047 EXPECT_TRUE(CheckNoRtp2());
1048
wu@webrtc.org97077a32013-10-25 21:18:33 +00001049 // Lose writability, which should fail.
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001050 SendTask(network_thread_,
1051 [this] { fake_rtp_dtls_transport1_->SetWritable(false); });
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(CheckNoRtp2());
1057
1058 // Regain writability
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001059 SendTask(network_thread_,
1060 [this] { fake_rtp_dtls_transport1_->SetWritable(true); });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001061 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001062 SendRtp1();
1063 SendRtp2();
1064 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065 EXPECT_TRUE(CheckRtp1());
1066 EXPECT_TRUE(CheckRtp2());
1067 EXPECT_TRUE(CheckNoRtp1());
1068 EXPECT_TRUE(CheckNoRtp2());
1069
1070 // Lose writability completely
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001071 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001072 bool asymmetric = true;
1073 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1074 });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001075 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076
wu@webrtc.org97077a32013-10-25 21:18:33 +00001077 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001078 SendRtp1();
1079 SendRtp2();
1080 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001081 EXPECT_TRUE(CheckRtp1());
1082 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001083 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084
1085 // Gain writability back
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001086 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001087 bool asymmetric = true;
1088 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1089 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001090 });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001091 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001092 SendRtp1();
1093 SendRtp2();
1094 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 EXPECT_TRUE(CheckRtp1());
1096 EXPECT_TRUE(CheckRtp2());
1097 EXPECT_TRUE(CheckNoRtp1());
1098 EXPECT_TRUE(CheckNoRtp2());
1099 }
1100
Yves Gerey665174f2018-06-19 15:03:05 +02001101 void SendBundleToBundle(const int* pl_types,
1102 int len,
1103 bool rtcp_mux,
1104 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001105 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001107 // Only pl_type1 was added to the bundle filter for both `channel1_`
1108 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001109 int pl_type1 = pl_types[0];
1110 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001111 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001112 if (secure)
1113 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001114 if (rtcp_mux) {
1115 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001116 }
1117 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001120
1121 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001122 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1123 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1124 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001125 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001126 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1127 EXPECT_TRUE(CheckNoRtp1());
1128 EXPECT_TRUE(CheckNoRtp2());
1129
Zhi Huang365381f2018-04-13 16:44:34 -07001130 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1131 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001132 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001133 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1134 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 }
1136
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 void TestSetContentFailure() {
1138 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139
Peter Thatchera6d24442015-07-09 21:26:36 -07001140 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001141 std::unique_ptr<typename T::Content> content(
1142 CreateMediaContentWithStream(1));
1143
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001144 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001145 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001146 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001147 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001148 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001150 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001151 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001152 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001153
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001154 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001155 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001156 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 }
1158
1159 void TestSendTwoOffers() {
1160 CreateChannels(0, 0);
1161
Peter Thatchera6d24442015-07-09 21:26:36 -07001162 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001163 std::unique_ptr<typename T::Content> content1(
1164 CreateMediaContentWithStream(1));
1165 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001166 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001167 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168
Steve Anton18ee1d52017-09-11 11:32:35 -07001169 std::unique_ptr<typename T::Content> content2(
1170 CreateMediaContentWithStream(2));
1171 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001172 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001173 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1174 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 }
1176
1177 void TestReceiveTwoOffers() {
1178 CreateChannels(0, 0);
1179
Peter Thatchera6d24442015-07-09 21:26:36 -07001180 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001181 std::unique_ptr<typename T::Content> content1(
1182 CreateMediaContentWithStream(1));
1183 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001184 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001185 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186
Steve Anton18ee1d52017-09-11 11:32:35 -07001187 std::unique_ptr<typename T::Content> content2(
1188 CreateMediaContentWithStream(2));
1189 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001190 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001191 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1192 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 }
1194
1195 void TestSendPrAnswer() {
1196 CreateChannels(0, 0);
1197
Peter Thatchera6d24442015-07-09 21:26:36 -07001198 std::string err;
1199 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001200 std::unique_ptr<typename T::Content> content1(
1201 CreateMediaContentWithStream(1));
1202 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001203 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001204 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205
Peter Thatchera6d24442015-07-09 21:26:36 -07001206 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001207 std::unique_ptr<typename T::Content> content2(
1208 CreateMediaContentWithStream(2));
1209 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001210 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001211 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1212 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213
Peter Thatchera6d24442015-07-09 21:26:36 -07001214 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001215 std::unique_ptr<typename T::Content> content3(
1216 CreateMediaContentWithStream(3));
1217 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001218 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001219 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1220 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1221 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 }
1223
1224 void TestReceivePrAnswer() {
1225 CreateChannels(0, 0);
1226
Peter Thatchera6d24442015-07-09 21:26:36 -07001227 std::string err;
1228 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001229 std::unique_ptr<typename T::Content> content1(
1230 CreateMediaContentWithStream(1));
1231 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001232 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001233 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234
Peter Thatchera6d24442015-07-09 21:26:36 -07001235 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 std::unique_ptr<typename T::Content> content2(
1237 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001238 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001239 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001240 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1241 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001242
Peter Thatchera6d24442015-07-09 21:26:36 -07001243 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001244 std::unique_ptr<typename T::Content> content3(
1245 CreateMediaContentWithStream(3));
1246 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001247 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001248 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1249 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1250 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 }
1252
zstein56162b92017-04-24 16:54:35 -07001253 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001254 CreateChannels(0, 0);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001255 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001256
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001257 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001258 [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001259 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001260 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001262 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001263 [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001264 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001265 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266 }
1267
skvladdc1c62c2016-03-16 19:07:43 -07001268 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1269 typename T::Content content;
1270 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1271 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001272 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001273 }
1274
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001275 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001276 webrtc::RtpParameters parameters;
1277 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001278 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001279 parameters.encodings.push_back(encoding);
1280 return parameters;
1281 }
1282
1283 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001284 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001285 EXPECT_EQ(1UL, parameters.encodings.size());
1286 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1287 }
1288
1289 void DefaultMaxBitrateIsUnlimited() {
1290 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001291 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001292 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001293 SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001294 EXPECT_EQ(media_channel1()->max_bps(), -1);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001295 VerifyMaxBitrate(media_send_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001296 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001297 }
1298
Zhi Huange830e682018-03-30 10:48:35 -07001299 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001300 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001301 // with the options on the new one.
1302
Steve Anton8a63f782017-10-23 13:08:53 -07001303 // For example, audio and video may use separate socket options, but initially
1304 // be unbundled, then later become bundled. When this happens, their preferred
1305 // socket options should be merged to the underlying transport they share.
1306 void SocketOptionsMergedOnSetTransport() {
1307 constexpr int kSndBufSize = 4000;
1308 constexpr int kRcvBufSize = 8000;
1309
Zhi Huange830e682018-03-30 10:48:35 -07001310 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001311
Zhi Huange830e682018-03-30 10:48:35 -07001312 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001313 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001314
Niels Möller92430882021-03-18 10:03:19 +01001315 bool rcv_success, send_success;
1316 int rcv_buf, send_buf;
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001317 SendTask(network_thread_, [&] {
Tommic9625f02021-05-06 22:03:19 +02001318 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1319 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1320 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1321 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001322 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001323 send_success = fake_rtp_dtls_transport2_->GetOption(
1324 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1325 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1326 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1327 });
1328
1329 ASSERT_TRUE(send_success);
1330 EXPECT_EQ(kSndBufSize, send_buf);
1331 ASSERT_TRUE(rcv_success);
1332 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001333 }
1334
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001335 void CreateSimulcastContent(const std::vector<std::string>& rids,
1336 typename T::Content* content) {
1337 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001338 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001339 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1340 }
1341
1342 StreamParams stream;
1343 stream.set_rids(rid_descriptions);
1344 CreateContent(0, kPcmuCodec, kH264Codec, content);
1345 // This is for unified plan, so there can be only one StreamParams.
1346 content->mutable_streams().clear();
1347 content->AddStream(stream);
1348 }
1349
1350 void VerifySimulcastStreamParams(const StreamParams& expected,
1351 const typename T::Channel* channel) {
1352 const std::vector<StreamParams>& streams = channel->local_streams();
1353 ASSERT_EQ(1u, streams.size());
1354 const StreamParams& result = streams[0];
1355 EXPECT_EQ(expected.rids(), result.rids());
1356 EXPECT_TRUE(result.has_ssrcs());
1357 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1358 std::vector<uint32_t> primary_ssrcs;
1359 result.GetPrimarySsrcs(&primary_ssrcs);
1360 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1361 }
1362
1363 void TestUpdateLocalStreamsWithSimulcast() {
1364 CreateChannels(0, 0);
1365 typename T::Content content1, content2, content3;
1366 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001367 std::string err;
1368 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001369 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1370 StreamParams stream1 = channel1_->local_streams()[0];
1371
1372 // Create a similar offer. SetLocalContent should not remove and add.
1373 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001374 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001375 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1376 StreamParams stream2 = channel1_->local_streams()[0];
1377 // Check that the streams are identical (SSRCs didn't change).
1378 EXPECT_EQ(stream1, stream2);
1379
1380 // Create third offer that has same RIDs in different order.
1381 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001382 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001383 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1384 }
1385
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001387 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1388 static void ProcessThreadQueue(rtc::Thread* thread) {
1389 RTC_DCHECK(thread->IsCurrent());
1390 while (!thread->empty()) {
1391 thread->ProcessMessages(0);
1392 }
1393 }
Tommi1959f8f2021-04-26 10:20:19 +02001394 static void FlushCurrentThread() {
1395 rtc::Thread::Current()->ProcessMessages(0);
1396 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001397 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001398 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001399 for (rtc::Thread* thread : threads) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001400 SendTask(thread, [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001401 }
1402 ProcessThreadQueue(rtc::Thread::Current());
1403 // Network thread move them around and post back to worker = current thread.
1404 if (!network_thread_->IsCurrent()) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001405 SendTask(network_thread_,
1406 [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001407 }
1408 // Worker thread = current Thread process received messages.
1409 ProcessThreadQueue(rtc::Thread::Current());
1410 }
Tommic9625f02021-05-06 22:03:19 +02001411
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001412 // Accessors that return the FakeMedia<type>Channel object.
1413 // Note that these depend on getting the object back that was
1414 // passed to the channel constructor.
1415 typename T::MediaChannel* media_channel1() {
Tommic9625f02021-05-06 22:03:19 +02001416 RTC_DCHECK(channel1_);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001417 RTC_DCHECK(channel1_->media_channel());
1418 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Tommic9625f02021-05-06 22:03:19 +02001419 }
1420
1421 typename T::MediaChannel* media_channel2() {
1422 RTC_DCHECK(channel2_);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001423 RTC_DCHECK(channel2_->media_channel());
1424 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1425 }
1426
1427 typename T::MediaSendChannel* media_send_channel1() {
1428 RTC_DCHECK(channel1_);
1429 RTC_DCHECK(channel1_->media_send_channel());
1430 return channel1_->media_send_channel();
1431 }
1432
1433 typename T::MediaSendChannel* media_send_channel2() {
1434 RTC_DCHECK(channel2_);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001435 RTC_DCHECK(channel2_->media_send_channel());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001436 return channel2_->media_send_channel();
Tommic9625f02021-05-06 22:03:19 +02001437 }
1438
Niels Möller83830f32022-05-20 09:12:57 +02001439 rtc::AutoThread main_thread_;
Peter Boström34fbfff2015-09-24 19:20:30 +02001440 // TODO(pbos): Remove playout from all media channels and let renderers mute
1441 // themselves.
1442 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001443 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1444 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001445 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1446 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001447 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1448 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1449 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1450 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1451 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1452 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1453 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1454 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001455 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1456 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1457 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001459 std::unique_ptr<typename T::Channel> channel1_;
1460 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461 typename T::Content local_media_content1_;
1462 typename T::Content local_media_content2_;
1463 typename T::Content remote_media_content1_;
1464 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001466 rtc::Buffer rtp_packet_;
1467 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001468 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001469 rtc::UniqueRandomIdGenerator ssrc_generator_;
Jonas Orelanded99dae2022-03-09 09:28:10 +01001470 webrtc::test::ScopedKeyValueConfig field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471};
1472
Yves Gerey665174f2018-06-19 15:03:05 +02001473template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001474std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1475 rtc::Thread* worker_thread,
1476 rtc::Thread* network_thread,
1477 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1478 webrtc::RtpTransportInternal* rtp_transport,
1479 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001480 rtc::Thread* signaling_thread = rtc::Thread::Current();
1481 auto channel = std::make_unique<cricket::VoiceChannel>(
1482 worker_thread, network_thread, signaling_thread, std::move(ch),
1483 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1484 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001485 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001486 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001487 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001488 });
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001489 return channel;
1490}
1491
1492template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493void ChannelTest<VoiceTraits>::CreateContent(
1494 int flags,
1495 const cricket::AudioCodec& audio_codec,
1496 const cricket::VideoCodec& video_codec,
1497 cricket::AudioContentDescription* audio) {
1498 audio->AddCodec(audio_codec);
1499 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500}
1501
Yves Gerey665174f2018-06-19 15:03:05 +02001502template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503void ChannelTest<VoiceTraits>::CopyContent(
1504 const cricket::AudioContentDescription& source,
1505 cricket::AudioContentDescription* audio) {
1506 *audio = source;
1507}
1508
Yves Gerey665174f2018-06-19 15:03:05 +02001509template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001510bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1511 const cricket::AudioCodec& c2) {
1512 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001513 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514}
1515
Peter Boström0c4e06b2015-10-07 12:23:21 +02001516template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001518 uint32_t ssrc,
1519 int flags,
1520 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 audio->AddLegacyStream(ssrc);
1522}
1523
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001524class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 public:
solenberg1dd98f32015-09-10 01:57:14 -07001526 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001527 VoiceChannelSingleThreadTest()
1528 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1529};
1530
1531class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1532 public:
1533 typedef ChannelTest<VoiceTraits> Base;
1534 VoiceChannelDoubleThreadTest()
1535 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536};
1537
jbauch5869f502017-06-29 12:31:36 -07001538class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001539 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001540 public:
1541 typedef ChannelTest<VoiceTraits> Base;
1542 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001543 : Base(true,
1544 kPcmuFrameWithExtensions,
1545 kRtcpReport,
1546 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001547};
1548
1549class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001550 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001551 public:
1552 typedef ChannelTest<VoiceTraits> Base;
1553 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001554 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1555 }
jbauch5869f502017-06-29 12:31:36 -07001556};
1557
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001559template <>
Steve Anton8699a322017-11-06 15:53:33 -08001560std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001561 rtc::Thread* worker_thread,
1562 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001563 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001564 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001565 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001566 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001567 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001568 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001569 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1570 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001571 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001572 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001573 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001574 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575 return channel;
1576}
1577
Yves Gerey665174f2018-06-19 15:03:05 +02001578template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579void ChannelTest<VideoTraits>::CreateContent(
1580 int flags,
1581 const cricket::AudioCodec& audio_codec,
1582 const cricket::VideoCodec& video_codec,
1583 cricket::VideoContentDescription* video) {
1584 video->AddCodec(video_codec);
1585 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586}
1587
Yves Gerey665174f2018-06-19 15:03:05 +02001588template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001589void ChannelTest<VideoTraits>::CopyContent(
1590 const cricket::VideoContentDescription& source,
1591 cricket::VideoContentDescription* video) {
1592 *video = source;
1593}
1594
Yves Gerey665174f2018-06-19 15:03:05 +02001595template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1597 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001598 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599}
1600
Peter Boström0c4e06b2015-10-07 12:23:21 +02001601template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001603 uint32_t ssrc,
1604 int flags,
1605 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 video->AddLegacyStream(ssrc);
1607}
1608
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001609class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610 public:
solenberg1dd98f32015-09-10 01:57:14 -07001611 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001612 VideoChannelSingleThreadTest()
1613 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614};
1615
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001616class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1617 public:
1618 typedef ChannelTest<VideoTraits> Base;
1619 VideoChannelDoubleThreadTest()
1620 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1621};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001623TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001624 Base::TestInit();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001625 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1626 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627}
1628
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001629TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1630 Base::TestDeinit();
1631}
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 Base::TestSetContents();
1635}
1636
Johannes Kron9190b822018-10-29 11:22:05 +01001637TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1638 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1639}
1640
1641TEST_F(VoiceChannelSingleThreadTest,
1642 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1643 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1644}
1645
1646TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1647 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1648}
1649
1650TEST_F(VoiceChannelSingleThreadTest,
1651 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1652 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::TestSetContentsNullOffer();
1657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 Base::TestSetContentsRtcpMux();
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 Base::TestSetContentsRtcpMux();
1665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 Base::TestChangeStreamParamsInContent();
1669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 Base::TestPlayoutAndSendingStates();
1673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 Base::TestMediaContentDirection();
1677}
1678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001680 Base::TestNetworkRouteChanges();
1681}
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 Base::TestCallSetup();
1685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 Base::SendRtpToRtp();
1689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001692 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001696 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001697}
1698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001699TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1701}
1702
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 Base::SendRtpToRtpOnThread();
1705}
1706
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001707TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708 Base::SendWithWritabilityLoss();
1709}
1710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 Base::TestSetContentFailure();
1713}
1714
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001715TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 Base::TestSendTwoOffers();
1717}
1718
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001719TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 Base::TestReceiveTwoOffers();
1721}
1722
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001723TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724 Base::TestSendPrAnswer();
1725}
1726
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001727TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 Base::TestReceivePrAnswer();
1729}
1730
zstein56162b92017-04-24 16:54:35 -07001731TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1732 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733}
1734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001735TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001736 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737}
1738
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001739TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001740 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001741}
1742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001744 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001745}
1746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001747TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001748 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749}
1750
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001751TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001752 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001753}
1754
Steve Anton8a63f782017-10-23 13:08:53 -07001755TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1756 Base::SocketOptionsMergedOnSetTransport();
1757}
1758
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001759// VoiceChannelDoubleThreadTest
1760TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 Base::TestInit();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001762 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1763 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764}
1765
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001766TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1767 Base::TestDeinit();
1768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 Base::TestSetContents();
1772}
1773
Johannes Kron9190b822018-10-29 11:22:05 +01001774TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1775 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1776}
1777
1778TEST_F(VoiceChannelDoubleThreadTest,
1779 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1780 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1781}
1782
1783TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1784 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1785}
1786
1787TEST_F(VoiceChannelDoubleThreadTest,
1788 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1789 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1790}
1791
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001792TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793 Base::TestSetContentsNullOffer();
1794}
1795
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 Base::TestSetContentsRtcpMux();
1798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801 Base::TestSetContentsRtcpMux();
1802}
1803
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001804TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 Base::TestChangeStreamParamsInContent();
1806}
1807
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809 Base::TestPlayoutAndSendingStates();
1810}
1811
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001812TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1813 Base::TestMediaContentDirection();
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1817 Base::TestNetworkRouteChanges();
1818}
1819
1820TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1821 Base::TestCallSetup();
1822}
1823
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001824TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1825 Base::SendRtpToRtp();
1826}
1827
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001828TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001829 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830}
1831
1832TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001833 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001834}
1835
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001836TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1837 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1838}
1839
1840TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1841 Base::SendRtpToRtpOnThread();
1842}
1843
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001844TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1845 Base::SendWithWritabilityLoss();
1846}
1847
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001848TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1849 Base::TestSetContentFailure();
1850}
1851
1852TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1853 Base::TestSendTwoOffers();
1854}
1855
1856TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1857 Base::TestReceiveTwoOffers();
1858}
1859
1860TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1861 Base::TestSendPrAnswer();
1862}
1863
1864TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1865 Base::TestReceivePrAnswer();
1866}
1867
zstein56162b92017-04-24 16:54:35 -07001868TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1869 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001870}
1871
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001872TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1873 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1874}
1875
1876TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1877 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1878}
1879
1880TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1881 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1882}
1883
1884TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1885 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1886}
1887
1888TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1889 Base::DefaultMaxBitrateIsUnlimited();
1890}
1891
Steve Anton8a63f782017-10-23 13:08:53 -07001892TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1893 Base::SocketOptionsMergedOnSetTransport();
1894}
1895
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001896// VideoChannelSingleThreadTest
1897TEST_F(VideoChannelSingleThreadTest, TestInit) {
1898 Base::TestInit();
1899}
1900
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001901TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1902 Base::TestDeinit();
1903}
1904
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001905TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1906 Base::TestSetContents();
1907}
1908
Johannes Kron9190b822018-10-29 11:22:05 +01001909TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1910 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1911}
1912
1913TEST_F(VideoChannelSingleThreadTest,
1914 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1915 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1916}
1917
1918TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1919 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1920}
1921
1922TEST_F(VideoChannelSingleThreadTest,
1923 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1924 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1928 Base::TestSetContentsNullOffer();
1929}
1930
1931TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1932 Base::TestSetContentsRtcpMux();
1933}
1934
1935TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1936 Base::TestSetContentsRtcpMux();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1940 Base::TestChangeStreamParamsInContent();
1941}
1942
1943TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1944 Base::TestPlayoutAndSendingStates();
1945}
1946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 Base::TestMediaContentDirection();
1949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001952 Base::TestNetworkRouteChanges();
1953}
1954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 Base::TestCallSetup();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960 Base::SendRtpToRtp();
1961}
1962
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001964 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965}
1966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001968 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969}
1970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1973}
1974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 Base::SendRtpToRtpOnThread();
1977}
1978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 Base::SendWithWritabilityLoss();
1981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 Base::TestSetContentFailure();
1985}
1986
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001987TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988 Base::TestSendTwoOffers();
1989}
1990
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001991TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992 Base::TestReceiveTwoOffers();
1993}
1994
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001995TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996 Base::TestSendPrAnswer();
1997}
1998
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001999TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002000 Base::TestReceivePrAnswer();
2001}
2002
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002003TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002004 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002005}
2006
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002007TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002008 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002009}
2010
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002011TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002012 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002013}
2014
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002015TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002016 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017}
2018
zstein56162b92017-04-24 16:54:35 -07002019TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2020 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021}
2022
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002023TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002024 Base::DefaultMaxBitrateIsUnlimited();
2025}
2026
Steve Anton8a63f782017-10-23 13:08:53 -07002027TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2028 Base::SocketOptionsMergedOnSetTransport();
2029}
2030
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002031TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2032 Base::TestUpdateLocalStreamsWithSimulcast();
2033}
2034
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002035TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2036 const cricket::VideoCodec kVp8Codec(97, "VP8");
2037 cricket::VideoCodec vp9_codec(98, "VP9");
2038 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2039 cricket::VideoContentDescription video;
2040 video.set_codecs({kVp8Codec, vp9_codec});
2041
2042 CreateChannels(0, 0);
2043
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002044 std::string err;
2045 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002046 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2047 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2048 EXPECT_TRUE(
2049 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2050 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2051 EXPECT_TRUE(
2052 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2053 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002054 cricket::kPacketizationParamRaw);
2055}
2056
2057TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2058 const cricket::VideoCodec kVp8Codec(97, "VP8");
2059 cricket::VideoCodec vp9_codec(98, "VP9");
2060 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2061 cricket::VideoContentDescription video;
2062 video.set_codecs({kVp8Codec, vp9_codec});
2063
2064 CreateChannels(0, 0);
2065
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002066 std::string err;
2067 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2068 EXPECT_TRUE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002069 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2070 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2071 EXPECT_TRUE(
2072 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2073 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2074 EXPECT_TRUE(
2075 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2076 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002077 cricket::kPacketizationParamRaw);
2078}
2079
2080TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2081 const cricket::VideoCodec kVp8Codec(97, "VP8");
2082 cricket::VideoCodec vp9_codec(98, "VP9");
2083 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2084 cricket::VideoContentDescription video;
2085 video.set_codecs({kVp8Codec, vp9_codec});
2086
2087 CreateChannels(0, 0);
2088
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002089 std::string err;
2090 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2091 EXPECT_TRUE(err.empty());
2092 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2093 EXPECT_TRUE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002094 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2095 EXPECT_TRUE(
2096 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2097 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2098 EXPECT_TRUE(
2099 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2100 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002101 cricket::kPacketizationParamRaw);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002102 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2103 EXPECT_TRUE(
2104 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2105 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2106 EXPECT_TRUE(
2107 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2108 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002109 cricket::kPacketizationParamRaw);
2110}
2111
2112TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2113 const cricket::VideoCodec kLocalCodec(98, "VP8");
2114 cricket::VideoCodec remote_codec(99, "VP8");
2115 remote_codec.packetization = cricket::kPacketizationParamRaw;
2116 cricket::VideoContentDescription local_video;
2117 local_video.set_codecs({kLocalCodec});
2118 cricket::VideoContentDescription remote_video;
2119 remote_video.set_codecs({remote_codec});
2120
2121 CreateChannels(0, 0);
2122
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002123 std::string err;
2124 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2125 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002126 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2127 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2128 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2129 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002130}
2131
2132TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2133 cricket::VideoCodec local_codec(98, "VP8");
2134 local_codec.packetization = cricket::kPacketizationParamRaw;
2135 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2136 cricket::VideoContentDescription local_video;
2137 local_video.set_codecs({local_codec});
2138 cricket::VideoContentDescription remote_video;
2139 remote_video.set_codecs({kRemoteCodec});
2140
2141 CreateChannels(0, 0);
2142
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002143 std::string err;
2144 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002145 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002146 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002147 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2148 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2149 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2150 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002151}
2152
2153TEST_F(VideoChannelSingleThreadTest,
2154 TestSetRemoteAnswerWithInvalidPacketization) {
2155 cricket::VideoCodec local_codec(98, "VP8");
2156 local_codec.packetization = cricket::kPacketizationParamRaw;
2157 cricket::VideoCodec remote_codec(99, "VP8");
2158 remote_codec.packetization = "unknownpacketizationattributevalue";
2159 cricket::VideoContentDescription local_video;
2160 local_video.set_codecs({local_codec});
2161 cricket::VideoContentDescription remote_video;
2162 remote_video.set_codecs({remote_codec});
2163
2164 CreateChannels(0, 0);
2165
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002166 std::string err;
2167 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2168 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002169 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002170 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2171 EXPECT_FALSE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002172 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2173 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002174 cricket::kPacketizationParamRaw);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002175 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002176}
2177
2178TEST_F(VideoChannelSingleThreadTest,
2179 TestSetLocalAnswerWithInvalidPacketization) {
2180 cricket::VideoCodec local_codec(98, "VP8");
2181 local_codec.packetization = cricket::kPacketizationParamRaw;
2182 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2183 cricket::VideoContentDescription local_video;
2184 local_video.set_codecs({local_codec});
2185 cricket::VideoContentDescription remote_video;
2186 remote_video.set_codecs({kRemoteCodec});
2187
2188 CreateChannels(0, 0);
2189
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002190 std::string err;
2191 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2192 EXPECT_TRUE(err.empty());
2193 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2194 EXPECT_FALSE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002195 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2196 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2197 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002198}
2199
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002200// VideoChannelDoubleThreadTest
2201TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2202 Base::TestInit();
2203}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002205TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2206 Base::TestDeinit();
2207}
2208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2210 Base::TestSetContents();
2211}
2212
Johannes Kron9190b822018-10-29 11:22:05 +01002213TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2214 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2215}
2216
2217TEST_F(VideoChannelDoubleThreadTest,
2218 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2219 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2220}
2221
2222TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2223 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2224}
2225
2226TEST_F(VideoChannelDoubleThreadTest,
2227 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2228 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2229}
2230
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2232 Base::TestSetContentsNullOffer();
2233}
2234
2235TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2236 Base::TestSetContentsRtcpMux();
2237}
2238
2239TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2240 Base::TestSetContentsRtcpMux();
2241}
2242
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002243TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2244 Base::TestChangeStreamParamsInContent();
2245}
2246
2247TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2248 Base::TestPlayoutAndSendingStates();
2249}
2250
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2252 Base::TestMediaContentDirection();
2253}
2254
2255TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2256 Base::TestNetworkRouteChanges();
2257}
2258
2259TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2260 Base::TestCallSetup();
2261}
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2264 Base::SendRtpToRtp();
2265}
2266
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002267TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002268 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269}
2270
2271TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002272 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273}
2274
2275TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2276 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2277}
2278
2279TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2280 Base::SendRtpToRtpOnThread();
2281}
2282
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2284 Base::SendWithWritabilityLoss();
2285}
2286
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2288 Base::TestSetContentFailure();
2289}
2290
2291TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2292 Base::TestSendTwoOffers();
2293}
2294
2295TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2296 Base::TestReceiveTwoOffers();
2297}
2298
2299TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2300 Base::TestSendPrAnswer();
2301}
2302
2303TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2304 Base::TestReceivePrAnswer();
2305}
2306
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002307TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2308 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2309}
2310
2311TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2312 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2313}
2314
2315TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2316 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2317}
2318
2319TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2320 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2321}
2322
zstein56162b92017-04-24 16:54:35 -07002323TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2324 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325}
2326
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2328 Base::DefaultMaxBitrateIsUnlimited();
2329}
2330
Steve Anton8a63f782017-10-23 13:08:53 -07002331TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2332 Base::SocketOptionsMergedOnSetTransport();
2333}
2334
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336// TODO(pthatcher): TestSetReceiver?