blob: 1635ea51353f09a1b86d6df3ac6c0a1465e7cdba [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>(
Harald Alvestrand16579cc2023-02-09 13:01:24 +0000154 cricket::MediaChannel::Role::kBoth, nullptr,
155 typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200156 std::make_unique<typename T::MediaChannel>(
Harald Alvestrand16579cc2023-02-09 13:01:24 +0000157 cricket::MediaChannel::Role::kBoth, nullptr,
158 typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200159 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 }
Steve Anton8699a322017-11-06 15:53:33 -0800161 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
162 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200163 int flags1,
164 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200165 RTC_DCHECK(!channel1_);
166 RTC_DCHECK(!channel2_);
167
deadbeeff5346592017-01-24 21:51:21 -0800168 // Network thread is started in CreateChannels, to allow the test to
169 // configure a fake clock before any threads are spawned and attempt to
170 // access the time.
171 if (network_thread_keeper_) {
172 network_thread_keeper_->Start();
173 }
Zhi Huange830e682018-03-30 10:48:35 -0700174
deadbeeff5346592017-01-24 21:51:21 -0800175 // Make sure if using raw packet transports, they're used for both
176 // channels.
177 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200178 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeeff5346592017-01-24 21:51:21 -0800179 // Based on flags, create fake DTLS or raw packet transports.
180 if (flags1 & RAW_PACKET_TRANSPORT) {
181 fake_rtp_packet_transport1_.reset(
182 new rtc::FakePacketTransport("channel1_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700183 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800184 fake_rtcp_packet_transport1_.reset(
185 new rtc::FakePacketTransport("channel1_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800186 }
187 } else {
188 // Confirmed to work with KT_RSA and KT_ECDSA.
189 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100190 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700191 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800192 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100193 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
194 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800195 }
196 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100197 auto cert1 = rtc::RTCCertificate::Create(
198 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800199 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
200 if (fake_rtcp_dtls_transport1_) {
201 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
202 }
203 }
204 }
205 // Based on flags, create fake DTLS or raw packet transports.
206 if (flags2 & RAW_PACKET_TRANSPORT) {
207 fake_rtp_packet_transport2_.reset(
208 new rtc::FakePacketTransport("channel2_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700209 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800210 fake_rtcp_packet_transport2_.reset(
211 new rtc::FakePacketTransport("channel2_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800212 }
213 } else {
214 // Confirmed to work with KT_RSA and KT_ECDSA.
215 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100216 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700217 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800218 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100219 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
220 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800221 }
222 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100223 auto cert2 = rtc::RTCCertificate::Create(
224 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800225 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
226 if (fake_rtcp_dtls_transport2_) {
227 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
228 }
229 }
230 }
Zhi Huange830e682018-03-30 10:48:35 -0700231 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
232 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
233 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
234 flags1);
235 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
236 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
237 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
238 flags2);
239
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800240 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
241 rtp_transport1_.get(), flags1);
242 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
243 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200244 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
245 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000246 CopyContent(local_media_content1_, &remote_media_content1_);
247 CopyContent(local_media_content2_, &remote_media_content2_);
248
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249 // Add stream information (SSRC) to the local content but not to the remote
250 // content. This means that we per default know the SSRC of what we send but
251 // not what we receive.
252 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
253 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
254
255 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
256 if (flags1 & SSRC_MUX) {
257 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
258 }
259 if (flags2 & SSRC_MUX) {
260 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
261 }
262 }
Steve Anton8699a322017-11-06 15:53:33 -0800263 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200264 rtc::Thread* worker_thread,
265 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800266 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700267 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200268 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000269
Zhi Huange830e682018-03-30 10:48:35 -0700270 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
271 rtc::PacketTransportInternal* rtp_packet_transport,
272 rtc::PacketTransportInternal* rtcp_packet_transport,
273 DtlsTransportInternal* rtp_dtls_transport,
274 DtlsTransportInternal* rtcp_dtls_transport,
275 int flags) {
276 if (flags & RTCP_MUX) {
277 rtcp_packet_transport = nullptr;
278 rtcp_dtls_transport = nullptr;
279 }
280
281 if (flags & DTLS) {
282 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
283 } else {
284 if (flags & RAW_PACKET_TRANSPORT) {
285 return CreateUnencryptedTransport(rtp_packet_transport,
286 rtcp_packet_transport);
287 } else {
288 return CreateUnencryptedTransport(rtp_dtls_transport,
289 rtcp_dtls_transport);
290 }
291 }
292 }
293
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100294 // Unininitializes the channels on the network thread.
295 void DeinitChannels() {
296 if (!channel1_ && !channel2_)
297 return;
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200298 SendTask(network_thread_, [this]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100299 if (channel1_) {
300 RTC_DCHECK_RUN_ON(channel1_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100301 channel1_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100302 }
303 if (channel2_) {
304 RTC_DCHECK_RUN_ON(channel2_->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100305 channel2_->SetRtpTransport(nullptr);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100306 }
307 });
308 }
309
Zhi Huange830e682018-03-30 10:48:35 -0700310 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
311 rtc::PacketTransportInternal* rtp_packet_transport,
312 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200313 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200314 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700315
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200316 SendTask(network_thread_,
317 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
318 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
319 if (rtcp_packet_transport) {
320 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
321 }
322 });
Zhi Huange830e682018-03-30 10:48:35 -0700323 return rtp_transport;
324 }
325
326 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
327 cricket::DtlsTransportInternal* rtp_dtls_transport,
328 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200329 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100330 rtcp_dtls_transport == nullptr, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700331
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200332 SendTask(network_thread_,
333 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
334 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
335 rtcp_dtls_transport);
336 });
Zhi Huange830e682018-03-30 10:48:35 -0700337 return dtls_srtp_transport;
338 }
339
deadbeeff5346592017-01-24 21:51:21 -0800340 void ConnectFakeTransports() {
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200341 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -0800342 bool asymmetric = false;
343 // Depending on test flags, could be using DTLS or raw packet transport.
344 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
345 fake_rtp_dtls_transport1_->SetDestination(
346 fake_rtp_dtls_transport2_.get(), asymmetric);
347 }
348 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
349 fake_rtcp_dtls_transport1_->SetDestination(
350 fake_rtcp_dtls_transport2_.get(), asymmetric);
351 }
352 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
353 fake_rtp_packet_transport1_->SetDestination(
354 fake_rtp_packet_transport2_.get(), asymmetric);
355 }
356 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
357 fake_rtcp_packet_transport1_->SetDestination(
358 fake_rtcp_packet_transport2_.get(), asymmetric);
359 }
360 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800361 // The transport becoming writable will asynchronously update the send state
362 // on the worker thread; since this test uses the main thread as the worker
363 // thread, we must process the message queue for this to occur.
364 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800365 }
366
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 bool SendInitiate() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000368 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000369 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000370 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200373 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000374 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000375 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800377 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000379 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 }
381 }
382 return result;
383 }
384
385 bool SendAccept() {
386 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200387 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000388 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000389 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000390 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 }
392
393 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000394 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000395 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000396 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 if (result) {
398 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000399 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000400 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 }
402 return result;
403 }
404
405 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000406 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000408 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 if (result) {
410 channel2_->Enable(true);
411 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000412 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800413 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 }
415 return result;
416 }
417
418 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000419 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000420 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000421 SdpType::kAnswer, err);
422 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000423 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000424 SdpType::kAnswer, err);
425 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 return result;
427 }
428
Tommic9625f02021-05-06 22:03:19 +0200429 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
Danil Chapovalova30439b2022-07-07 10:08:49 +0200430 network_thread_->PostTask(webrtc::SafeTask(
Tommic9625f02021-05-06 22:03:19 +0200431 network_thread_safety_, [media_channel, data = std::move(data)]() {
432 media_channel->SendRtp(data.data(), data.size(),
433 rtc::PacketOptions());
434 }));
435 }
436
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200438 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 }
Tommic9625f02021-05-06 22:03:19 +0200440
441 void SendRtp1(rtc::Buffer data) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000442 SendRtp(media_channel1(), std::move(data));
Tommic9625f02021-05-06 22:03:19 +0200443 }
444
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200446 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
Tommic9625f02021-05-06 22:03:19 +0200448
449 void SendRtp2(rtc::Buffer data) {
450 SendRtp(media_channel2(), std::move(data));
451 }
452
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200455 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200457 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200458 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 bool CheckRtp1() {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000462 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 }
464 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200465 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200468 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000470 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200472 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200474 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
477 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::SetBE32(data.data() + 8, ssrc);
480 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000481 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000483 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 return data;
485 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000487 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
Tommic9625f02021-05-06 22:03:19 +0200488 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489
490 void CreateContent(int flags,
491 const cricket::AudioCodec& audio_codec,
492 const cricket::VideoCodec& video_codec,
493 typename T::Content* content) {
494 // overridden in specialized classes
495 }
496 void CopyContent(const typename T::Content& source,
497 typename T::Content* content) {
498 // overridden in specialized classes
499 }
500
Steve Anton18ee1d52017-09-11 11:32:35 -0700501 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700503 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
504 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700505 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700506 AddLegacyStreamInContent(ssrc, 0, content);
507 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 }
509
ossu292d6582016-03-17 02:31:13 -0700510 // Will manage the lifetime of a CallThread, making sure it's
511 // destroyed before this object goes out of scope.
512 class ScopedCallThread {
513 public:
Danil Chapovalova30439b2022-07-07 10:08:49 +0200514 explicit ScopedCallThread(absl::AnyInvocable<void() &&> functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100515 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700516 thread_->Start();
Danil Chapovalova30439b2022-07-07 10:08:49 +0200517 thread_->PostTask(std::move(functor));
ossu292d6582016-03-17 02:31:13 -0700518 }
519
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200520 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700521
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200522 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700523
524 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200525 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700526 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
529 return false; // overridden in specialized classes
530 }
531
Honghai Zhangcc411c02016-03-29 17:27:21 -0700532 cricket::CandidatePairInterface* last_selected_candidate_pair() {
533 return last_selected_candidate_pair_;
534 }
535
Peter Boström0c4e06b2015-10-07 12:23:21 +0200536 void AddLegacyStreamInContent(uint32_t ssrc,
537 int flags,
538 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539 // Base implementation.
540 }
541
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200542 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200543 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200544 // network thread, which callers need to factor in.
545 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
546 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200547 bool result;
548 SendTask(network_thread_, [&] { result = channel->srtp_active(); });
549 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200550 }
551
552 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
553 // returns true.
554 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
555 RTC_DCHECK(channel.get());
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200556 bool result;
557 SendTask(network_thread_, [&] {
558 result = channel->rtp_transport() &&
559 channel->rtp_transport()->rtcp_mux_enabled();
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200560 });
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200561 return result;
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200562 }
563
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000564 // Tests that can be used by derived classes.
565
566 // Basic sanity check.
567 void TestInit() {
568 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200569 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000570 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200571 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000572 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200573 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000574 EXPECT_TRUE(media_channel1()->codecs().empty());
575 EXPECT_TRUE(media_channel1()->recv_streams().empty());
576 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
577 // Basic sanity test for send and receive channel objects
578 EXPECT_EQ(channel1_->media_send_channel()->media_type(),
579 media_channel1()->media_type());
580 EXPECT_EQ(channel1_->media_receive_channel()->media_type(),
581 media_channel1()->media_type());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 }
583
584 // Test that SetLocalContent and SetRemoteContent properly configure
585 // the codecs.
586 void TestSetContents() {
587 CreateChannels(0, 0);
588 typename T::Content content;
589 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000590 std::string err;
591 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000592 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000593 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000594 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200595 EXPECT_TRUE(
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000596 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 }
598
Johannes Kron9190b822018-10-29 11:22:05 +0100599 // Test that SetLocalContent and SetRemoteContent properly configure
600 // extmap-allow-mixed.
601 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
602 // For a caller, SetLocalContent() is called first with an offer and next
603 // SetRemoteContent() is called with the answer.
604 CreateChannels(0, 0);
605 typename T::Content content;
606 CreateContent(0, kPcmuCodec, kH264Codec, &content);
607 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
608 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
609 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000610 std::string err;
611 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100612 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000613 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000614 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100615 }
616 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
617 // For a callee, SetRemoteContent() is called first with an offer and next
618 // SetLocalContent() is called with the answer.
619 CreateChannels(0, 0);
620 typename T::Content content;
621 CreateContent(0, kPcmuCodec, kH264Codec, &content);
622 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
623 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
624 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000625 std::string err;
626 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100627 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000628 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Harald Alvestrand36fafc82022-12-08 08:47:42 +0000629 EXPECT_EQ(answer, media_send_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100630 }
631
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 // Test that SetLocalContent and SetRemoteContent properly deals
633 // with an empty offer.
634 void TestSetContentsNullOffer() {
635 CreateChannels(0, 0);
636 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000637 std::string err;
638 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000640 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000641 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000642 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200643 EXPECT_TRUE(
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000644 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 }
646
647 // Test that SetLocalContent and SetRemoteContent properly set RTCP
648 // mux.
649 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800650 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 typename T::Content content;
652 CreateContent(0, kPcmuCodec, kH264Codec, &content);
653 // Both sides agree on mux. Should no longer be a separate RTCP channel.
654 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000655 std::string err;
656 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
657 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000659 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000661 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 }
663
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 // Test that SetLocalContent and SetRemoteContent properly
665 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800666 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 void TestChangeStreamParamsInContent() {
668 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 stream1.id = "stream1";
670 stream1.ssrcs.push_back(kSsrc1);
671 stream1.cname = "stream1_cname";
672
673 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 stream2.id = "stream2";
675 stream2.ssrcs.push_back(kSsrc2);
676 stream2.cname = "stream2_cname";
677
Artem Titov880fa812021-07-30 22:30:23 +0200678 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 CreateChannels(0, 0);
680 typename T::Content content1;
681 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
682 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000683 std::string err;
684 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200685 channel1_->Enable(true);
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000686 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000688 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200689 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800690 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
692 // Channel 2 do not send anything.
693 typename T::Content content2;
694 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000695 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000696 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000697 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200698 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200699 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200701 SendCustomRtp1(kSsrc1, 0);
702 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
704
Artem Titov880fa812021-07-30 22:30:23 +0200705 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700707 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000709 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200710 ASSERT_EQ(1u, media_channel2()->send_streams().size());
711 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000713 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000714 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
715 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716
717 // Channel 1 replies but stop sending stream1.
718 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700719 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000720 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000721 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000723 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200724 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200726 SendCustomRtp2(kSsrc2, 0);
727 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
729 }
730
731 // Test that we only start playout and sending at the right times.
732 void TestPlayoutAndSendingStates() {
733 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200734 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000735 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000737 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200738 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200739 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200740 }
Tommic9625f02021-05-06 22:03:19 +0200741 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200742 channel1_->Enable(true);
743 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000745 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200746 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000747 EXPECT_FALSE(media_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000748 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000749 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000750 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000752 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200753 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000754 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000755 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000756 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200758 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200759 }
Tommic9625f02021-05-06 22:03:19 +0200760 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000761 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000762 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200765 }
Tommic9625f02021-05-06 22:03:19 +0200766 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800767 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200768 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000769 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200770 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000771 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200773 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200774 }
Tommic9625f02021-05-06 22:03:19 +0200775 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200776 channel2_->Enable(true);
777 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200779 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200780 }
Tommic9625f02021-05-06 22:03:19 +0200781 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000783 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000785 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200786 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000787 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 }
789
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 // Test that changing the MediaContentDirection in the local and remote
791 // session description start playout and sending at the right time.
792 void TestMediaContentDirection() {
793 CreateChannels(0, 0);
794 typename T::Content content1;
795 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
796 typename T::Content content2;
797 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200798 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800799 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
Tommi1959f8f2021-04-26 10:20:19 +0200801 channel1_->Enable(true);
802 channel2_->Enable(true);
803 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200804 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000805 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200806 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000807 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200808 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200809 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200810 }
Tommic9625f02021-05-06 22:03:19 +0200811 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000813 std::string err;
814 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
815 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
816 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800817 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000818 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800819 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820
Peter Boström34fbfff2015-09-24 19:20:30 +0200821 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000822 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200823 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000824 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200825 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200826 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200827 }
Tommic9625f02021-05-06 22:03:19 +0200828 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829
Artem Titov880fa812021-07-30 22:30:23 +0200830 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800831 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000832 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800833 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000834 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000837 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200838 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000839 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200841 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200842 }
Tommic9625f02021-05-06 22:03:19 +0200843 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844
Artem Titov880fa812021-07-30 22:30:23 +0200845 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800846 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000847 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
848 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849
Peter Boström34fbfff2015-09-24 19:20:30 +0200850 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000851 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200852 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000853 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200854 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200855 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200856 }
Tommic9625f02021-05-06 22:03:19 +0200857 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858 }
859
Honghai Zhangcc411c02016-03-29 17:27:21 -0700860 // Tests that when the transport channel signals a candidate pair change
861 // event, the media channel will receive a call on the network route change.
862 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700863 static constexpr uint16_t kLocalNetId = 1;
864 static constexpr uint16_t kRemoteNetId = 2;
865 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800866 // Ipv4(20) + UDP(8).
867 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800868 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200869
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800870 CreateChannels(DTLS, DTLS);
871 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700872
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000873 typename T::MediaChannel* media_channel1 = this->media_channel1();
874 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700875
Zhi Huang942bc2e2017-11-13 13:26:07 -0800876 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200877 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800878 // when creating the channel.
879 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000880 media_channel1->set_num_network_route_changes(0);
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200881 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800882 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200883 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800884 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200885 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200886 });
887 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000888 EXPECT_EQ(1, media_channel1->num_network_route_changes());
889 EXPECT_FALSE(media_channel1->last_network_route().connected);
890 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700891
Danil Chapovalov2aaef452022-08-12 15:55:11 +0200892 SendTask(network_thread_, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800893 rtc::NetworkRoute network_route;
894 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100895 network_route.local =
896 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
897 network_route.remote =
898 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800899 network_route.last_sent_packet_id = kLastPacketId;
900 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800902 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
903
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200904 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200905 });
906 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000907 EXPECT_EQ(1, media_channel1->num_network_route_changes());
908 EXPECT_TRUE(media_channel1->last_network_route().connected);
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100909 EXPECT_EQ(kLocalNetId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000910 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100911 EXPECT_EQ(kRemoteNetId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000912 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200913 EXPECT_EQ(kLastPacketId,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000914 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800915 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000916 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700917 }
918
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 // Test setting up a call.
920 void TestCallSetup() {
921 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200922 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200924 if (verify_playout_) {
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000925 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200926 }
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000927 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200929 EXPECT_FALSE(IsSrtpActive(channel1_));
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000930 EXPECT_TRUE(media_channel1()->sending());
931 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200932 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200933 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200934 }
Tommic9625f02021-05-06 22:03:19 +0200935 EXPECT_TRUE(media_channel2()->sending());
936 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937 }
938
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 // Send voice RTP data to the other side and ensure it gets there.
940 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700941 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 EXPECT_TRUE(SendInitiate());
943 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200944 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
945 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200946 SendRtp1();
947 SendRtp2();
948 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 EXPECT_TRUE(CheckRtp1());
950 EXPECT_TRUE(CheckRtp2());
951 EXPECT_TRUE(CheckNoRtp1());
952 EXPECT_TRUE(CheckNoRtp2());
953 }
954
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200955 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800956 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200957 EXPECT_TRUE(SendInitiate());
958 EXPECT_TRUE(SendAccept());
959 SendRtp1();
960 SendRtp2();
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +0100961
962 DeinitChannels();
963
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200964 // Do not wait, destroy channels.
965 channel1_.reset(nullptr);
966 channel2_.reset(nullptr);
967 }
968
Zhi Huange830e682018-03-30 10:48:35 -0700969 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
970 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200971 EXPECT_FALSE(IsSrtpActive(channel1_));
972 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200974 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200976 EXPECT_TRUE(IsSrtpActive(channel1_));
977 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200978 SendRtp1();
979 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200980 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981 EXPECT_TRUE(CheckRtp1());
982 EXPECT_TRUE(CheckRtp2());
983 EXPECT_TRUE(CheckNoRtp1());
984 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 }
986
987 // Test that we can send and receive early media when a provisional answer is
988 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
989 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200990 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991
Yves Gerey665174f2018-06-19 15:03:05 +0200992 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
993 EXPECT_TRUE(SendOffer());
994 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200995 EXPECT_TRUE(IsSrtpActive(channel1_));
996 EXPECT_TRUE(IsSrtpActive(channel2_));
997 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
998 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200999 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +02001000 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1001 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001002 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003
Yves Gerey665174f2018-06-19 15:03:05 +02001004 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +02001005 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1006 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001007 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008
Yves Gerey665174f2018-06-19 15:03:05 +02001009 // Complete call setup and ensure everything is still OK.
1010 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001011 EXPECT_TRUE(IsSrtpActive(channel1_));
1012 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +02001013 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +02001014 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1015 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001016 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001017 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 }
1019
1020 // Test that we properly send RTP without SRTP from a thread.
1021 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001022 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023 EXPECT_TRUE(SendInitiate());
1024 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001025 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1026 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001027 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001028 WaitForThreads(involved_threads);
1029 EXPECT_TRUE(CheckRtp1());
1030 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 EXPECT_TRUE(CheckNoRtp1());
1032 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 }
1034
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 // Test that the mediachannel retains its sending state after the transport
1036 // becomes non-writable.
1037 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001038 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039 EXPECT_TRUE(SendInitiate());
1040 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001041 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1042 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001043 SendRtp1();
1044 SendRtp2();
1045 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 EXPECT_TRUE(CheckRtp1());
1047 EXPECT_TRUE(CheckRtp2());
1048 EXPECT_TRUE(CheckNoRtp1());
1049 EXPECT_TRUE(CheckNoRtp2());
1050
wu@webrtc.org97077a32013-10-25 21:18:33 +00001051 // Lose writability, which should fail.
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001052 SendTask(network_thread_,
1053 [this] { fake_rtp_dtls_transport1_->SetWritable(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001054 SendRtp1();
1055 SendRtp2();
1056 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 EXPECT_TRUE(CheckRtp1());
1058 EXPECT_TRUE(CheckNoRtp2());
1059
1060 // Regain writability
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001061 SendTask(network_thread_,
1062 [this] { fake_rtp_dtls_transport1_->SetWritable(true); });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001063 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001064 SendRtp1();
1065 SendRtp2();
1066 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 EXPECT_TRUE(CheckRtp1());
1068 EXPECT_TRUE(CheckRtp2());
1069 EXPECT_TRUE(CheckNoRtp1());
1070 EXPECT_TRUE(CheckNoRtp2());
1071
1072 // Lose writability completely
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001073 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001074 bool asymmetric = true;
1075 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1076 });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001077 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078
wu@webrtc.org97077a32013-10-25 21:18:33 +00001079 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001080 SendRtp1();
1081 SendRtp2();
1082 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_TRUE(CheckRtp1());
1084 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001085 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086
1087 // Gain writability back
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001088 SendTask(network_thread_, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001089 bool asymmetric = true;
1090 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1091 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001092 });
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001093 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001094 SendRtp1();
1095 SendRtp2();
1096 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_TRUE(CheckRtp1());
1098 EXPECT_TRUE(CheckRtp2());
1099 EXPECT_TRUE(CheckNoRtp1());
1100 EXPECT_TRUE(CheckNoRtp2());
1101 }
1102
Yves Gerey665174f2018-06-19 15:03:05 +02001103 void SendBundleToBundle(const int* pl_types,
1104 int len,
1105 bool rtcp_mux,
1106 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001107 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001109 // Only pl_type1 was added to the bundle filter for both `channel1_`
1110 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001111 int pl_type1 = pl_types[0];
1112 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001113 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001114 if (secure)
1115 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001116 if (rtcp_mux) {
1117 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001118 }
1119 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001122
1123 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001124 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1125 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1126 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001127 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001128 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1129 EXPECT_TRUE(CheckNoRtp1());
1130 EXPECT_TRUE(CheckNoRtp2());
1131
Zhi Huang365381f2018-04-13 16:44:34 -07001132 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1133 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001134 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001135 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1136 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 }
1138
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 void TestSetContentFailure() {
1140 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141
Peter Thatchera6d24442015-07-09 21:26:36 -07001142 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001143 std::unique_ptr<typename T::Content> content(
1144 CreateMediaContentWithStream(1));
1145
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001146 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001147 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001148 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001149 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001150 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001152 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001153 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001154 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001155
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001156 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001157 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001158 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 }
1160
1161 void TestSendTwoOffers() {
1162 CreateChannels(0, 0);
1163
Peter Thatchera6d24442015-07-09 21:26:36 -07001164 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001165 std::unique_ptr<typename T::Content> content1(
1166 CreateMediaContentWithStream(1));
1167 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001168 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001169 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170
Steve Anton18ee1d52017-09-11 11:32:35 -07001171 std::unique_ptr<typename T::Content> content2(
1172 CreateMediaContentWithStream(2));
1173 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001174 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001175 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1176 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 }
1178
1179 void TestReceiveTwoOffers() {
1180 CreateChannels(0, 0);
1181
Peter Thatchera6d24442015-07-09 21:26:36 -07001182 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001183 std::unique_ptr<typename T::Content> content1(
1184 CreateMediaContentWithStream(1));
1185 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001186 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001187 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188
Steve Anton18ee1d52017-09-11 11:32:35 -07001189 std::unique_ptr<typename T::Content> content2(
1190 CreateMediaContentWithStream(2));
1191 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001192 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001193 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1194 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 }
1196
1197 void TestSendPrAnswer() {
1198 CreateChannels(0, 0);
1199
Peter Thatchera6d24442015-07-09 21:26:36 -07001200 std::string err;
1201 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001202 std::unique_ptr<typename T::Content> content1(
1203 CreateMediaContentWithStream(1));
1204 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001205 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001206 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207
Peter Thatchera6d24442015-07-09 21:26:36 -07001208 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001209 std::unique_ptr<typename T::Content> content2(
1210 CreateMediaContentWithStream(2));
1211 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001212 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001213 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1214 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215
Peter Thatchera6d24442015-07-09 21:26:36 -07001216 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001217 std::unique_ptr<typename T::Content> content3(
1218 CreateMediaContentWithStream(3));
1219 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001220 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001221 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1222 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1223 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 }
1225
1226 void TestReceivePrAnswer() {
1227 CreateChannels(0, 0);
1228
Peter Thatchera6d24442015-07-09 21:26:36 -07001229 std::string err;
1230 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001231 std::unique_ptr<typename T::Content> content1(
1232 CreateMediaContentWithStream(1));
1233 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001234 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001235 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236
Peter Thatchera6d24442015-07-09 21:26:36 -07001237 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001238 std::unique_ptr<typename T::Content> content2(
1239 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001240 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001241 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001242 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1243 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244
Peter Thatchera6d24442015-07-09 21:26:36 -07001245 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001246 std::unique_ptr<typename T::Content> content3(
1247 CreateMediaContentWithStream(3));
1248 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001249 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001250 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1251 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1252 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253 }
1254
zstein56162b92017-04-24 16:54:35 -07001255 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001256 CreateChannels(0, 0);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001257 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001258
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001259 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001260 [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001261 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001262 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001264 network_thread_->PostTask(
Henrik Boström2deee4b2022-01-20 11:58:05 +01001265 [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001266 WaitForThreads();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001267 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268 }
1269
skvladdc1c62c2016-03-16 19:07:43 -07001270 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1271 typename T::Content content;
1272 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1273 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001274 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001275 }
1276
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001277 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001278 webrtc::RtpParameters parameters;
1279 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001280 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001281 parameters.encodings.push_back(encoding);
1282 return parameters;
1283 }
1284
1285 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001286 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001287 EXPECT_EQ(1UL, parameters.encodings.size());
1288 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1289 }
1290
1291 void DefaultMaxBitrateIsUnlimited() {
1292 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001293 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001294 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001295 SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001296 EXPECT_EQ(media_channel1()->max_bps(), -1);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001297 VerifyMaxBitrate(media_send_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001298 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001299 }
1300
Zhi Huange830e682018-03-30 10:48:35 -07001301 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001302 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001303 // with the options on the new one.
1304
Steve Anton8a63f782017-10-23 13:08:53 -07001305 // For example, audio and video may use separate socket options, but initially
1306 // be unbundled, then later become bundled. When this happens, their preferred
1307 // socket options should be merged to the underlying transport they share.
1308 void SocketOptionsMergedOnSetTransport() {
1309 constexpr int kSndBufSize = 4000;
1310 constexpr int kRcvBufSize = 8000;
1311
Zhi Huange830e682018-03-30 10:48:35 -07001312 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001313
Zhi Huange830e682018-03-30 10:48:35 -07001314 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001315 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001316
Niels Möller92430882021-03-18 10:03:19 +01001317 bool rcv_success, send_success;
1318 int rcv_buf, send_buf;
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001319 SendTask(network_thread_, [&] {
Tommic9625f02021-05-06 22:03:19 +02001320 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1321 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1322 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1323 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001324 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001325 send_success = fake_rtp_dtls_transport2_->GetOption(
1326 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1327 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1328 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1329 });
1330
1331 ASSERT_TRUE(send_success);
1332 EXPECT_EQ(kSndBufSize, send_buf);
1333 ASSERT_TRUE(rcv_success);
1334 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001335 }
1336
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001337 void CreateSimulcastContent(const std::vector<std::string>& rids,
1338 typename T::Content* content) {
1339 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001340 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001341 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1342 }
1343
1344 StreamParams stream;
1345 stream.set_rids(rid_descriptions);
1346 CreateContent(0, kPcmuCodec, kH264Codec, content);
1347 // This is for unified plan, so there can be only one StreamParams.
1348 content->mutable_streams().clear();
1349 content->AddStream(stream);
1350 }
1351
1352 void VerifySimulcastStreamParams(const StreamParams& expected,
1353 const typename T::Channel* channel) {
1354 const std::vector<StreamParams>& streams = channel->local_streams();
1355 ASSERT_EQ(1u, streams.size());
1356 const StreamParams& result = streams[0];
1357 EXPECT_EQ(expected.rids(), result.rids());
1358 EXPECT_TRUE(result.has_ssrcs());
1359 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1360 std::vector<uint32_t> primary_ssrcs;
1361 result.GetPrimarySsrcs(&primary_ssrcs);
1362 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1363 }
1364
1365 void TestUpdateLocalStreamsWithSimulcast() {
1366 CreateChannels(0, 0);
1367 typename T::Content content1, content2, content3;
1368 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001369 std::string err;
1370 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001371 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1372 StreamParams stream1 = channel1_->local_streams()[0];
1373
1374 // Create a similar offer. SetLocalContent should not remove and add.
1375 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001376 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001377 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1378 StreamParams stream2 = channel1_->local_streams()[0];
1379 // Check that the streams are identical (SSRCs didn't change).
1380 EXPECT_EQ(stream1, stream2);
1381
1382 // Create third offer that has same RIDs in different order.
1383 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001384 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001385 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1386 }
1387
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001388 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001389 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1390 static void ProcessThreadQueue(rtc::Thread* thread) {
1391 RTC_DCHECK(thread->IsCurrent());
1392 while (!thread->empty()) {
1393 thread->ProcessMessages(0);
1394 }
1395 }
Tommi1959f8f2021-04-26 10:20:19 +02001396 static void FlushCurrentThread() {
1397 rtc::Thread::Current()->ProcessMessages(0);
1398 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001399 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001400 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001401 for (rtc::Thread* thread : threads) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001402 SendTask(thread, [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001403 }
1404 ProcessThreadQueue(rtc::Thread::Current());
1405 // Network thread move them around and post back to worker = current thread.
1406 if (!network_thread_->IsCurrent()) {
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001407 SendTask(network_thread_,
1408 [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001409 }
1410 // Worker thread = current Thread process received messages.
1411 ProcessThreadQueue(rtc::Thread::Current());
1412 }
Tommic9625f02021-05-06 22:03:19 +02001413
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001414 // Accessors that return the FakeMedia<type>Channel object.
1415 // Note that these depend on getting the object back that was
1416 // passed to the channel constructor.
1417 typename T::MediaChannel* media_channel1() {
Tommic9625f02021-05-06 22:03:19 +02001418 RTC_DCHECK(channel1_);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001419 RTC_DCHECK(channel1_->media_channel());
1420 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Tommic9625f02021-05-06 22:03:19 +02001421 }
1422
1423 typename T::MediaChannel* media_channel2() {
1424 RTC_DCHECK(channel2_);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001425 RTC_DCHECK(channel2_->media_channel());
1426 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1427 }
1428
1429 typename T::MediaSendChannel* media_send_channel1() {
1430 RTC_DCHECK(channel1_);
1431 RTC_DCHECK(channel1_->media_send_channel());
1432 return channel1_->media_send_channel();
1433 }
1434
1435 typename T::MediaSendChannel* media_send_channel2() {
1436 RTC_DCHECK(channel2_);
Harald Alvestrand36fafc82022-12-08 08:47:42 +00001437 RTC_DCHECK(channel2_->media_send_channel());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001438 return channel2_->media_send_channel();
Tommic9625f02021-05-06 22:03:19 +02001439 }
1440
Niels Möller83830f32022-05-20 09:12:57 +02001441 rtc::AutoThread main_thread_;
Peter Boström34fbfff2015-09-24 19:20:30 +02001442 // TODO(pbos): Remove playout from all media channels and let renderers mute
1443 // themselves.
1444 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001445 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1446 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001447 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1448 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001449 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1450 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1451 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1452 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1453 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1454 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1455 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1456 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001457 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1458 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1459 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001461 std::unique_ptr<typename T::Channel> channel1_;
1462 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463 typename T::Content local_media_content1_;
1464 typename T::Content local_media_content2_;
1465 typename T::Content remote_media_content1_;
1466 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001468 rtc::Buffer rtp_packet_;
1469 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001470 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001471 rtc::UniqueRandomIdGenerator ssrc_generator_;
Jonas Orelanded99dae2022-03-09 09:28:10 +01001472 webrtc::test::ScopedKeyValueConfig field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001473};
1474
Yves Gerey665174f2018-06-19 15:03:05 +02001475template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001476std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1477 rtc::Thread* worker_thread,
1478 rtc::Thread* network_thread,
1479 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1480 webrtc::RtpTransportInternal* rtp_transport,
1481 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001482 rtc::Thread* signaling_thread = rtc::Thread::Current();
1483 auto channel = std::make_unique<cricket::VoiceChannel>(
1484 worker_thread, network_thread, signaling_thread, std::move(ch),
1485 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1486 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001487 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001488 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001489 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001490 });
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001491 return channel;
1492}
1493
1494template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495void ChannelTest<VoiceTraits>::CreateContent(
1496 int flags,
1497 const cricket::AudioCodec& audio_codec,
1498 const cricket::VideoCodec& video_codec,
1499 cricket::AudioContentDescription* audio) {
1500 audio->AddCodec(audio_codec);
1501 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502}
1503
Yves Gerey665174f2018-06-19 15:03:05 +02001504template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505void ChannelTest<VoiceTraits>::CopyContent(
1506 const cricket::AudioContentDescription& source,
1507 cricket::AudioContentDescription* audio) {
1508 *audio = source;
1509}
1510
Yves Gerey665174f2018-06-19 15:03:05 +02001511template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1513 const cricket::AudioCodec& c2) {
1514 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001515 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516}
1517
Peter Boström0c4e06b2015-10-07 12:23:21 +02001518template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001520 uint32_t ssrc,
1521 int flags,
1522 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 audio->AddLegacyStream(ssrc);
1524}
1525
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001526class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527 public:
solenberg1dd98f32015-09-10 01:57:14 -07001528 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001529 VoiceChannelSingleThreadTest()
1530 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1531};
1532
1533class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1534 public:
1535 typedef ChannelTest<VoiceTraits> Base;
1536 VoiceChannelDoubleThreadTest()
1537 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538};
1539
jbauch5869f502017-06-29 12:31:36 -07001540class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001541 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001542 public:
1543 typedef ChannelTest<VoiceTraits> Base;
1544 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001545 : Base(true,
1546 kPcmuFrameWithExtensions,
1547 kRtcpReport,
1548 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001549};
1550
1551class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001552 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001553 public:
1554 typedef ChannelTest<VoiceTraits> Base;
1555 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001556 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1557 }
jbauch5869f502017-06-29 12:31:36 -07001558};
1559
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001561template <>
Steve Anton8699a322017-11-06 15:53:33 -08001562std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001563 rtc::Thread* worker_thread,
1564 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001565 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001566 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001567 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001568 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001569 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001570 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001571 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1572 &ssrc_generator_);
Danil Chapovalov2aaef452022-08-12 15:55:11 +02001573 SendTask(network_thread, [&]() {
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001574 RTC_DCHECK_RUN_ON(channel->network_thread());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +01001575 channel->SetRtpTransport(rtp_transport);
Tomas Gunnarsson1933d3b2022-01-17 11:25:21 +01001576 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577 return channel;
1578}
1579
Yves Gerey665174f2018-06-19 15:03:05 +02001580template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581void ChannelTest<VideoTraits>::CreateContent(
1582 int flags,
1583 const cricket::AudioCodec& audio_codec,
1584 const cricket::VideoCodec& video_codec,
1585 cricket::VideoContentDescription* video) {
1586 video->AddCodec(video_codec);
1587 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588}
1589
Yves Gerey665174f2018-06-19 15:03:05 +02001590template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591void ChannelTest<VideoTraits>::CopyContent(
1592 const cricket::VideoContentDescription& source,
1593 cricket::VideoContentDescription* video) {
1594 *video = source;
1595}
1596
Yves Gerey665174f2018-06-19 15:03:05 +02001597template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1599 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001600 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601}
1602
Peter Boström0c4e06b2015-10-07 12:23:21 +02001603template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001605 uint32_t ssrc,
1606 int flags,
1607 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 video->AddLegacyStream(ssrc);
1609}
1610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 public:
solenberg1dd98f32015-09-10 01:57:14 -07001613 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614 VideoChannelSingleThreadTest()
1615 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001616};
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1619 public:
1620 typedef ChannelTest<VideoTraits> Base;
1621 VideoChannelDoubleThreadTest()
1622 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1623};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001624
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001625TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 Base::TestInit();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001627 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1628 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629}
1630
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001631TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1632 Base::TestDeinit();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::TestSetContents();
1637}
1638
Johannes Kron9190b822018-10-29 11:22:05 +01001639TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1640 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1641}
1642
1643TEST_F(VoiceChannelSingleThreadTest,
1644 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1645 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1646}
1647
1648TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1649 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1650}
1651
1652TEST_F(VoiceChannelSingleThreadTest,
1653 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1654 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1655}
1656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001657TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 Base::TestSetContentsNullOffer();
1659}
1660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001661TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 Base::TestSetContentsRtcpMux();
1663}
1664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 Base::TestSetContentsRtcpMux();
1667}
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 Base::TestChangeStreamParamsInContent();
1671}
1672
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001673TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 Base::TestPlayoutAndSendingStates();
1675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 Base::TestMediaContentDirection();
1679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001682 Base::TestNetworkRouteChanges();
1683}
1684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001685TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 Base::TestCallSetup();
1687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 Base::SendRtpToRtp();
1691}
1692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001693TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001694 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695}
1696
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001697TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001698 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001699}
1700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001701TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1703}
1704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001705TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 Base::SendRtpToRtpOnThread();
1707}
1708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 Base::SendWithWritabilityLoss();
1711}
1712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 Base::TestSetContentFailure();
1715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 Base::TestSendTwoOffers();
1719}
1720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001721TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722 Base::TestReceiveTwoOffers();
1723}
1724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 Base::TestSendPrAnswer();
1727}
1728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001729TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730 Base::TestReceivePrAnswer();
1731}
1732
zstein56162b92017-04-24 16:54:35 -07001733TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1734 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735}
1736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001738 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739}
1740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001742 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001746 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001750 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001754 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001755}
1756
Steve Anton8a63f782017-10-23 13:08:53 -07001757TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1758 Base::SocketOptionsMergedOnSetTransport();
1759}
1760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001761// VoiceChannelDoubleThreadTest
1762TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 Base::TestInit();
Harald Alvestrand50454ef2022-12-15 16:49:13 +00001764 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1765 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766}
1767
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001768TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1769 Base::TestDeinit();
1770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001773 Base::TestSetContents();
1774}
1775
Johannes Kron9190b822018-10-29 11:22:05 +01001776TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1777 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1778}
1779
1780TEST_F(VoiceChannelDoubleThreadTest,
1781 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1782 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1783}
1784
1785TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1786 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1787}
1788
1789TEST_F(VoiceChannelDoubleThreadTest,
1790 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1791 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1792}
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 Base::TestSetContentsNullOffer();
1796}
1797
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001798TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 Base::TestSetContentsRtcpMux();
1800}
1801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 Base::TestSetContentsRtcpMux();
1804}
1805
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 Base::TestChangeStreamParamsInContent();
1808}
1809
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001810TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 Base::TestPlayoutAndSendingStates();
1812}
1813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1815 Base::TestMediaContentDirection();
1816}
1817
1818TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1819 Base::TestNetworkRouteChanges();
1820}
1821
1822TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1823 Base::TestCallSetup();
1824}
1825
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001826TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1827 Base::SendRtpToRtp();
1828}
1829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001831 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001832}
1833
1834TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001835 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001836}
1837
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001838TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1839 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1840}
1841
1842TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1843 Base::SendRtpToRtpOnThread();
1844}
1845
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001846TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1847 Base::SendWithWritabilityLoss();
1848}
1849
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001850TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1851 Base::TestSetContentFailure();
1852}
1853
1854TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1855 Base::TestSendTwoOffers();
1856}
1857
1858TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1859 Base::TestReceiveTwoOffers();
1860}
1861
1862TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1863 Base::TestSendPrAnswer();
1864}
1865
1866TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1867 Base::TestReceivePrAnswer();
1868}
1869
zstein56162b92017-04-24 16:54:35 -07001870TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1871 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001872}
1873
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001874TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1875 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1876}
1877
1878TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1879 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1880}
1881
1882TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1883 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1884}
1885
1886TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1887 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1888}
1889
1890TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1891 Base::DefaultMaxBitrateIsUnlimited();
1892}
1893
Steve Anton8a63f782017-10-23 13:08:53 -07001894TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1895 Base::SocketOptionsMergedOnSetTransport();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898// VideoChannelSingleThreadTest
1899TEST_F(VideoChannelSingleThreadTest, TestInit) {
1900 Base::TestInit();
1901}
1902
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001903TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1904 Base::TestDeinit();
1905}
1906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001907TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1908 Base::TestSetContents();
1909}
1910
Johannes Kron9190b822018-10-29 11:22:05 +01001911TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1912 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1913}
1914
1915TEST_F(VideoChannelSingleThreadTest,
1916 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1917 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1918}
1919
1920TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1921 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1922}
1923
1924TEST_F(VideoChannelSingleThreadTest,
1925 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1926 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1927}
1928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001929TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1930 Base::TestSetContentsNullOffer();
1931}
1932
1933TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1934 Base::TestSetContentsRtcpMux();
1935}
1936
1937TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1938 Base::TestSetContentsRtcpMux();
1939}
1940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1942 Base::TestChangeStreamParamsInContent();
1943}
1944
1945TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1946 Base::TestPlayoutAndSendingStates();
1947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 Base::TestMediaContentDirection();
1951}
1952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001953TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001954 Base::TestNetworkRouteChanges();
1955}
1956
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 Base::TestCallSetup();
1959}
1960
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001961TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 Base::SendRtpToRtp();
1963}
1964
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001966 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001969TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001970 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971}
1972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1975}
1976
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001977TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 Base::SendRtpToRtpOnThread();
1979}
1980
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001981TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 Base::SendWithWritabilityLoss();
1983}
1984
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001985TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986 Base::TestSetContentFailure();
1987}
1988
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001989TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001990 Base::TestSendTwoOffers();
1991}
1992
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001993TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001994 Base::TestReceiveTwoOffers();
1995}
1996
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001997TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998 Base::TestSendPrAnswer();
1999}
2000
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002001TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002002 Base::TestReceivePrAnswer();
2003}
2004
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002005TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002006 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007}
2008
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002009TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002010 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002011}
2012
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002013TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002014 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002015}
2016
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002017TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002018 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019}
2020
zstein56162b92017-04-24 16:54:35 -07002021TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2022 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023}
2024
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002025TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002026 Base::DefaultMaxBitrateIsUnlimited();
2027}
2028
Steve Anton8a63f782017-10-23 13:08:53 -07002029TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2030 Base::SocketOptionsMergedOnSetTransport();
2031}
2032
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002033TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2034 Base::TestUpdateLocalStreamsWithSimulcast();
2035}
2036
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002037TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2038 const cricket::VideoCodec kVp8Codec(97, "VP8");
2039 cricket::VideoCodec vp9_codec(98, "VP9");
2040 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2041 cricket::VideoContentDescription video;
2042 video.set_codecs({kVp8Codec, vp9_codec});
2043
2044 CreateChannels(0, 0);
2045
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002046 std::string err;
2047 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002048 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2049 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2050 EXPECT_TRUE(
2051 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2052 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2053 EXPECT_TRUE(
2054 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2055 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002056 cricket::kPacketizationParamRaw);
2057}
2058
2059TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2060 const cricket::VideoCodec kVp8Codec(97, "VP8");
2061 cricket::VideoCodec vp9_codec(98, "VP9");
2062 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2063 cricket::VideoContentDescription video;
2064 video.set_codecs({kVp8Codec, vp9_codec});
2065
2066 CreateChannels(0, 0);
2067
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002068 std::string err;
2069 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2070 EXPECT_TRUE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002071 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2072 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2073 EXPECT_TRUE(
2074 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2075 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2076 EXPECT_TRUE(
2077 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2078 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002079 cricket::kPacketizationParamRaw);
2080}
2081
2082TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2083 const cricket::VideoCodec kVp8Codec(97, "VP8");
2084 cricket::VideoCodec vp9_codec(98, "VP9");
2085 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2086 cricket::VideoContentDescription video;
2087 video.set_codecs({kVp8Codec, vp9_codec});
2088
2089 CreateChannels(0, 0);
2090
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002091 std::string err;
2092 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2093 EXPECT_TRUE(err.empty());
2094 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2095 EXPECT_TRUE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002096 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2097 EXPECT_TRUE(
2098 media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2099 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2100 EXPECT_TRUE(
2101 media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2102 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002103 cricket::kPacketizationParamRaw);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002104 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2105 EXPECT_TRUE(
2106 media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2107 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2108 EXPECT_TRUE(
2109 media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2110 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002111 cricket::kPacketizationParamRaw);
2112}
2113
2114TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2115 const cricket::VideoCodec kLocalCodec(98, "VP8");
2116 cricket::VideoCodec remote_codec(99, "VP8");
2117 remote_codec.packetization = cricket::kPacketizationParamRaw;
2118 cricket::VideoContentDescription local_video;
2119 local_video.set_codecs({kLocalCodec});
2120 cricket::VideoContentDescription remote_video;
2121 remote_video.set_codecs({remote_codec});
2122
2123 CreateChannels(0, 0);
2124
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002125 std::string err;
2126 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2127 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002128 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2129 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2130 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2131 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002132}
2133
2134TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2135 cricket::VideoCodec local_codec(98, "VP8");
2136 local_codec.packetization = cricket::kPacketizationParamRaw;
2137 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2138 cricket::VideoContentDescription local_video;
2139 local_video.set_codecs({local_codec});
2140 cricket::VideoContentDescription remote_video;
2141 remote_video.set_codecs({kRemoteCodec});
2142
2143 CreateChannels(0, 0);
2144
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002145 std::string err;
2146 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002147 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002148 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002149 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2150 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2151 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2152 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002153}
2154
2155TEST_F(VideoChannelSingleThreadTest,
2156 TestSetRemoteAnswerWithInvalidPacketization) {
2157 cricket::VideoCodec local_codec(98, "VP8");
2158 local_codec.packetization = cricket::kPacketizationParamRaw;
2159 cricket::VideoCodec remote_codec(99, "VP8");
2160 remote_codec.packetization = "unknownpacketizationattributevalue";
2161 cricket::VideoContentDescription local_video;
2162 local_video.set_codecs({local_codec});
2163 cricket::VideoContentDescription remote_video;
2164 remote_video.set_codecs({remote_codec});
2165
2166 CreateChannels(0, 0);
2167
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002168 std::string err;
2169 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2170 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002171 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002172 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2173 EXPECT_FALSE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002174 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2175 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002176 cricket::kPacketizationParamRaw);
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002177 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002178}
2179
2180TEST_F(VideoChannelSingleThreadTest,
2181 TestSetLocalAnswerWithInvalidPacketization) {
2182 cricket::VideoCodec local_codec(98, "VP8");
2183 local_codec.packetization = cricket::kPacketizationParamRaw;
2184 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2185 cricket::VideoContentDescription local_video;
2186 local_video.set_codecs({local_codec});
2187 cricket::VideoContentDescription remote_video;
2188 remote_video.set_codecs({kRemoteCodec});
2189
2190 CreateChannels(0, 0);
2191
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002192 std::string err;
2193 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2194 EXPECT_TRUE(err.empty());
2195 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2196 EXPECT_FALSE(err.empty());
Harald Alvestrand50454ef2022-12-15 16:49:13 +00002197 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2198 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2199 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002200}
2201
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002202// VideoChannelDoubleThreadTest
2203TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2204 Base::TestInit();
2205}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002207TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2208 Base::TestDeinit();
2209}
2210
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002211TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2212 Base::TestSetContents();
2213}
2214
Johannes Kron9190b822018-10-29 11:22:05 +01002215TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2216 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2217}
2218
2219TEST_F(VideoChannelDoubleThreadTest,
2220 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2221 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2225 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2226}
2227
2228TEST_F(VideoChannelDoubleThreadTest,
2229 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2230 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2231}
2232
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002233TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2234 Base::TestSetContentsNullOffer();
2235}
2236
2237TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2238 Base::TestSetContentsRtcpMux();
2239}
2240
2241TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2242 Base::TestSetContentsRtcpMux();
2243}
2244
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2246 Base::TestChangeStreamParamsInContent();
2247}
2248
2249TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2250 Base::TestPlayoutAndSendingStates();
2251}
2252
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002253TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2254 Base::TestMediaContentDirection();
2255}
2256
2257TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2258 Base::TestNetworkRouteChanges();
2259}
2260
2261TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2262 Base::TestCallSetup();
2263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2266 Base::SendRtpToRtp();
2267}
2268
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002270 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271}
2272
2273TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002274 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002275}
2276
2277TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2278 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2279}
2280
2281TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2282 Base::SendRtpToRtpOnThread();
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2286 Base::SendWithWritabilityLoss();
2287}
2288
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2290 Base::TestSetContentFailure();
2291}
2292
2293TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2294 Base::TestSendTwoOffers();
2295}
2296
2297TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2298 Base::TestReceiveTwoOffers();
2299}
2300
2301TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2302 Base::TestSendPrAnswer();
2303}
2304
2305TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2306 Base::TestReceivePrAnswer();
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2310 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2311}
2312
2313TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2314 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2315}
2316
2317TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2318 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2319}
2320
2321TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2322 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2323}
2324
zstein56162b92017-04-24 16:54:35 -07002325TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2326 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2330 Base::DefaultMaxBitrateIsUnlimited();
2331}
2332
Steve Anton8a63f782017-10-23 13:08:53 -07002333TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2334 Base::SocketOptionsMergedOnSetTransport();
2335}
2336
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338// TODO(pthatcher): TestSetReceiver?