blob: a16a9f041dad03f05110e69698e07f925338ddc6 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080014#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010015#include <utility>
kwiberg31022942016-03-11 14:18:21 -080016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "media/base/fake_media_engine.h"
22#include "media/base/fake_rtp.h"
23#include "media/base/media_channel.h"
24#include "p2p/base/candidate_pair_interface.h"
25#include "p2p/base/fake_dtls_transport.h"
26#include "p2p/base/fake_packet_transport.h"
27#include "p2p/base/ice_transport_internal.h"
28#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Tommic9625f02021-05-06 22:03:19 +020038#include "rtc_base/task_utils/pending_task_safety_flag.h"
39#include "rtc_base/task_utils/to_queued_task.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020040#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010041#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042
zhihuangb2cdd932017-01-19 16:54:25 -080043using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080045using cricket::RidDescription;
46using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080048using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080049using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051namespace {
52const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
53const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
54const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070055const cricket::VideoCodec kH264Codec(97, "H264");
56const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020057const uint32_t kSsrc1 = 0x1111;
58const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070059const uint32_t kSsrc3 = 0x3333;
60const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020061const int kAudioPts[] = {0, 8};
62const int kVideoPts[] = {97, 99};
63enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010064
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
deadbeefcbecd352015-09-23 11:50:27 -070067template <class ChannelT,
68 class MediaChannelT,
69 class ContentT,
70 class CodecT,
71 class MediaInfoT,
72 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073class Traits {
74 public:
75 typedef ChannelT Channel;
76 typedef MediaChannelT MediaChannel;
77 typedef ContentT Content;
78 typedef CodecT Codec;
79 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081};
82
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083class VoiceTraits : public Traits<cricket::VoiceChannel,
84 cricket::FakeVoiceMediaChannel,
85 cricket::AudioContentDescription,
86 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
90class VideoTraits : public Traits<cricket::VideoChannel,
91 cricket::FakeVideoMediaChannel,
92 cricket::VideoContentDescription,
93 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020094 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070095 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096
Harald Alvestrand48171ec2021-04-20 15:06:03 +000097// Base class for Voice/Video tests
Yves Gerey665174f2018-06-19 15:03:05 +020098template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 public:
deadbeefac22f702017-01-12 21:59:29 -0800101 enum Flags {
102 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800103 SSRC_MUX = 0x8,
104 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800105 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800106 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700107 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800108 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109
Peter Boström34fbfff2015-09-24 19:20:30 +0200110 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200111 rtc::ArrayView<const uint8_t> rtp_data,
112 rtc::ArrayView<const uint8_t> rtcp_data,
113 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200114 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800116 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 if (network_is_worker == NetworkIsWorker::Yes) {
118 network_thread_ = rtc::Thread::Current();
119 } else {
120 network_thread_keeper_ = rtc::Thread::Create();
121 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 network_thread_ = network_thread_keeper_.get();
123 }
Tommic9625f02021-05-06 22:03:19 +0200124 RTC_DCHECK(network_thread_);
125 }
126
127 ~ChannelTest() {
128 if (network_thread_) {
129 network_thread_->Invoke<void>(
130 RTC_FROM_HERE, [this]() { network_thread_safety_->SetNotAlive(); });
131 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200135 CreateChannels(std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200136 nullptr, typename T::Options(), network_thread_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200137 std::make_unique<typename T::MediaChannel>(
Tommic9625f02021-05-06 22:03:19 +0200138 nullptr, typename T::Options(), network_thread_),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200139 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 }
Steve Anton8699a322017-11-06 15:53:33 -0800141 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
142 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200143 int flags1,
144 int flags2) {
Tommic9625f02021-05-06 22:03:19 +0200145 RTC_DCHECK(!channel1_);
146 RTC_DCHECK(!channel2_);
147
deadbeeff5346592017-01-24 21:51:21 -0800148 // Network thread is started in CreateChannels, to allow the test to
149 // configure a fake clock before any threads are spawned and attempt to
150 // access the time.
151 if (network_thread_keeper_) {
152 network_thread_keeper_->Start();
153 }
Zhi Huange830e682018-03-30 10:48:35 -0700154
deadbeeff5346592017-01-24 21:51:21 -0800155 // Make sure if using raw packet transports, they're used for both
156 // channels.
157 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200158 rtc::Thread* worker_thread = rtc::Thread::Current();
deadbeeff5346592017-01-24 21:51:21 -0800159 // Based on flags, create fake DTLS or raw packet transports.
160 if (flags1 & RAW_PACKET_TRANSPORT) {
161 fake_rtp_packet_transport1_.reset(
162 new rtc::FakePacketTransport("channel1_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700163 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800164 fake_rtcp_packet_transport1_.reset(
165 new rtc::FakePacketTransport("channel1_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800166 }
167 } else {
168 // Confirmed to work with KT_RSA and KT_ECDSA.
169 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700171 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800172 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100173 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
174 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800175 }
176 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100177 auto cert1 = rtc::RTCCertificate::Create(
178 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800179 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
180 if (fake_rtcp_dtls_transport1_) {
181 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
182 }
183 }
184 }
185 // Based on flags, create fake DTLS or raw packet transports.
186 if (flags2 & RAW_PACKET_TRANSPORT) {
187 fake_rtp_packet_transport2_.reset(
188 new rtc::FakePacketTransport("channel2_rtp"));
Zhi Huange830e682018-03-30 10:48:35 -0700189 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800190 fake_rtcp_packet_transport2_.reset(
191 new rtc::FakePacketTransport("channel2_rtcp"));
deadbeeff5346592017-01-24 21:51:21 -0800192 }
193 } else {
194 // Confirmed to work with KT_RSA and KT_ECDSA.
195 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100196 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
Zhi Huange830e682018-03-30 10:48:35 -0700197 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800198 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100199 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
200 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800201 }
202 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100203 auto cert2 = rtc::RTCCertificate::Create(
204 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800205 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
206 if (fake_rtcp_dtls_transport2_) {
207 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
208 }
209 }
210 }
Zhi Huange830e682018-03-30 10:48:35 -0700211 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
212 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
213 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
214 flags1);
215 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
216 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
217 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
218 flags2);
219
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800220 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
221 rtp_transport1_.get(), flags1);
222 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
223 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200224 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
225 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226 CopyContent(local_media_content1_, &remote_media_content1_);
227 CopyContent(local_media_content2_, &remote_media_content2_);
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 // Add stream information (SSRC) to the local content but not to the remote
230 // content. This means that we per default know the SSRC of what we send but
231 // not what we receive.
232 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
233 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
234
235 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
236 if (flags1 & SSRC_MUX) {
237 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
238 }
239 if (flags2 & SSRC_MUX) {
240 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
241 }
242 }
Steve Anton8699a322017-11-06 15:53:33 -0800243 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200244 rtc::Thread* worker_thread,
245 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800246 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700247 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200248 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249
Zhi Huange830e682018-03-30 10:48:35 -0700250 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
251 rtc::PacketTransportInternal* rtp_packet_transport,
252 rtc::PacketTransportInternal* rtcp_packet_transport,
253 DtlsTransportInternal* rtp_dtls_transport,
254 DtlsTransportInternal* rtcp_dtls_transport,
255 int flags) {
256 if (flags & RTCP_MUX) {
257 rtcp_packet_transport = nullptr;
258 rtcp_dtls_transport = nullptr;
259 }
260
261 if (flags & DTLS) {
262 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
263 } else {
264 if (flags & RAW_PACKET_TRANSPORT) {
265 return CreateUnencryptedTransport(rtp_packet_transport,
266 rtcp_packet_transport);
267 } else {
268 return CreateUnencryptedTransport(rtp_dtls_transport,
269 rtcp_dtls_transport);
270 }
271 }
272 }
273
274 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
275 rtc::PacketTransportInternal* rtp_packet_transport,
276 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200277 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200278 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700279
Niels Möller92430882021-03-18 10:03:19 +0100280 network_thread_->Invoke<void>(
281 RTC_FROM_HERE,
282 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
283 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
284 if (rtcp_packet_transport) {
285 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
286 }
287 });
Zhi Huange830e682018-03-30 10:48:35 -0700288 return rtp_transport;
289 }
290
291 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
292 cricket::DtlsTransportInternal* rtp_dtls_transport,
293 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200294 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700295 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700296
Niels Möller92430882021-03-18 10:03:19 +0100297 network_thread_->Invoke<void>(
298 RTC_FROM_HERE,
299 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
300 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
301 rtcp_dtls_transport);
302 });
Zhi Huange830e682018-03-30 10:48:35 -0700303 return dtls_srtp_transport;
304 }
305
deadbeeff5346592017-01-24 21:51:21 -0800306 void ConnectFakeTransports() {
307 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
308 bool asymmetric = false;
309 // Depending on test flags, could be using DTLS or raw packet transport.
310 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
311 fake_rtp_dtls_transport1_->SetDestination(
312 fake_rtp_dtls_transport2_.get(), asymmetric);
313 }
314 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
315 fake_rtcp_dtls_transport1_->SetDestination(
316 fake_rtcp_dtls_transport2_.get(), asymmetric);
317 }
318 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
319 fake_rtp_packet_transport1_->SetDestination(
320 fake_rtp_packet_transport2_.get(), asymmetric);
321 }
322 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
323 fake_rtcp_packet_transport1_->SetDestination(
324 fake_rtcp_packet_transport2_.get(), asymmetric);
325 }
326 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800327 // The transport becoming writable will asynchronously update the send state
328 // on the worker thread; since this test uses the main thread as the worker
329 // thread, we must process the message queue for this to occur.
330 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800331 }
332
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000334 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800335 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336 if (result) {
337 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200338 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800340 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800342 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000343 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800344 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 }
346 }
347 return result;
348 }
349
350 bool SendAccept() {
351 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200352 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356
357 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
361 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 return result;
366 }
367
368 bool SendProvisionalAnswer() {
369 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800370 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel2_->Enable(true);
373 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800374 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000384 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800385 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 return result;
387 }
388
Tommic9625f02021-05-06 22:03:19 +0200389 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
390 network_thread_->PostTask(webrtc::ToQueuedTask(
391 network_thread_safety_, [media_channel, data = std::move(data)]() {
392 media_channel->SendRtp(data.data(), data.size(),
393 rtc::PacketOptions());
394 }));
395 }
396
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200397 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200398 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 }
Tommic9625f02021-05-06 22:03:19 +0200400
401 void SendRtp1(rtc::Buffer data) {
402 SendRtp(media_channel1(), std::move(data));
403 }
404
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200405 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200406 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
Tommic9625f02021-05-06 22:03:19 +0200408
409 void SendRtp2(rtc::Buffer data) {
410 SendRtp(media_channel2(), std::move(data));
411 }
412
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200415 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200418 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 bool CheckRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200422 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200425 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200428 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200430 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200432 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200434 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
437 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::SetBE32(data.data() + 8, ssrc);
440 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000441 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000443 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 return data;
445 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446
Tommic9625f02021-05-06 22:03:19 +0200447 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
448 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
450 void CreateContent(int flags,
451 const cricket::AudioCodec& audio_codec,
452 const cricket::VideoCodec& video_codec,
453 typename T::Content* content) {
454 // overridden in specialized classes
455 }
456 void CopyContent(const typename T::Content& source,
457 typename T::Content* content) {
458 // overridden in specialized classes
459 }
460
Steve Anton18ee1d52017-09-11 11:32:35 -0700461 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700463 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
464 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700465 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700466 AddLegacyStreamInContent(ssrc, 0, content);
467 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
469
ossu292d6582016-03-17 02:31:13 -0700470 // Will manage the lifetime of a CallThread, making sure it's
471 // destroyed before this object goes out of scope.
472 class ScopedCallThread {
473 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100475 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100476 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700477 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100478 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700479 }
480
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700482
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700484
485 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700487 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
490 return false; // overridden in specialized classes
491 }
492
Honghai Zhangcc411c02016-03-29 17:27:21 -0700493 cricket::CandidatePairInterface* last_selected_candidate_pair() {
494 return last_selected_candidate_pair_;
495 }
496
Peter Boström0c4e06b2015-10-07 12:23:21 +0200497 void AddLegacyStreamInContent(uint32_t ssrc,
498 int flags,
499 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 // Base implementation.
501 }
502
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200503 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200504 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200505 // network thread, which callers need to factor in.
506 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
507 RTC_DCHECK(channel.get());
508 return network_thread_->Invoke<bool>(
509 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
510 }
511
512 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
513 // returns true.
514 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
515 RTC_DCHECK(channel.get());
516 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
517 return channel->rtp_transport() &&
518 channel->rtp_transport()->rtcp_mux_enabled();
519 });
520 }
521
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000522 // Tests that can be used by derived classes.
523
524 // Basic sanity check.
525 void TestInit() {
526 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200527 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200528 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200529 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200530 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200531 }
Tommic9625f02021-05-06 22:03:19 +0200532 EXPECT_TRUE(media_channel1()->codecs().empty());
533 EXPECT_TRUE(media_channel1()->recv_streams().empty());
534 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 }
536
537 // Test that SetLocalContent and SetRemoteContent properly configure
538 // the codecs.
539 void TestSetContents() {
540 CreateChannels(0, 0);
541 typename T::Content content;
542 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800543 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200544 EXPECT_EQ(0U, media_channel1()->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800545 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200546 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200547 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200548 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 }
550
Johannes Kron9190b822018-10-29 11:22:05 +0100551 // Test that SetLocalContent and SetRemoteContent properly configure
552 // extmap-allow-mixed.
553 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
554 // For a caller, SetLocalContent() is called first with an offer and next
555 // SetRemoteContent() is called with the answer.
556 CreateChannels(0, 0);
557 typename T::Content content;
558 CreateContent(0, kPcmuCodec, kH264Codec, &content);
559 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
560 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
561 content.set_extmap_allow_mixed_enum(offer_enum);
562 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
563 content.set_extmap_allow_mixed_enum(answer_enum);
564 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200565 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100566 }
567 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
568 // For a callee, SetRemoteContent() is called first with an offer and next
569 // SetLocalContent() is called with the answer.
570 CreateChannels(0, 0);
571 typename T::Content content;
572 CreateContent(0, kPcmuCodec, kH264Codec, &content);
573 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
574 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
575 content.set_extmap_allow_mixed_enum(offer_enum);
576 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
577 content.set_extmap_allow_mixed_enum(answer_enum);
578 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200579 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100580 }
581
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 // Test that SetLocalContent and SetRemoteContent properly deals
583 // with an empty offer.
584 void TestSetContentsNullOffer() {
585 CreateChannels(0, 0);
586 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800587 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tommic9625f02021-05-06 22:03:19 +0200589 EXPECT_EQ(0U, media_channel1()->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800590 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200591 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200592 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200593 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 }
595
596 // Test that SetLocalContent and SetRemoteContent properly set RTCP
597 // mux.
598 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800599 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 typename T::Content content;
601 CreateContent(0, kPcmuCodec, kH264Codec, &content);
602 // Both sides agree on mux. Should no longer be a separate RTCP channel.
603 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800604 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
605 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800607 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 }
611
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 // Test that SetLocalContent and SetRemoteContent properly
613 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800614 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 void TestChangeStreamParamsInContent() {
616 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 stream1.id = "stream1";
618 stream1.ssrcs.push_back(kSsrc1);
619 stream1.cname = "stream1_cname";
620
621 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 stream2.id = "stream2";
623 stream2.ssrcs.push_back(kSsrc2);
624 stream2.cname = "stream2_cname";
625
Artem Titov880fa812021-07-30 22:30:23 +0200626 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 CreateChannels(0, 0);
628 typename T::Content content1;
629 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
630 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800631 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
Tommi1959f8f2021-04-26 10:20:19 +0200632 channel1_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200633 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634
Steve Anton3828c062017-12-06 10:34:51 -0800635 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200636 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800637 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638
639 // Channel 2 do not send anything.
640 typename T::Content content2;
641 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800642 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200643 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800644 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
Tommi1959f8f2021-04-26 10:20:19 +0200645 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200646 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200648 SendCustomRtp1(kSsrc1, 0);
649 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
651
Artem Titov880fa812021-07-30 22:30:23 +0200652 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700654 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800656 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200657 ASSERT_EQ(1u, media_channel2()->send_streams().size());
658 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659
Steve Anton3828c062017-12-06 10:34:51 -0800660 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200661 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
662 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663
664 // Channel 1 replies but stop sending stream1.
665 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700666 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800667 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200668 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669
Steve Anton3828c062017-12-06 10:34:51 -0800670 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +0200671 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200673 SendCustomRtp2(kSsrc2, 0);
674 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
676 }
677
678 // Test that we only start playout and sending at the right times.
679 void TestPlayoutAndSendingStates() {
680 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200681 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200682 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200683 }
Tommic9625f02021-05-06 22:03:19 +0200684 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200685 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200686 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200687 }
Tommic9625f02021-05-06 22:03:19 +0200688 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200689 channel1_->Enable(true);
690 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200691 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200692 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200693 }
Tommic9625f02021-05-06 22:03:19 +0200694 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000695 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800696 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200697 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200698 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200699 }
Tommic9625f02021-05-06 22:03:19 +0200700 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000701 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800702 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200703 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200704 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200705 }
Tommic9625f02021-05-06 22:03:19 +0200706 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800708 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200709 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200710 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200711 }
Tommic9625f02021-05-06 22:03:19 +0200712 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800713 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200714 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200715 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200716 }
Tommic9625f02021-05-06 22:03:19 +0200717 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200718 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200719 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200720 }
Tommic9625f02021-05-06 22:03:19 +0200721 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200722 channel2_->Enable(true);
723 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200725 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200726 }
Tommic9625f02021-05-06 22:03:19 +0200727 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000728 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800729 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200731 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 }
Tommic9625f02021-05-06 22:03:19 +0200733 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 }
735
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736 // Test that changing the MediaContentDirection in the local and remote
737 // session description start playout and sending at the right time.
738 void TestMediaContentDirection() {
739 CreateChannels(0, 0);
740 typename T::Content content1;
741 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
742 typename T::Content content2;
743 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200744 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800745 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746
Tommi1959f8f2021-04-26 10:20:19 +0200747 channel1_->Enable(true);
748 channel2_->Enable(true);
749 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200750 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200751 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 }
Tommic9625f02021-05-06 22:03:19 +0200753 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200754 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200755 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200756 }
Tommic9625f02021-05-06 22:03:19 +0200757 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758
Steve Anton3828c062017-12-06 10:34:51 -0800759 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
760 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
761 EXPECT_TRUE(
762 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
763 EXPECT_TRUE(
764 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800765 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200768 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 }
Tommic9625f02021-05-06 22:03:19 +0200770 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200771 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200772 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 }
Tommic9625f02021-05-06 22:03:19 +0200774 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775
Artem Titov880fa812021-07-30 22:30:23 +0200776 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800777 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800778 EXPECT_TRUE(
779 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
780 EXPECT_TRUE(
781 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782
Peter Boström34fbfff2015-09-24 19:20:30 +0200783 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200784 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 }
Tommic9625f02021-05-06 22:03:19 +0200786 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200788 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200789 }
Tommic9625f02021-05-06 22:03:19 +0200790 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
Artem Titov880fa812021-07-30 22:30:23 +0200792 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800793 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800794 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
795 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796
Peter Boström34fbfff2015-09-24 19:20:30 +0200797 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200798 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 }
Tommic9625f02021-05-06 22:03:19 +0200800 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200801 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200802 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 }
Tommic9625f02021-05-06 22:03:19 +0200804 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805 }
806
Honghai Zhangcc411c02016-03-29 17:27:21 -0700807 // Tests that when the transport channel signals a candidate pair change
808 // event, the media channel will receive a call on the network route change.
809 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700810 static constexpr uint16_t kLocalNetId = 1;
811 static constexpr uint16_t kRemoteNetId = 2;
812 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800813 // Ipv4(20) + UDP(8).
814 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800815 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200816
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800817 CreateChannels(DTLS, DTLS);
818 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700819
Honghai Zhangcc411c02016-03-29 17:27:21 -0700820 typename T::MediaChannel* media_channel1 =
821 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200822 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700823
Zhi Huang942bc2e2017-11-13 13:26:07 -0800824 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200825 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800826 // when creating the channel.
827 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200828 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800829 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800830 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200831 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800832 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200833 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200834 });
835 WaitForThreads();
836 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700837 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200838 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700839
eladalon05b07bb2017-08-24 07:40:16 -0700840 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800841 rtc::NetworkRoute network_route;
842 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100843 network_route.local =
844 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
845 network_route.remote =
846 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800847 network_route.last_sent_packet_id = kLastPacketId;
848 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200849 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800850 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
851
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200852 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200853 });
854 WaitForThreads();
855 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100856 EXPECT_TRUE(media_channel1->last_network_route().connected);
857 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100858 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100859 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100860 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200861 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700862 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800863 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800864 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700865 }
866
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 // Test setting up a call.
868 void TestCallSetup() {
869 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200870 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200872 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200873 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200874 }
Tommic9625f02021-05-06 22:03:19 +0200875 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200877 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200878 EXPECT_TRUE(media_channel1()->sending());
879 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200880 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200881 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200882 }
Tommic9625f02021-05-06 22:03:19 +0200883 EXPECT_TRUE(media_channel2()->sending());
884 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885 }
886
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 // Send voice RTP data to the other side and ensure it gets there.
888 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700889 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 EXPECT_TRUE(SendInitiate());
891 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200892 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
893 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200894 SendRtp1();
895 SendRtp2();
896 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 EXPECT_TRUE(CheckRtp1());
898 EXPECT_TRUE(CheckRtp2());
899 EXPECT_TRUE(CheckNoRtp1());
900 EXPECT_TRUE(CheckNoRtp2());
901 }
902
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200903 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800904 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200905 EXPECT_TRUE(SendInitiate());
906 EXPECT_TRUE(SendAccept());
907 SendRtp1();
908 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200909 // Do not wait, destroy channels.
910 channel1_.reset(nullptr);
911 channel2_.reset(nullptr);
912 }
913
Zhi Huange830e682018-03-30 10:48:35 -0700914 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
915 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200916 EXPECT_FALSE(IsSrtpActive(channel1_));
917 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200919 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200921 EXPECT_TRUE(IsSrtpActive(channel1_));
922 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200923 SendRtp1();
924 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200925 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 EXPECT_TRUE(CheckRtp1());
927 EXPECT_TRUE(CheckRtp2());
928 EXPECT_TRUE(CheckNoRtp1());
929 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 }
931
932 // Test that we can send and receive early media when a provisional answer is
933 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
934 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200935 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936
Yves Gerey665174f2018-06-19 15:03:05 +0200937 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
938 EXPECT_TRUE(SendOffer());
939 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200940 EXPECT_TRUE(IsSrtpActive(channel1_));
941 EXPECT_TRUE(IsSrtpActive(channel2_));
942 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
943 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200944 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200945 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
946 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200947 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948
Yves Gerey665174f2018-06-19 15:03:05 +0200949 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200950 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
951 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200952 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953
Yves Gerey665174f2018-06-19 15:03:05 +0200954 // Complete call setup and ensure everything is still OK.
955 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200956 EXPECT_TRUE(IsSrtpActive(channel1_));
957 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200958 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200959 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
960 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200961 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200962 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963 }
964
965 // Test that we properly send RTP without SRTP from a thread.
966 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800967 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 EXPECT_TRUE(SendInitiate());
969 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200970 ScopedCallThread send_rtp1([this] { SendRtp1(); });
971 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700972 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200973 WaitForThreads(involved_threads);
974 EXPECT_TRUE(CheckRtp1());
975 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000976 EXPECT_TRUE(CheckNoRtp1());
977 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 }
979
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 // Test that the mediachannel retains its sending state after the transport
981 // becomes non-writable.
982 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -0700983 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 EXPECT_TRUE(SendInitiate());
985 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200986 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
987 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200988 SendRtp1();
989 SendRtp2();
990 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 EXPECT_TRUE(CheckRtp1());
992 EXPECT_TRUE(CheckRtp2());
993 EXPECT_TRUE(CheckNoRtp1());
994 EXPECT_TRUE(CheckNoRtp2());
995
wu@webrtc.org97077a32013-10-25 21:18:33 +0000996 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -0800997 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
998 fake_rtp_dtls_transport1_->SetWritable(false);
999 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001000 SendRtp1();
1001 SendRtp2();
1002 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 EXPECT_TRUE(CheckRtp1());
1004 EXPECT_TRUE(CheckNoRtp2());
1005
1006 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001007 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1008 fake_rtp_dtls_transport1_->SetWritable(true);
1009 });
Tommic9625f02021-05-06 22:03:19 +02001010 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001011 SendRtp1();
1012 SendRtp2();
1013 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(CheckRtp1());
1015 EXPECT_TRUE(CheckRtp2());
1016 EXPECT_TRUE(CheckNoRtp1());
1017 EXPECT_TRUE(CheckNoRtp2());
1018
1019 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001020 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1021 bool asymmetric = true;
1022 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1023 });
Tommic9625f02021-05-06 22:03:19 +02001024 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025
wu@webrtc.org97077a32013-10-25 21:18:33 +00001026 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001027 SendRtp1();
1028 SendRtp2();
1029 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_TRUE(CheckRtp1());
1031 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001032 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033
1034 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001035 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001036 bool asymmetric = true;
1037 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1038 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001039 });
Tommic9625f02021-05-06 22:03:19 +02001040 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001041 SendRtp1();
1042 SendRtp2();
1043 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 EXPECT_TRUE(CheckRtp1());
1045 EXPECT_TRUE(CheckRtp2());
1046 EXPECT_TRUE(CheckNoRtp1());
1047 EXPECT_TRUE(CheckNoRtp2());
1048 }
1049
Yves Gerey665174f2018-06-19 15:03:05 +02001050 void SendBundleToBundle(const int* pl_types,
1051 int len,
1052 bool rtcp_mux,
1053 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001054 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001056 // Only pl_type1 was added to the bundle filter for both `channel1_`
1057 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001058 int pl_type1 = pl_types[0];
1059 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001060 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001061 if (secure)
1062 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001063 if (rtcp_mux) {
1064 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001065 }
1066 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001069
1070 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001071 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1072 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1073 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001074 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001075 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1076 EXPECT_TRUE(CheckNoRtp1());
1077 EXPECT_TRUE(CheckNoRtp2());
1078
Zhi Huang365381f2018-04-13 16:44:34 -07001079 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1080 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001081 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001082 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1083 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 }
1085
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 void TestSetContentFailure() {
1087 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088
Peter Thatchera6d24442015-07-09 21:26:36 -07001089 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001090 std::unique_ptr<typename T::Content> content(
1091 CreateMediaContentWithStream(1));
1092
Tommic9625f02021-05-06 22:03:19 +02001093 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001094 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001095 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001096 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001097 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098
Tommic9625f02021-05-06 22:03:19 +02001099 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001100 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001101 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001102
Tommic9625f02021-05-06 22:03:19 +02001103 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001104 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001105 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 }
1107
1108 void TestSendTwoOffers() {
1109 CreateChannels(0, 0);
1110
Peter Thatchera6d24442015-07-09 21:26:36 -07001111 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001112 std::unique_ptr<typename T::Content> content1(
1113 CreateMediaContentWithStream(1));
1114 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001115 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001116 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117
Steve Anton18ee1d52017-09-11 11:32:35 -07001118 std::unique_ptr<typename T::Content> content2(
1119 CreateMediaContentWithStream(2));
1120 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001121 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001122 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1123 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 }
1125
1126 void TestReceiveTwoOffers() {
1127 CreateChannels(0, 0);
1128
Peter Thatchera6d24442015-07-09 21:26:36 -07001129 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001130 std::unique_ptr<typename T::Content> content1(
1131 CreateMediaContentWithStream(1));
1132 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001133 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001134 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135
Steve Anton18ee1d52017-09-11 11:32:35 -07001136 std::unique_ptr<typename T::Content> content2(
1137 CreateMediaContentWithStream(2));
1138 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001139 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001140 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1141 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 }
1143
1144 void TestSendPrAnswer() {
1145 CreateChannels(0, 0);
1146
Peter Thatchera6d24442015-07-09 21:26:36 -07001147 std::string err;
1148 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001149 std::unique_ptr<typename T::Content> content1(
1150 CreateMediaContentWithStream(1));
1151 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001152 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001153 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154
Peter Thatchera6d24442015-07-09 21:26:36 -07001155 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001156 std::unique_ptr<typename T::Content> content2(
1157 CreateMediaContentWithStream(2));
1158 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001159 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001160 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1161 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162
Peter Thatchera6d24442015-07-09 21:26:36 -07001163 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001164 std::unique_ptr<typename T::Content> content3(
1165 CreateMediaContentWithStream(3));
1166 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001167 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001168 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1169 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1170 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 }
1172
1173 void TestReceivePrAnswer() {
1174 CreateChannels(0, 0);
1175
Peter Thatchera6d24442015-07-09 21:26:36 -07001176 std::string err;
1177 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001178 std::unique_ptr<typename T::Content> content1(
1179 CreateMediaContentWithStream(1));
1180 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001181 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
Tommic9625f02021-05-06 22:03:19 +02001182 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183
Peter Thatchera6d24442015-07-09 21:26:36 -07001184 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001185 std::unique_ptr<typename T::Content> content2(
1186 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001187 EXPECT_TRUE(
1188 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001189 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1190 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191
Peter Thatchera6d24442015-07-09 21:26:36 -07001192 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001193 std::unique_ptr<typename T::Content> content3(
1194 CreateMediaContentWithStream(3));
1195 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001196 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
Tommic9625f02021-05-06 22:03:19 +02001197 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1198 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1199 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001200 }
1201
zstein56162b92017-04-24 16:54:35 -07001202 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001203 CreateChannels(0, 0);
Tommic9625f02021-05-06 22:03:19 +02001204 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001205
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001206 network_thread_->PostTask(
1207 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001208 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001209 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001211 network_thread_->PostTask(
1212 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001213 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001214 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215 }
1216
skvladdc1c62c2016-03-16 19:07:43 -07001217 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1218 typename T::Content content;
1219 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1220 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001221 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001222 }
1223
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001224 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001225 webrtc::RtpParameters parameters;
1226 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001227 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001228 parameters.encodings.push_back(encoding);
1229 return parameters;
1230 }
1231
1232 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001233 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001234 EXPECT_EQ(1UL, parameters.encodings.size());
1235 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1236 }
1237
1238 void DefaultMaxBitrateIsUnlimited() {
1239 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001240 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1241 SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02001242 EXPECT_EQ(media_channel1()->max_bps(), -1);
1243 VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001244 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001245 }
1246
Zhi Huange830e682018-03-30 10:48:35 -07001247 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001248 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001249 // with the options on the new one.
1250
Steve Anton8a63f782017-10-23 13:08:53 -07001251 // For example, audio and video may use separate socket options, but initially
1252 // be unbundled, then later become bundled. When this happens, their preferred
1253 // socket options should be merged to the underlying transport they share.
1254 void SocketOptionsMergedOnSetTransport() {
1255 constexpr int kSndBufSize = 4000;
1256 constexpr int kRcvBufSize = 8000;
1257
Zhi Huange830e682018-03-30 10:48:35 -07001258 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001259
Zhi Huange830e682018-03-30 10:48:35 -07001260 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001261 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001262
Niels Möller92430882021-03-18 10:03:19 +01001263 bool rcv_success, send_success;
1264 int rcv_buf, send_buf;
1265 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tommic9625f02021-05-06 22:03:19 +02001266 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1267 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1268 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1269 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001270 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001271 send_success = fake_rtp_dtls_transport2_->GetOption(
1272 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1273 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1274 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1275 });
1276
1277 ASSERT_TRUE(send_success);
1278 EXPECT_EQ(kSndBufSize, send_buf);
1279 ASSERT_TRUE(rcv_success);
1280 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001281 }
1282
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001283 void CreateSimulcastContent(const std::vector<std::string>& rids,
1284 typename T::Content* content) {
1285 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001286 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001287 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1288 }
1289
1290 StreamParams stream;
1291 stream.set_rids(rid_descriptions);
1292 CreateContent(0, kPcmuCodec, kH264Codec, content);
1293 // This is for unified plan, so there can be only one StreamParams.
1294 content->mutable_streams().clear();
1295 content->AddStream(stream);
1296 }
1297
1298 void VerifySimulcastStreamParams(const StreamParams& expected,
1299 const typename T::Channel* channel) {
1300 const std::vector<StreamParams>& streams = channel->local_streams();
1301 ASSERT_EQ(1u, streams.size());
1302 const StreamParams& result = streams[0];
1303 EXPECT_EQ(expected.rids(), result.rids());
1304 EXPECT_TRUE(result.has_ssrcs());
1305 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1306 std::vector<uint32_t> primary_ssrcs;
1307 result.GetPrimarySsrcs(&primary_ssrcs);
1308 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1309 }
1310
1311 void TestUpdateLocalStreamsWithSimulcast() {
1312 CreateChannels(0, 0);
1313 typename T::Content content1, content2, content3;
1314 CreateSimulcastContent({"f", "h", "q"}, &content1);
1315 EXPECT_TRUE(
1316 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1317 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1318 StreamParams stream1 = channel1_->local_streams()[0];
1319
1320 // Create a similar offer. SetLocalContent should not remove and add.
1321 CreateSimulcastContent({"f", "h", "q"}, &content2);
1322 EXPECT_TRUE(
1323 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1324 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1325 StreamParams stream2 = channel1_->local_streams()[0];
1326 // Check that the streams are identical (SSRCs didn't change).
1327 EXPECT_EQ(stream1, stream2);
1328
1329 // Create third offer that has same RIDs in different order.
1330 CreateSimulcastContent({"f", "q", "h"}, &content3);
1331 EXPECT_TRUE(
1332 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1333 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1334 }
1335
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001337 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1338 static void ProcessThreadQueue(rtc::Thread* thread) {
1339 RTC_DCHECK(thread->IsCurrent());
1340 while (!thread->empty()) {
1341 thread->ProcessMessages(0);
1342 }
1343 }
Tommi1959f8f2021-04-26 10:20:19 +02001344 static void FlushCurrentThread() {
1345 rtc::Thread::Current()->ProcessMessages(0);
1346 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001347 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001348 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001349 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001350 thread->Invoke<void>(RTC_FROM_HERE,
1351 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001352 }
1353 ProcessThreadQueue(rtc::Thread::Current());
1354 // Network thread move them around and post back to worker = current thread.
1355 if (!network_thread_->IsCurrent()) {
1356 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001357 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001358 }
1359 // Worker thread = current Thread process received messages.
1360 ProcessThreadQueue(rtc::Thread::Current());
1361 }
Tommic9625f02021-05-06 22:03:19 +02001362
1363 typename T::MediaChannel* media_channel1() {
1364 RTC_DCHECK(channel1_);
1365 RTC_DCHECK(channel1_->media_channel());
1366 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1367 }
1368
1369 typename T::MediaChannel* media_channel2() {
1370 RTC_DCHECK(channel2_);
1371 RTC_DCHECK(channel2_->media_channel());
1372 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1373 }
1374
Peter Boström34fbfff2015-09-24 19:20:30 +02001375 // TODO(pbos): Remove playout from all media channels and let renderers mute
1376 // themselves.
1377 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001378 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1379 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001380 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1381 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001382 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1383 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1384 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1385 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1386 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1387 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1388 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1389 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001390 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1391 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1392 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001394 std::unique_ptr<typename T::Channel> channel1_;
1395 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001396 typename T::Content local_media_content1_;
1397 typename T::Content local_media_content2_;
1398 typename T::Content remote_media_content1_;
1399 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001401 rtc::Buffer rtp_packet_;
1402 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001403 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001404 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405};
1406
Yves Gerey665174f2018-06-19 15:03:05 +02001407template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001408std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1409 rtc::Thread* worker_thread,
1410 rtc::Thread* network_thread,
1411 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1412 webrtc::RtpTransportInternal* rtp_transport,
1413 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001414 rtc::Thread* signaling_thread = rtc::Thread::Current();
1415 auto channel = std::make_unique<cricket::VoiceChannel>(
1416 worker_thread, network_thread, signaling_thread, std::move(ch),
1417 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1418 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001419 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001420 return channel;
1421}
1422
1423template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424void ChannelTest<VoiceTraits>::CreateContent(
1425 int flags,
1426 const cricket::AudioCodec& audio_codec,
1427 const cricket::VideoCodec& video_codec,
1428 cricket::AudioContentDescription* audio) {
1429 audio->AddCodec(audio_codec);
1430 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431}
1432
Yves Gerey665174f2018-06-19 15:03:05 +02001433template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001434void ChannelTest<VoiceTraits>::CopyContent(
1435 const cricket::AudioContentDescription& source,
1436 cricket::AudioContentDescription* audio) {
1437 *audio = source;
1438}
1439
Yves Gerey665174f2018-06-19 15:03:05 +02001440template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1442 const cricket::AudioCodec& c2) {
1443 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001444 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445}
1446
Peter Boström0c4e06b2015-10-07 12:23:21 +02001447template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001448void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001449 uint32_t ssrc,
1450 int flags,
1451 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 audio->AddLegacyStream(ssrc);
1453}
1454
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001455class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456 public:
solenberg1dd98f32015-09-10 01:57:14 -07001457 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001458 VoiceChannelSingleThreadTest()
1459 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1460};
1461
1462class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1463 public:
1464 typedef ChannelTest<VoiceTraits> Base;
1465 VoiceChannelDoubleThreadTest()
1466 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467};
1468
jbauch5869f502017-06-29 12:31:36 -07001469class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001470 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001471 public:
1472 typedef ChannelTest<VoiceTraits> Base;
1473 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001474 : Base(true,
1475 kPcmuFrameWithExtensions,
1476 kRtcpReport,
1477 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001478};
1479
1480class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001481 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001482 public:
1483 typedef ChannelTest<VoiceTraits> Base;
1484 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001485 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1486 }
jbauch5869f502017-06-29 12:31:36 -07001487};
1488
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001489// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001490template <>
Steve Anton8699a322017-11-06 15:53:33 -08001491std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001492 rtc::Thread* worker_thread,
1493 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001494 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001495 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001496 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001497 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001498 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001499 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001500 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1501 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001502 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 return channel;
1504}
1505
Yves Gerey665174f2018-06-19 15:03:05 +02001506template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507void ChannelTest<VideoTraits>::CreateContent(
1508 int flags,
1509 const cricket::AudioCodec& audio_codec,
1510 const cricket::VideoCodec& video_codec,
1511 cricket::VideoContentDescription* video) {
1512 video->AddCodec(video_codec);
1513 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514}
1515
Yves Gerey665174f2018-06-19 15:03:05 +02001516template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517void ChannelTest<VideoTraits>::CopyContent(
1518 const cricket::VideoContentDescription& source,
1519 cricket::VideoContentDescription* video) {
1520 *video = source;
1521}
1522
Yves Gerey665174f2018-06-19 15:03:05 +02001523template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1525 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001526 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527}
1528
Peter Boström0c4e06b2015-10-07 12:23:21 +02001529template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001531 uint32_t ssrc,
1532 int flags,
1533 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 video->AddLegacyStream(ssrc);
1535}
1536
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001537class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538 public:
solenberg1dd98f32015-09-10 01:57:14 -07001539 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001540 VideoChannelSingleThreadTest()
1541 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542};
1543
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001544class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1545 public:
1546 typedef ChannelTest<VideoTraits> Base;
1547 VideoChannelDoubleThreadTest()
1548 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1549};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001551TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001553 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1554 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555}
1556
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001557TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1558 Base::TestDeinit();
1559}
1560
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001561TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 Base::TestSetContents();
1563}
1564
Johannes Kron9190b822018-10-29 11:22:05 +01001565TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1566 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1567}
1568
1569TEST_F(VoiceChannelSingleThreadTest,
1570 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1571 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1572}
1573
1574TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1575 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1576}
1577
1578TEST_F(VoiceChannelSingleThreadTest,
1579 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1580 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1581}
1582
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001583TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584 Base::TestSetContentsNullOffer();
1585}
1586
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001587TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588 Base::TestSetContentsRtcpMux();
1589}
1590
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001591TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001592 Base::TestSetContentsRtcpMux();
1593}
1594
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001595TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 Base::TestChangeStreamParamsInContent();
1597}
1598
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001599TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 Base::TestPlayoutAndSendingStates();
1601}
1602
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001603TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 Base::TestMediaContentDirection();
1605}
1606
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001607TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001608 Base::TestNetworkRouteChanges();
1609}
1610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 Base::TestCallSetup();
1613}
1614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001615TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001616 Base::SendRtpToRtp();
1617}
1618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001619TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001620 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621}
1622
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001623TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001624 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001625}
1626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 Base::SendRtpToRtpOnThread();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::SendWithWritabilityLoss();
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 Base::TestSetContentFailure();
1641}
1642
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 Base::TestSendTwoOffers();
1645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 Base::TestReceiveTwoOffers();
1649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 Base::TestSendPrAnswer();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::TestReceivePrAnswer();
1657}
1658
zstein56162b92017-04-24 16:54:35 -07001659TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1660 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001664 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001668 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001672 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001676 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677}
1678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001680 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001681}
1682
Steve Anton8a63f782017-10-23 13:08:53 -07001683TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1684 Base::SocketOptionsMergedOnSetTransport();
1685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687// VoiceChannelDoubleThreadTest
1688TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001690 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1691 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692}
1693
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001694TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1695 Base::TestDeinit();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 Base::TestSetContents();
1700}
1701
Johannes Kron9190b822018-10-29 11:22:05 +01001702TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1703 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1704}
1705
1706TEST_F(VoiceChannelDoubleThreadTest,
1707 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1708 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1709}
1710
1711TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1712 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1713}
1714
1715TEST_F(VoiceChannelDoubleThreadTest,
1716 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1717 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1718}
1719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001720TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 Base::TestSetContentsNullOffer();
1722}
1723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001724TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725 Base::TestSetContentsRtcpMux();
1726}
1727
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001728TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 Base::TestSetContentsRtcpMux();
1730}
1731
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001732TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 Base::TestChangeStreamParamsInContent();
1734}
1735
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001736TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 Base::TestPlayoutAndSendingStates();
1738}
1739
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1741 Base::TestMediaContentDirection();
1742}
1743
1744TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1745 Base::TestNetworkRouteChanges();
1746}
1747
1748TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1749 Base::TestCallSetup();
1750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1753 Base::SendRtpToRtp();
1754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001757 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758}
1759
1760TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001761 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001762}
1763
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1765 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1766}
1767
1768TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1769 Base::SendRtpToRtpOnThread();
1770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1773 Base::SendWithWritabilityLoss();
1774}
1775
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1777 Base::TestSetContentFailure();
1778}
1779
1780TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1781 Base::TestSendTwoOffers();
1782}
1783
1784TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1785 Base::TestReceiveTwoOffers();
1786}
1787
1788TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1789 Base::TestSendPrAnswer();
1790}
1791
1792TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1793 Base::TestReceivePrAnswer();
1794}
1795
zstein56162b92017-04-24 16:54:35 -07001796TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1797 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1801 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1802}
1803
1804TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1805 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1806}
1807
1808TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1809 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1810}
1811
1812TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1813 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1817 Base::DefaultMaxBitrateIsUnlimited();
1818}
1819
Steve Anton8a63f782017-10-23 13:08:53 -07001820TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1821 Base::SocketOptionsMergedOnSetTransport();
1822}
1823
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001824// VideoChannelSingleThreadTest
1825TEST_F(VideoChannelSingleThreadTest, TestInit) {
1826 Base::TestInit();
1827}
1828
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001829TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1830 Base::TestDeinit();
1831}
1832
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001833TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1834 Base::TestSetContents();
1835}
1836
Johannes Kron9190b822018-10-29 11:22:05 +01001837TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1838 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1839}
1840
1841TEST_F(VideoChannelSingleThreadTest,
1842 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1843 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1844}
1845
1846TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1847 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1848}
1849
1850TEST_F(VideoChannelSingleThreadTest,
1851 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1852 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1853}
1854
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001855TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1856 Base::TestSetContentsNullOffer();
1857}
1858
1859TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1860 Base::TestSetContentsRtcpMux();
1861}
1862
1863TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1864 Base::TestSetContentsRtcpMux();
1865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1868 Base::TestChangeStreamParamsInContent();
1869}
1870
1871TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1872 Base::TestPlayoutAndSendingStates();
1873}
1874
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001875TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 Base::TestMediaContentDirection();
1877}
1878
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001880 Base::TestNetworkRouteChanges();
1881}
1882
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001883TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 Base::TestCallSetup();
1885}
1886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001887TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001888 Base::SendRtpToRtp();
1889}
1890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001891TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001892 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893}
1894
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001895TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001896 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897}
1898
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001899TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904 Base::SendRtpToRtpOnThread();
1905}
1906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001907TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 Base::SendWithWritabilityLoss();
1909}
1910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 Base::TestSetContentFailure();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 Base::TestSendTwoOffers();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920 Base::TestReceiveTwoOffers();
1921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 Base::TestSendPrAnswer();
1925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928 Base::TestReceivePrAnswer();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001932 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001936 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001940 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001944 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945}
1946
zstein56162b92017-04-24 16:54:35 -07001947TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1948 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001952 Base::DefaultMaxBitrateIsUnlimited();
1953}
1954
Steve Anton8a63f782017-10-23 13:08:53 -07001955TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1956 Base::SocketOptionsMergedOnSetTransport();
1957}
1958
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001959TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1960 Base::TestUpdateLocalStreamsWithSimulcast();
1961}
1962
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001963TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1964 const cricket::VideoCodec kVp8Codec(97, "VP8");
1965 cricket::VideoCodec vp9_codec(98, "VP9");
1966 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1967 cricket::VideoContentDescription video;
1968 video.set_codecs({kVp8Codec, vp9_codec});
1969
1970 CreateChannels(0, 0);
1971
1972 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02001973 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
1974 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
1975 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
1976 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
1977 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
1978 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001979 cricket::kPacketizationParamRaw);
1980}
1981
1982TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
1983 const cricket::VideoCodec kVp8Codec(97, "VP8");
1984 cricket::VideoCodec vp9_codec(98, "VP9");
1985 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1986 cricket::VideoContentDescription video;
1987 video.set_codecs({kVp8Codec, vp9_codec});
1988
1989 CreateChannels(0, 0);
1990
1991 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
Tommic9625f02021-05-06 22:03:19 +02001992 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
1993 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
1994 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
1995 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
1996 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
1997 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001998 cricket::kPacketizationParamRaw);
1999}
2000
2001TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2002 const cricket::VideoCodec kVp8Codec(97, "VP8");
2003 cricket::VideoCodec vp9_codec(98, "VP9");
2004 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2005 cricket::VideoContentDescription video;
2006 video.set_codecs({kVp8Codec, vp9_codec});
2007
2008 CreateChannels(0, 0);
2009
2010 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2011 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002012 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2013 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2014 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2015 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2016 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002017 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002018 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2019 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2020 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2021 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2022 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002023 cricket::kPacketizationParamRaw);
2024}
2025
2026TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2027 const cricket::VideoCodec kLocalCodec(98, "VP8");
2028 cricket::VideoCodec remote_codec(99, "VP8");
2029 remote_codec.packetization = cricket::kPacketizationParamRaw;
2030 cricket::VideoContentDescription local_video;
2031 local_video.set_codecs({kLocalCodec});
2032 cricket::VideoContentDescription remote_video;
2033 remote_video.set_codecs({remote_codec});
2034
2035 CreateChannels(0, 0);
2036
2037 EXPECT_TRUE(
2038 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2039 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002040 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2041 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2042 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2043 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002044}
2045
2046TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2047 cricket::VideoCodec local_codec(98, "VP8");
2048 local_codec.packetization = cricket::kPacketizationParamRaw;
2049 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2050 cricket::VideoContentDescription local_video;
2051 local_video.set_codecs({local_codec});
2052 cricket::VideoContentDescription remote_video;
2053 remote_video.set_codecs({kRemoteCodec});
2054
2055 CreateChannels(0, 0);
2056
2057 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2058 EXPECT_TRUE(
2059 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002060 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2061 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2062 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2063 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002064}
2065
2066TEST_F(VideoChannelSingleThreadTest,
2067 TestSetRemoteAnswerWithInvalidPacketization) {
2068 cricket::VideoCodec local_codec(98, "VP8");
2069 local_codec.packetization = cricket::kPacketizationParamRaw;
2070 cricket::VideoCodec remote_codec(99, "VP8");
2071 remote_codec.packetization = "unknownpacketizationattributevalue";
2072 cricket::VideoContentDescription local_video;
2073 local_video.set_codecs({local_codec});
2074 cricket::VideoContentDescription remote_video;
2075 remote_video.set_codecs({remote_codec});
2076
2077 CreateChannels(0, 0);
2078
2079 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2080 EXPECT_FALSE(
2081 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002082 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2083 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002084 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002085 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002086}
2087
2088TEST_F(VideoChannelSingleThreadTest,
2089 TestSetLocalAnswerWithInvalidPacketization) {
2090 cricket::VideoCodec local_codec(98, "VP8");
2091 local_codec.packetization = cricket::kPacketizationParamRaw;
2092 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2093 cricket::VideoContentDescription local_video;
2094 local_video.set_codecs({local_codec});
2095 cricket::VideoContentDescription remote_video;
2096 remote_video.set_codecs({kRemoteCodec});
2097
2098 CreateChannels(0, 0);
2099
2100 EXPECT_TRUE(
2101 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2102 EXPECT_FALSE(
2103 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
Tommic9625f02021-05-06 22:03:19 +02002104 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2105 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2106 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002107}
2108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109// VideoChannelDoubleThreadTest
2110TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2111 Base::TestInit();
2112}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002114TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2115 Base::TestDeinit();
2116}
2117
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002118TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2119 Base::TestSetContents();
2120}
2121
Johannes Kron9190b822018-10-29 11:22:05 +01002122TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2123 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2124}
2125
2126TEST_F(VideoChannelDoubleThreadTest,
2127 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2128 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2129}
2130
2131TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2132 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2133}
2134
2135TEST_F(VideoChannelDoubleThreadTest,
2136 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2137 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2138}
2139
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002140TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2141 Base::TestSetContentsNullOffer();
2142}
2143
2144TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2145 Base::TestSetContentsRtcpMux();
2146}
2147
2148TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2149 Base::TestSetContentsRtcpMux();
2150}
2151
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002152TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2153 Base::TestChangeStreamParamsInContent();
2154}
2155
2156TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2157 Base::TestPlayoutAndSendingStates();
2158}
2159
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002160TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2161 Base::TestMediaContentDirection();
2162}
2163
2164TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2165 Base::TestNetworkRouteChanges();
2166}
2167
2168TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2169 Base::TestCallSetup();
2170}
2171
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002172TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2173 Base::SendRtpToRtp();
2174}
2175
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002176TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002177 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002178}
2179
2180TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002181 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182}
2183
2184TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2185 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2186}
2187
2188TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2189 Base::SendRtpToRtpOnThread();
2190}
2191
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002192TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2193 Base::SendWithWritabilityLoss();
2194}
2195
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002196TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2197 Base::TestSetContentFailure();
2198}
2199
2200TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2201 Base::TestSendTwoOffers();
2202}
2203
2204TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2205 Base::TestReceiveTwoOffers();
2206}
2207
2208TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2209 Base::TestSendPrAnswer();
2210}
2211
2212TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2213 Base::TestReceivePrAnswer();
2214}
2215
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002216TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2217 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2218}
2219
2220TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2221 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2225 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2226}
2227
2228TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2229 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2230}
2231
zstein56162b92017-04-24 16:54:35 -07002232TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2233 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002234}
2235
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002236TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2237 Base::DefaultMaxBitrateIsUnlimited();
2238}
2239
Steve Anton8a63f782017-10-23 13:08:53 -07002240TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2241 Base::SocketOptionsMergedOnSetTransport();
2242}
2243
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245// TODO(pthatcher): TestSetReceiver?