blob: 4818267f18394e25c40afc24526d1efbed04f6e2 [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() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000334 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000336 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 if (result) {
338 channel1_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200339 FlushCurrentThread();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000341 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800343 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000345 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347 }
348 return result;
349 }
350
351 bool SendAccept() {
352 channel2_->Enable(true);
Tommi1959f8f2021-04-26 10:20:19 +0200353 FlushCurrentThread();
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000354 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 return channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000356 SdpType::kAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 }
358
359 bool SendOffer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000360 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000361 bool result = channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000362 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 if (result) {
364 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000365 result = channel2_->SetRemoteContent(&remote_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000366 SdpType::kOffer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 }
368 return result;
369 }
370
371 bool SendProvisionalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000372 std::string err;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000374 SdpType::kPrAnswer, err);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 if (result) {
376 channel2_->Enable(true);
377 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000378 SdpType::kPrAnswer, err);
deadbeeff5346592017-01-24 21:51:21 -0800379 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 }
381 return result;
382 }
383
384 bool SendFinalAnswer() {
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000385 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000386 bool result = channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000387 SdpType::kAnswer, err);
388 if (result) {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000389 result = channel1_->SetRemoteContent(&remote_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000390 SdpType::kAnswer, err);
391 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000392 return result;
393 }
394
Tommic9625f02021-05-06 22:03:19 +0200395 void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
396 network_thread_->PostTask(webrtc::ToQueuedTask(
397 network_thread_safety_, [media_channel, data = std::move(data)]() {
398 media_channel->SendRtp(data.data(), data.size(),
399 rtc::PacketOptions());
400 }));
401 }
402
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200403 void SendRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200404 SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 }
Tommic9625f02021-05-06 22:03:19 +0200406
407 void SendRtp1(rtc::Buffer data) {
408 SendRtp(media_channel1(), std::move(data));
409 }
410
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200411 void SendRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200412 SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Tommic9625f02021-05-06 22:03:19 +0200414
415 void SendRtp2(rtc::Buffer data) {
416 SendRtp(media_channel2(), std::move(data));
417 }
418
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200421 SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Tommic9625f02021-05-06 22:03:19 +0200424 SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 bool CheckRtp1() {
Tommic9625f02021-05-06 22:03:19 +0200428 return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
430 bool CheckRtp2() {
Tommic9625f02021-05-06 22:03:19 +0200431 return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200434 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200436 return media_channel1()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200438 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
Tommic9625f02021-05-06 22:03:19 +0200440 return media_channel2()->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
443 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 rtc::SetBE32(data.data() + 8, ssrc);
446 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000447 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000449 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 return data;
451 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452
Tommic9625f02021-05-06 22:03:19 +0200453 bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
454 bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455
456 void CreateContent(int flags,
457 const cricket::AudioCodec& audio_codec,
458 const cricket::VideoCodec& video_codec,
459 typename T::Content* content) {
460 // overridden in specialized classes
461 }
462 void CopyContent(const typename T::Content& source,
463 typename T::Content* content) {
464 // overridden in specialized classes
465 }
466
Steve Anton18ee1d52017-09-11 11:32:35 -0700467 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700469 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
470 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700471 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700472 AddLegacyStreamInContent(ssrc, 0, content);
473 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 }
475
ossu292d6582016-03-17 02:31:13 -0700476 // Will manage the lifetime of a CallThread, making sure it's
477 // destroyed before this object goes out of scope.
478 class ScopedCallThread {
479 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200480 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100481 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100482 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700483 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100484 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700485 }
486
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200487 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700488
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700490
491 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200492 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700493 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
496 return false; // overridden in specialized classes
497 }
498
Honghai Zhangcc411c02016-03-29 17:27:21 -0700499 cricket::CandidatePairInterface* last_selected_candidate_pair() {
500 return last_selected_candidate_pair_;
501 }
502
Peter Boström0c4e06b2015-10-07 12:23:21 +0200503 void AddLegacyStreamInContent(uint32_t ssrc,
504 int flags,
505 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506 // Base implementation.
507 }
508
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200509 // Utility method that calls BaseChannel::srtp_active() on the network thread
Artem Titov880fa812021-07-30 22:30:23 +0200510 // and returns the result. The `srtp_active()` state is maintained on the
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200511 // network thread, which callers need to factor in.
512 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
513 RTC_DCHECK(channel.get());
514 return network_thread_->Invoke<bool>(
515 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
516 }
517
518 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
519 // returns true.
520 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
521 RTC_DCHECK(channel.get());
522 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
523 return channel->rtp_transport() &&
524 channel->rtp_transport()->rtcp_mux_enabled();
525 });
526 }
527
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 // Tests that can be used by derived classes.
529
530 // Basic sanity check.
531 void TestInit() {
532 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200533 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200534 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200535 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200536 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200537 }
Tommic9625f02021-05-06 22:03:19 +0200538 EXPECT_TRUE(media_channel1()->codecs().empty());
539 EXPECT_TRUE(media_channel1()->recv_streams().empty());
540 EXPECT_TRUE(media_channel1()->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 }
542
543 // Test that SetLocalContent and SetRemoteContent properly configure
544 // the codecs.
545 void TestSetContents() {
546 CreateChannels(0, 0);
547 typename T::Content content;
548 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000549 std::string err;
550 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200551 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000552 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200553 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200554 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200555 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 }
557
Johannes Kron9190b822018-10-29 11:22:05 +0100558 // Test that SetLocalContent and SetRemoteContent properly configure
559 // extmap-allow-mixed.
560 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
561 // For a caller, SetLocalContent() is called first with an offer and next
562 // SetRemoteContent() is called with the answer.
563 CreateChannels(0, 0);
564 typename T::Content content;
565 CreateContent(0, kPcmuCodec, kH264Codec, &content);
566 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
567 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
568 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000569 std::string err;
570 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100571 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000572 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200573 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100574 }
575 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
576 // For a callee, SetRemoteContent() is called first with an offer and next
577 // SetLocalContent() is called with the answer.
578 CreateChannels(0, 0);
579 typename T::Content content;
580 CreateContent(0, kPcmuCodec, kH264Codec, &content);
581 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
582 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
583 content.set_extmap_allow_mixed_enum(offer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000584 std::string err;
585 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
Johannes Kron9190b822018-10-29 11:22:05 +0100586 content.set_extmap_allow_mixed_enum(answer_enum);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000587 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200588 EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
Johannes Kron9190b822018-10-29 11:22:05 +0100589 }
590
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 // Test that SetLocalContent and SetRemoteContent properly deals
592 // with an empty offer.
593 void TestSetContentsNullOffer() {
594 CreateChannels(0, 0);
595 typename T::Content content;
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000596 std::string err;
597 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Tommic9625f02021-05-06 22:03:19 +0200599 EXPECT_EQ(0U, media_channel1()->codecs().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000600 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200601 ASSERT_EQ(1U, media_channel1()->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200602 EXPECT_TRUE(
Tommic9625f02021-05-06 22:03:19 +0200603 CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 }
605
606 // Test that SetLocalContent and SetRemoteContent properly set RTCP
607 // mux.
608 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800609 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 typename T::Content content;
611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 // Both sides agree on mux. Should no longer be a separate RTCP channel.
613 content.set_rtcp_mux(true);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000614 std::string err;
615 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
616 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Only initiator supports mux. Should still have a separate RTCP channel.
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000618 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 content.set_rtcp_mux(false);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000620 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 }
622
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 // Test that SetLocalContent and SetRemoteContent properly
624 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800625 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 void TestChangeStreamParamsInContent() {
627 cricket::StreamParams stream1;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 stream1.id = "stream1";
629 stream1.ssrcs.push_back(kSsrc1);
630 stream1.cname = "stream1_cname";
631
632 cricket::StreamParams stream2;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 stream2.id = "stream2";
634 stream2.ssrcs.push_back(kSsrc2);
635 stream2.cname = "stream2_cname";
636
Artem Titov880fa812021-07-30 22:30:23 +0200637 // Setup a call where channel 1 send `stream1` to channel 2.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 CreateChannels(0, 0);
639 typename T::Content content1;
640 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
641 content1.AddStream(stream1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000642 std::string err;
643 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200644 channel1_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200645 EXPECT_EQ(1u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000647 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200648 EXPECT_EQ(1u, media_channel2()->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800649 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650
651 // Channel 2 do not send anything.
652 typename T::Content content2;
653 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000654 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200655 EXPECT_EQ(0u, media_channel1()->recv_streams().size());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000656 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
Tommi1959f8f2021-04-26 10:20:19 +0200657 channel2_->Enable(true);
Tommic9625f02021-05-06 22:03:19 +0200658 EXPECT_EQ(0u, media_channel2()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200660 SendCustomRtp1(kSsrc1, 0);
661 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
663
Artem Titov880fa812021-07-30 22:30:23 +0200664 // Let channel 2 update the content by sending `stream2` and enable SRTP.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700666 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 content3.AddStream(stream2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000668 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200669 ASSERT_EQ(1u, media_channel2()->send_streams().size());
670 EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000672 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +0200673 ASSERT_EQ(1u, media_channel1()->recv_streams().size());
674 EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675
676 // Channel 1 replies but stop sending stream1.
677 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700678 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000679 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200680 EXPECT_EQ(0u, media_channel1()->send_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000682 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +0200683 EXPECT_EQ(0u, media_channel2()->recv_streams().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200685 SendCustomRtp2(kSsrc2, 0);
686 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
688 }
689
690 // Test that we only start playout and sending at the right times.
691 void TestPlayoutAndSendingStates() {
692 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200693 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200694 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200695 }
Tommic9625f02021-05-06 22:03:19 +0200696 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200697 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200698 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200699 }
Tommic9625f02021-05-06 22:03:19 +0200700 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200701 channel1_->Enable(true);
702 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200703 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200704 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200705 }
Tommic9625f02021-05-06 22:03:19 +0200706 EXPECT_FALSE(media_channel1()->sending());
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000707 std::string err;
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000708 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000709 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200710 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200711 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200712 }
Tommic9625f02021-05-06 22:03:19 +0200713 EXPECT_FALSE(media_channel1()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000714 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000715 SdpType::kOffer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200716 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200717 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200718 }
Tommic9625f02021-05-06 22:03:19 +0200719 EXPECT_FALSE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000720 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000721 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200722 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200723 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 }
Tommic9625f02021-05-06 22:03:19 +0200725 EXPECT_FALSE(media_channel2()->sending());
deadbeeff5346592017-01-24 21:51:21 -0800726 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200727 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200728 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200729 }
Tommic9625f02021-05-06 22:03:19 +0200730 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200731 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200732 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200733 }
Tommic9625f02021-05-06 22:03:19 +0200734 EXPECT_FALSE(media_channel2()->sending());
Tommi1959f8f2021-04-26 10:20:19 +0200735 channel2_->Enable(true);
736 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200738 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200739 }
Tommic9625f02021-05-06 22:03:19 +0200740 EXPECT_TRUE(media_channel2()->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000741 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000742 SdpType::kAnswer, err));
Peter Boström34fbfff2015-09-24 19:20:30 +0200743 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200744 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200745 }
Tommic9625f02021-05-06 22:03:19 +0200746 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 }
748
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 // Test that changing the MediaContentDirection in the local and remote
750 // session description start playout and sending at the right time.
751 void TestMediaContentDirection() {
752 CreateChannels(0, 0);
753 typename T::Content content1;
754 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
755 typename T::Content content2;
756 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Artem Titov880fa812021-07-30 22:30:23 +0200757 // Set `content2` to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800758 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759
Tommi1959f8f2021-04-26 10:20:19 +0200760 channel1_->Enable(true);
761 channel2_->Enable(true);
762 FlushCurrentThread();
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200764 EXPECT_FALSE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200765 }
Tommic9625f02021-05-06 22:03:19 +0200766 EXPECT_FALSE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200768 EXPECT_FALSE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 }
Tommic9625f02021-05-06 22:03:19 +0200770 EXPECT_FALSE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000772 std::string err;
773 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
774 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
775 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800776 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000777 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
deadbeeff5346592017-01-24 21:51:21 -0800778 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779
Peter Boström34fbfff2015-09-24 19:20:30 +0200780 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200781 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 }
Tommic9625f02021-05-06 22:03:19 +0200783 EXPECT_FALSE(media_channel1()->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200785 EXPECT_FALSE(media_channel2()->playout()); // local InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200786 }
Tommic9625f02021-05-06 22:03:19 +0200787 EXPECT_FALSE(media_channel2()->sending()); // local InActive
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
Artem Titov880fa812021-07-30 22:30:23 +0200789 // Update `content2` to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800790 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000791 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
Steve Anton3828c062017-12-06 10:34:51 -0800792 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000793 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794
Peter Boström34fbfff2015-09-24 19:20:30 +0200795 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200796 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200797 }
Tommic9625f02021-05-06 22:03:19 +0200798 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200800 EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
Peter Boström34fbfff2015-09-24 19:20:30 +0200801 }
Tommic9625f02021-05-06 22:03:19 +0200802 EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803
Artem Titov880fa812021-07-30 22:30:23 +0200804 // Update `content2` to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800805 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Tomas Gunnarssond908d742022-01-05 10:44:26 +0000806 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
807 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808
Peter Boström34fbfff2015-09-24 19:20:30 +0200809 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200810 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200811 }
Tommic9625f02021-05-06 22:03:19 +0200812 EXPECT_TRUE(media_channel1()->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200813 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200814 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200815 }
Tommic9625f02021-05-06 22:03:19 +0200816 EXPECT_TRUE(media_channel2()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817 }
818
Honghai Zhangcc411c02016-03-29 17:27:21 -0700819 // Tests that when the transport channel signals a candidate pair change
820 // event, the media channel will receive a call on the network route change.
821 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700822 static constexpr uint16_t kLocalNetId = 1;
823 static constexpr uint16_t kRemoteNetId = 2;
824 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800825 // Ipv4(20) + UDP(8).
826 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800827 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200828
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800829 CreateChannels(DTLS, DTLS);
830 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700831
Honghai Zhangcc411c02016-03-29 17:27:21 -0700832 typename T::MediaChannel* media_channel1 =
833 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200834 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700835
Zhi Huang942bc2e2017-11-13 13:26:07 -0800836 // Need to wait for the threads before calling
Artem Titov880fa812021-07-30 22:30:23 +0200837 // `set_num_network_route_changes` because the network route would be set
Zhi Huang942bc2e2017-11-13 13:26:07 -0800838 // when creating the channel.
839 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200840 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800841 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800842 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200843 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800844 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200845 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200846 });
847 WaitForThreads();
848 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700849 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200850 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700851
eladalon05b07bb2017-08-24 07:40:16 -0700852 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800853 rtc::NetworkRoute network_route;
854 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100855 network_route.local =
856 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
857 network_route.remote =
858 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800859 network_route.last_sent_packet_id = kLastPacketId;
860 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200861 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800862 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
863
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200864 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200865 });
866 WaitForThreads();
867 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100868 EXPECT_TRUE(media_channel1->last_network_route().connected);
869 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100870 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100871 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100872 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200873 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700874 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800875 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800876 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700877 }
878
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 // Test setting up a call.
880 void TestCallSetup() {
881 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200882 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200884 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200885 EXPECT_TRUE(media_channel1()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200886 }
Tommic9625f02021-05-06 22:03:19 +0200887 EXPECT_FALSE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200889 EXPECT_FALSE(IsSrtpActive(channel1_));
Tommic9625f02021-05-06 22:03:19 +0200890 EXPECT_TRUE(media_channel1()->sending());
891 EXPECT_EQ(1U, media_channel1()->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200892 if (verify_playout_) {
Tommic9625f02021-05-06 22:03:19 +0200893 EXPECT_TRUE(media_channel2()->playout());
Peter Boström34fbfff2015-09-24 19:20:30 +0200894 }
Tommic9625f02021-05-06 22:03:19 +0200895 EXPECT_TRUE(media_channel2()->sending());
896 EXPECT_EQ(1U, media_channel2()->codecs().size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 }
898
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 // Send voice RTP data to the other side and ensure it gets there.
900 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700901 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 EXPECT_TRUE(SendInitiate());
903 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200904 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
905 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200906 SendRtp1();
907 SendRtp2();
908 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_TRUE(CheckRtp1());
910 EXPECT_TRUE(CheckRtp2());
911 EXPECT_TRUE(CheckNoRtp1());
912 EXPECT_TRUE(CheckNoRtp2());
913 }
914
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200915 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800916 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200917 EXPECT_TRUE(SendInitiate());
918 EXPECT_TRUE(SendAccept());
919 SendRtp1();
920 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200921 // Do not wait, destroy channels.
922 channel1_.reset(nullptr);
923 channel2_.reset(nullptr);
924 }
925
Zhi Huange830e682018-03-30 10:48:35 -0700926 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
927 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200928 EXPECT_FALSE(IsSrtpActive(channel1_));
929 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200931 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200933 EXPECT_TRUE(IsSrtpActive(channel1_));
934 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200935 SendRtp1();
936 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200937 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 EXPECT_TRUE(CheckRtp1());
939 EXPECT_TRUE(CheckRtp2());
940 EXPECT_TRUE(CheckNoRtp1());
941 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 }
943
944 // Test that we can send and receive early media when a provisional answer is
945 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
946 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200947 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948
Yves Gerey665174f2018-06-19 15:03:05 +0200949 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
950 EXPECT_TRUE(SendOffer());
951 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200952 EXPECT_TRUE(IsSrtpActive(channel1_));
953 EXPECT_TRUE(IsSrtpActive(channel2_));
954 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
955 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200956 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200957 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
958 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200959 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960
Yves Gerey665174f2018-06-19 15:03:05 +0200961 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200962 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
963 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200964 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965
Yves Gerey665174f2018-06-19 15:03:05 +0200966 // Complete call setup and ensure everything is still OK.
967 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200968 EXPECT_TRUE(IsSrtpActive(channel1_));
969 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200970 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200971 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
972 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200973 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200974 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 }
976
977 // Test that we properly send RTP without SRTP from a thread.
978 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800979 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 EXPECT_TRUE(SendInitiate());
981 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200982 ScopedCallThread send_rtp1([this] { SendRtp1(); });
983 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700984 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200985 WaitForThreads(involved_threads);
986 EXPECT_TRUE(CheckRtp1());
987 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 EXPECT_TRUE(CheckNoRtp1());
989 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 }
991
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 // Test that the mediachannel retains its sending state after the transport
993 // becomes non-writable.
994 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -0700995 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 EXPECT_TRUE(SendInitiate());
997 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200998 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
999 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
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(CheckRtp2());
1005 EXPECT_TRUE(CheckNoRtp1());
1006 EXPECT_TRUE(CheckNoRtp2());
1007
wu@webrtc.org97077a32013-10-25 21:18:33 +00001008 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001009 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1010 fake_rtp_dtls_transport1_->SetWritable(false);
1011 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001012 SendRtp1();
1013 SendRtp2();
1014 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 EXPECT_TRUE(CheckRtp1());
1016 EXPECT_TRUE(CheckNoRtp2());
1017
1018 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001019 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1020 fake_rtp_dtls_transport1_->SetWritable(true);
1021 });
Tommic9625f02021-05-06 22:03:19 +02001022 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 SendRtp1();
1024 SendRtp2();
1025 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(CheckRtp1());
1027 EXPECT_TRUE(CheckRtp2());
1028 EXPECT_TRUE(CheckNoRtp1());
1029 EXPECT_TRUE(CheckNoRtp2());
1030
1031 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001032 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1033 bool asymmetric = true;
1034 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1035 });
Tommic9625f02021-05-06 22:03:19 +02001036 EXPECT_TRUE(media_channel1()->sending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037
wu@webrtc.org97077a32013-10-25 21:18:33 +00001038 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001039 SendRtp1();
1040 SendRtp2();
1041 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 EXPECT_TRUE(CheckRtp1());
1043 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001044 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045
1046 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001047 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001048 bool asymmetric = true;
1049 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1050 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001051 });
Tommic9625f02021-05-06 22:03:19 +02001052 EXPECT_TRUE(media_channel1()->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001053 SendRtp1();
1054 SendRtp2();
1055 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 EXPECT_TRUE(CheckRtp1());
1057 EXPECT_TRUE(CheckRtp2());
1058 EXPECT_TRUE(CheckNoRtp1());
1059 EXPECT_TRUE(CheckNoRtp2());
1060 }
1061
Yves Gerey665174f2018-06-19 15:03:05 +02001062 void SendBundleToBundle(const int* pl_types,
1063 int len,
1064 bool rtcp_mux,
1065 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001066 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 int sequence_number1_1 = 0, sequence_number2_2 = 0;
Artem Titov880fa812021-07-30 22:30:23 +02001068 // Only pl_type1 was added to the bundle filter for both `channel1_`
1069 // and `channel2_`.
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001070 int pl_type1 = pl_types[0];
1071 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001072 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001073 if (secure)
1074 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001075 if (rtcp_mux) {
1076 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001077 }
1078 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001081
1082 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1084 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1085 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001086 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001087 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1088 EXPECT_TRUE(CheckNoRtp1());
1089 EXPECT_TRUE(CheckNoRtp2());
1090
Zhi Huang365381f2018-04-13 16:44:34 -07001091 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1092 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001093 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001094 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1095 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 }
1097
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 void TestSetContentFailure() {
1099 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100
Peter Thatchera6d24442015-07-09 21:26:36 -07001101 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001102 std::unique_ptr<typename T::Content> content(
1103 CreateMediaContentWithStream(1));
1104
Tommic9625f02021-05-06 22:03:19 +02001105 media_channel1()->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001106 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001107 channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001108 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001109 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110
Tommic9625f02021-05-06 22:03:19 +02001111 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001112 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001113 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001114
Tommic9625f02021-05-06 22:03:19 +02001115 media_channel1()->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001116 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001117 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 }
1119
1120 void TestSendTwoOffers() {
1121 CreateChannels(0, 0);
1122
Peter Thatchera6d24442015-07-09 21:26:36 -07001123 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001124 std::unique_ptr<typename T::Content> content1(
1125 CreateMediaContentWithStream(1));
1126 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001127 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001128 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129
Steve Anton18ee1d52017-09-11 11:32:35 -07001130 std::unique_ptr<typename T::Content> content2(
1131 CreateMediaContentWithStream(2));
1132 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001133 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001134 EXPECT_FALSE(media_channel1()->HasSendStream(1));
1135 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 }
1137
1138 void TestReceiveTwoOffers() {
1139 CreateChannels(0, 0);
1140
Peter Thatchera6d24442015-07-09 21:26:36 -07001141 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001142 std::unique_ptr<typename T::Content> content1(
1143 CreateMediaContentWithStream(1));
1144 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001145 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001146 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147
Steve Anton18ee1d52017-09-11 11:32:35 -07001148 std::unique_ptr<typename T::Content> content2(
1149 CreateMediaContentWithStream(2));
1150 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001151 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001152 EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1153 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 }
1155
1156 void TestSendPrAnswer() {
1157 CreateChannels(0, 0);
1158
Peter Thatchera6d24442015-07-09 21:26:36 -07001159 std::string err;
1160 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001161 std::unique_ptr<typename T::Content> content1(
1162 CreateMediaContentWithStream(1));
1163 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001164 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001165 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166
Peter Thatchera6d24442015-07-09 21:26:36 -07001167 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001168 std::unique_ptr<typename T::Content> content2(
1169 CreateMediaContentWithStream(2));
1170 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001171 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001172 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1173 EXPECT_TRUE(media_channel1()->HasSendStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174
Peter Thatchera6d24442015-07-09 21:26:36 -07001175 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001176 std::unique_ptr<typename T::Content> content3(
1177 CreateMediaContentWithStream(3));
1178 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001179 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001180 EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1181 EXPECT_FALSE(media_channel1()->HasSendStream(2));
1182 EXPECT_TRUE(media_channel1()->HasSendStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 }
1184
1185 void TestReceivePrAnswer() {
1186 CreateChannels(0, 0);
1187
Peter Thatchera6d24442015-07-09 21:26:36 -07001188 std::string err;
1189 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001190 std::unique_ptr<typename T::Content> content1(
1191 CreateMediaContentWithStream(1));
1192 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001193 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001194 EXPECT_TRUE(media_channel1()->HasSendStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195
Peter Thatchera6d24442015-07-09 21:26:36 -07001196 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001197 std::unique_ptr<typename T::Content> content2(
1198 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001199 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001200 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001201 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1202 EXPECT_TRUE(media_channel1()->HasRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203
Peter Thatchera6d24442015-07-09 21:26:36 -07001204 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001205 std::unique_ptr<typename T::Content> content3(
1206 CreateMediaContentWithStream(3));
1207 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001208 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02001209 EXPECT_TRUE(media_channel1()->HasSendStream(1));
1210 EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1211 EXPECT_TRUE(media_channel1()->HasRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212 }
1213
zstein56162b92017-04-24 16:54:35 -07001214 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001215 CreateChannels(0, 0);
Tommic9625f02021-05-06 22:03:19 +02001216 EXPECT_FALSE(media_channel1()->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001217
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001218 network_thread_->PostTask(
1219 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001220 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001221 EXPECT_TRUE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001223 network_thread_->PostTask(
1224 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001225 WaitForThreads();
Tommic9625f02021-05-06 22:03:19 +02001226 EXPECT_FALSE(media_channel1()->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 }
1228
skvladdc1c62c2016-03-16 19:07:43 -07001229 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1230 typename T::Content content;
1231 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1232 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001233 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001234 }
1235
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001236 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001237 webrtc::RtpParameters parameters;
1238 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001239 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001240 parameters.encodings.push_back(encoding);
1241 return parameters;
1242 }
1243
1244 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001245 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001246 EXPECT_EQ(1UL, parameters.encodings.size());
1247 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1248 }
1249
1250 void DefaultMaxBitrateIsUnlimited() {
1251 CreateChannels(0, 0);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001252 std::string err;
Steve Anton3828c062017-12-06 10:34:51 -08001253 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001254 SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001255 EXPECT_EQ(media_channel1()->max_bps(), -1);
1256 VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001257 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001258 }
1259
Zhi Huange830e682018-03-30 10:48:35 -07001260 // Test that when a channel gets new RtpTransport with a call to
Artem Titov880fa812021-07-30 22:30:23 +02001261 // `SetRtpTransport`, the socket options from the old RtpTransport is merged
Zhi Huange830e682018-03-30 10:48:35 -07001262 // with the options on the new one.
1263
Steve Anton8a63f782017-10-23 13:08:53 -07001264 // For example, audio and video may use separate socket options, but initially
1265 // be unbundled, then later become bundled. When this happens, their preferred
1266 // socket options should be merged to the underlying transport they share.
1267 void SocketOptionsMergedOnSetTransport() {
1268 constexpr int kSndBufSize = 4000;
1269 constexpr int kRcvBufSize = 8000;
1270
Zhi Huange830e682018-03-30 10:48:35 -07001271 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001272
Zhi Huange830e682018-03-30 10:48:35 -07001273 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001274 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001275
Niels Möller92430882021-03-18 10:03:19 +01001276 bool rcv_success, send_success;
1277 int rcv_buf, send_buf;
1278 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tommic9625f02021-05-06 22:03:19 +02001279 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1280 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1281 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1282 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001283 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001284 send_success = fake_rtp_dtls_transport2_->GetOption(
1285 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1286 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1287 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1288 });
1289
1290 ASSERT_TRUE(send_success);
1291 EXPECT_EQ(kSndBufSize, send_buf);
1292 ASSERT_TRUE(rcv_success);
1293 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001294 }
1295
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001296 void CreateSimulcastContent(const std::vector<std::string>& rids,
1297 typename T::Content* content) {
1298 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001299 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001300 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1301 }
1302
1303 StreamParams stream;
1304 stream.set_rids(rid_descriptions);
1305 CreateContent(0, kPcmuCodec, kH264Codec, content);
1306 // This is for unified plan, so there can be only one StreamParams.
1307 content->mutable_streams().clear();
1308 content->AddStream(stream);
1309 }
1310
1311 void VerifySimulcastStreamParams(const StreamParams& expected,
1312 const typename T::Channel* channel) {
1313 const std::vector<StreamParams>& streams = channel->local_streams();
1314 ASSERT_EQ(1u, streams.size());
1315 const StreamParams& result = streams[0];
1316 EXPECT_EQ(expected.rids(), result.rids());
1317 EXPECT_TRUE(result.has_ssrcs());
1318 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1319 std::vector<uint32_t> primary_ssrcs;
1320 result.GetPrimarySsrcs(&primary_ssrcs);
1321 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1322 }
1323
1324 void TestUpdateLocalStreamsWithSimulcast() {
1325 CreateChannels(0, 0);
1326 typename T::Content content1, content2, content3;
1327 CreateSimulcastContent({"f", "h", "q"}, &content1);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001328 std::string err;
1329 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001330 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1331 StreamParams stream1 = channel1_->local_streams()[0];
1332
1333 // Create a similar offer. SetLocalContent should not remove and add.
1334 CreateSimulcastContent({"f", "h", "q"}, &content2);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001335 EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001336 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1337 StreamParams stream2 = channel1_->local_streams()[0];
1338 // Check that the streams are identical (SSRCs didn't change).
1339 EXPECT_EQ(stream1, stream2);
1340
1341 // Create third offer that has same RIDs in different order.
1342 CreateSimulcastContent({"f", "q", "h"}, &content3);
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001343 EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001344 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1345 }
1346
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001348 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1349 static void ProcessThreadQueue(rtc::Thread* thread) {
1350 RTC_DCHECK(thread->IsCurrent());
1351 while (!thread->empty()) {
1352 thread->ProcessMessages(0);
1353 }
1354 }
Tommi1959f8f2021-04-26 10:20:19 +02001355 static void FlushCurrentThread() {
1356 rtc::Thread::Current()->ProcessMessages(0);
1357 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001358 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
Artem Titov880fa812021-07-30 22:30:23 +02001359 // `threads` and current thread post packets to network thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001360 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001361 thread->Invoke<void>(RTC_FROM_HERE,
1362 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001363 }
1364 ProcessThreadQueue(rtc::Thread::Current());
1365 // Network thread move them around and post back to worker = current thread.
1366 if (!network_thread_->IsCurrent()) {
1367 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001368 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001369 }
1370 // Worker thread = current Thread process received messages.
1371 ProcessThreadQueue(rtc::Thread::Current());
1372 }
Tommic9625f02021-05-06 22:03:19 +02001373
1374 typename T::MediaChannel* media_channel1() {
1375 RTC_DCHECK(channel1_);
1376 RTC_DCHECK(channel1_->media_channel());
1377 return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1378 }
1379
1380 typename T::MediaChannel* media_channel2() {
1381 RTC_DCHECK(channel2_);
1382 RTC_DCHECK(channel2_->media_channel());
1383 return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1384 }
1385
Peter Boström34fbfff2015-09-24 19:20:30 +02001386 // TODO(pbos): Remove playout from all media channels and let renderers mute
1387 // themselves.
1388 const bool verify_playout_;
Tommic9625f02021-05-06 22:03:19 +02001389 rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1390 webrtc::PendingTaskSafetyFlag::CreateDetached();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001391 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1392 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001393 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1394 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1395 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1396 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1397 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1398 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1399 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1400 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001401 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1402 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1403 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 cricket::FakeMediaEngine media_engine_;
kwiberg31022942016-03-11 14:18:21 -08001405 std::unique_ptr<typename T::Channel> channel1_;
1406 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407 typename T::Content local_media_content1_;
1408 typename T::Content local_media_content2_;
1409 typename T::Content remote_media_content1_;
1410 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001411 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001412 rtc::Buffer rtp_packet_;
1413 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001414 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001415 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416};
1417
Yves Gerey665174f2018-06-19 15:03:05 +02001418template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001419std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1420 rtc::Thread* worker_thread,
1421 rtc::Thread* network_thread,
1422 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1423 webrtc::RtpTransportInternal* rtp_transport,
1424 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001425 rtc::Thread* signaling_thread = rtc::Thread::Current();
1426 auto channel = std::make_unique<cricket::VoiceChannel>(
1427 worker_thread, network_thread, signaling_thread, std::move(ch),
1428 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1429 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001430 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001431 return channel;
1432}
1433
1434template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001435void ChannelTest<VoiceTraits>::CreateContent(
1436 int flags,
1437 const cricket::AudioCodec& audio_codec,
1438 const cricket::VideoCodec& video_codec,
1439 cricket::AudioContentDescription* audio) {
1440 audio->AddCodec(audio_codec);
1441 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442}
1443
Yves Gerey665174f2018-06-19 15:03:05 +02001444template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445void ChannelTest<VoiceTraits>::CopyContent(
1446 const cricket::AudioContentDescription& source,
1447 cricket::AudioContentDescription* audio) {
1448 *audio = source;
1449}
1450
Yves Gerey665174f2018-06-19 15:03:05 +02001451template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1453 const cricket::AudioCodec& c2) {
1454 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001455 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456}
1457
Peter Boström0c4e06b2015-10-07 12:23:21 +02001458template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001459void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001460 uint32_t ssrc,
1461 int flags,
1462 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463 audio->AddLegacyStream(ssrc);
1464}
1465
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001466class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 public:
solenberg1dd98f32015-09-10 01:57:14 -07001468 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001469 VoiceChannelSingleThreadTest()
1470 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1471};
1472
1473class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1474 public:
1475 typedef ChannelTest<VoiceTraits> Base;
1476 VoiceChannelDoubleThreadTest()
1477 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478};
1479
jbauch5869f502017-06-29 12:31:36 -07001480class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
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 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001485 : Base(true,
1486 kPcmuFrameWithExtensions,
1487 kRtcpReport,
1488 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001489};
1490
1491class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001492 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001493 public:
1494 typedef ChannelTest<VoiceTraits> Base;
1495 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001496 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1497 }
jbauch5869f502017-06-29 12:31:36 -07001498};
1499
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001501template <>
Steve Anton8699a322017-11-06 15:53:33 -08001502std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001503 rtc::Thread* worker_thread,
1504 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001505 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001506 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001507 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001508 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001509 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001510 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001511 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1512 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001513 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 return channel;
1515}
1516
Yves Gerey665174f2018-06-19 15:03:05 +02001517template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518void ChannelTest<VideoTraits>::CreateContent(
1519 int flags,
1520 const cricket::AudioCodec& audio_codec,
1521 const cricket::VideoCodec& video_codec,
1522 cricket::VideoContentDescription* video) {
1523 video->AddCodec(video_codec);
1524 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525}
1526
Yves Gerey665174f2018-06-19 15:03:05 +02001527template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528void ChannelTest<VideoTraits>::CopyContent(
1529 const cricket::VideoContentDescription& source,
1530 cricket::VideoContentDescription* video) {
1531 *video = source;
1532}
1533
Yves Gerey665174f2018-06-19 15:03:05 +02001534template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1536 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001537 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538}
1539
Peter Boström0c4e06b2015-10-07 12:23:21 +02001540template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001542 uint32_t ssrc,
1543 int flags,
1544 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545 video->AddLegacyStream(ssrc);
1546}
1547
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001548class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549 public:
solenberg1dd98f32015-09-10 01:57:14 -07001550 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001551 VideoChannelSingleThreadTest()
1552 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001553};
1554
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001555class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1556 public:
1557 typedef ChannelTest<VideoTraits> Base;
1558 VideoChannelDoubleThreadTest()
1559 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1560};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001562TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001564 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1565 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566}
1567
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001568TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1569 Base::TestDeinit();
1570}
1571
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001572TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573 Base::TestSetContents();
1574}
1575
Johannes Kron9190b822018-10-29 11:22:05 +01001576TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1577 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1578}
1579
1580TEST_F(VoiceChannelSingleThreadTest,
1581 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1582 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1583}
1584
1585TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1586 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1587}
1588
1589TEST_F(VoiceChannelSingleThreadTest,
1590 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1591 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1592}
1593
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001594TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595 Base::TestSetContentsNullOffer();
1596}
1597
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001598TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599 Base::TestSetContentsRtcpMux();
1600}
1601
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001602TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603 Base::TestSetContentsRtcpMux();
1604}
1605
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001606TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 Base::TestChangeStreamParamsInContent();
1608}
1609
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001610TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611 Base::TestPlayoutAndSendingStates();
1612}
1613
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 Base::TestMediaContentDirection();
1616}
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001619 Base::TestNetworkRouteChanges();
1620}
1621
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 Base::TestCallSetup();
1624}
1625
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 Base::SendRtpToRtp();
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001631 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001635 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 Base::SendRtpToRtpOnThread();
1644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 Base::SendWithWritabilityLoss();
1648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 Base::TestSetContentFailure();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::TestSendTwoOffers();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::TestReceiveTwoOffers();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::TestSendPrAnswer();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::TestReceivePrAnswer();
1668}
1669
zstein56162b92017-04-24 16:54:35 -07001670TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1671 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001675 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001679 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001683 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001687 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001691 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001692}
1693
Steve Anton8a63f782017-10-23 13:08:53 -07001694TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1695 Base::SocketOptionsMergedOnSetTransport();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698// VoiceChannelDoubleThreadTest
1699TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 Base::TestInit();
Tommic9625f02021-05-06 22:03:19 +02001701 EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1702 EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703}
1704
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001705TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1706 Base::TestDeinit();
1707}
1708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 Base::TestSetContents();
1711}
1712
Johannes Kron9190b822018-10-29 11:22:05 +01001713TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1714 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1715}
1716
1717TEST_F(VoiceChannelDoubleThreadTest,
1718 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1719 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1720}
1721
1722TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1723 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1724}
1725
1726TEST_F(VoiceChannelDoubleThreadTest,
1727 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1728 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1729}
1730
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001731TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 Base::TestSetContentsNullOffer();
1733}
1734
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001735TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001736 Base::TestSetContentsRtcpMux();
1737}
1738
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001739TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 Base::TestSetContentsRtcpMux();
1741}
1742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 Base::TestChangeStreamParamsInContent();
1745}
1746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001747TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 Base::TestPlayoutAndSendingStates();
1749}
1750
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001751TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1752 Base::TestMediaContentDirection();
1753}
1754
1755TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1756 Base::TestNetworkRouteChanges();
1757}
1758
1759TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1760 Base::TestCallSetup();
1761}
1762
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001763TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1764 Base::SendRtpToRtp();
1765}
1766
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001767TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001768 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001769}
1770
1771TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001772 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001773}
1774
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001775TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1776 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1777}
1778
1779TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1780 Base::SendRtpToRtpOnThread();
1781}
1782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1784 Base::SendWithWritabilityLoss();
1785}
1786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1788 Base::TestSetContentFailure();
1789}
1790
1791TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1792 Base::TestSendTwoOffers();
1793}
1794
1795TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1796 Base::TestReceiveTwoOffers();
1797}
1798
1799TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1800 Base::TestSendPrAnswer();
1801}
1802
1803TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1804 Base::TestReceivePrAnswer();
1805}
1806
zstein56162b92017-04-24 16:54:35 -07001807TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1808 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001809}
1810
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001811TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1812 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1813}
1814
1815TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1816 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1817}
1818
1819TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1820 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1821}
1822
1823TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1824 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1825}
1826
1827TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1828 Base::DefaultMaxBitrateIsUnlimited();
1829}
1830
Steve Anton8a63f782017-10-23 13:08:53 -07001831TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1832 Base::SocketOptionsMergedOnSetTransport();
1833}
1834
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001835// VideoChannelSingleThreadTest
1836TEST_F(VideoChannelSingleThreadTest, TestInit) {
1837 Base::TestInit();
1838}
1839
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001840TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1841 Base::TestDeinit();
1842}
1843
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001844TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1845 Base::TestSetContents();
1846}
1847
Johannes Kron9190b822018-10-29 11:22:05 +01001848TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1849 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1850}
1851
1852TEST_F(VideoChannelSingleThreadTest,
1853 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1854 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1855}
1856
1857TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1858 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1859}
1860
1861TEST_F(VideoChannelSingleThreadTest,
1862 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1863 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1864}
1865
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001866TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1867 Base::TestSetContentsNullOffer();
1868}
1869
1870TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1871 Base::TestSetContentsRtcpMux();
1872}
1873
1874TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1875 Base::TestSetContentsRtcpMux();
1876}
1877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1879 Base::TestChangeStreamParamsInContent();
1880}
1881
1882TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1883 Base::TestPlayoutAndSendingStates();
1884}
1885
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001886TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001887 Base::TestMediaContentDirection();
1888}
1889
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001890TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001891 Base::TestNetworkRouteChanges();
1892}
1893
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001894TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001895 Base::TestCallSetup();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 Base::SendRtpToRtp();
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001903 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904}
1905
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001906TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001907 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908}
1909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001910TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1912}
1913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001914TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 Base::SendRtpToRtpOnThread();
1916}
1917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 Base::SendWithWritabilityLoss();
1920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 Base::TestSetContentFailure();
1924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 Base::TestSendTwoOffers();
1928}
1929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 Base::TestReceiveTwoOffers();
1932}
1933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 Base::TestSendPrAnswer();
1936}
1937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001938TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 Base::TestReceivePrAnswer();
1940}
1941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001943 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944}
1945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001947 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001951 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001952}
1953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001955 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956}
1957
zstein56162b92017-04-24 16:54:35 -07001958TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1959 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001963 Base::DefaultMaxBitrateIsUnlimited();
1964}
1965
Steve Anton8a63f782017-10-23 13:08:53 -07001966TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1967 Base::SocketOptionsMergedOnSetTransport();
1968}
1969
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001970TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1971 Base::TestUpdateLocalStreamsWithSimulcast();
1972}
1973
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001974TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1975 const cricket::VideoCodec kVp8Codec(97, "VP8");
1976 cricket::VideoCodec vp9_codec(98, "VP9");
1977 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1978 cricket::VideoContentDescription video;
1979 video.set_codecs({kVp8Codec, vp9_codec});
1980
1981 CreateChannels(0, 0);
1982
Tomas Gunnarssond908d742022-01-05 10:44:26 +00001983 std::string err;
1984 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
Tommic9625f02021-05-06 22:03:19 +02001985 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
1986 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
1987 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
1988 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
1989 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
1990 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001991 cricket::kPacketizationParamRaw);
1992}
1993
1994TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
1995 const cricket::VideoCodec kVp8Codec(97, "VP8");
1996 cricket::VideoCodec vp9_codec(98, "VP9");
1997 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1998 cricket::VideoContentDescription video;
1999 video.set_codecs({kVp8Codec, vp9_codec});
2000
2001 CreateChannels(0, 0);
2002
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002003 std::string err;
2004 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2005 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002006 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2007 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2008 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2009 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2010 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2011 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002012 cricket::kPacketizationParamRaw);
2013}
2014
2015TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2016 const cricket::VideoCodec kVp8Codec(97, "VP8");
2017 cricket::VideoCodec vp9_codec(98, "VP9");
2018 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2019 cricket::VideoContentDescription video;
2020 video.set_codecs({kVp8Codec, vp9_codec});
2021
2022 CreateChannels(0, 0);
2023
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002024 std::string err;
2025 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2026 EXPECT_TRUE(err.empty());
2027 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2028 EXPECT_TRUE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002029 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2030 EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
2031 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2032 EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
2033 EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002034 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002035 EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2036 EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
2037 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2038 EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
2039 EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002040 cricket::kPacketizationParamRaw);
2041}
2042
2043TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2044 const cricket::VideoCodec kLocalCodec(98, "VP8");
2045 cricket::VideoCodec remote_codec(99, "VP8");
2046 remote_codec.packetization = cricket::kPacketizationParamRaw;
2047 cricket::VideoContentDescription local_video;
2048 local_video.set_codecs({kLocalCodec});
2049 cricket::VideoContentDescription remote_video;
2050 remote_video.set_codecs({remote_codec});
2051
2052 CreateChannels(0, 0);
2053
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002054 std::string err;
2055 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2056 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002057 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2058 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2059 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2060 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002061}
2062
2063TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2064 cricket::VideoCodec local_codec(98, "VP8");
2065 local_codec.packetization = cricket::kPacketizationParamRaw;
2066 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2067 cricket::VideoContentDescription local_video;
2068 local_video.set_codecs({local_codec});
2069 cricket::VideoContentDescription remote_video;
2070 remote_video.set_codecs({kRemoteCodec});
2071
2072 CreateChannels(0, 0);
2073
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002074 std::string err;
2075 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002076 EXPECT_TRUE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002077 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
Tommic9625f02021-05-06 22:03:19 +02002078 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2079 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2080 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2081 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002082}
2083
2084TEST_F(VideoChannelSingleThreadTest,
2085 TestSetRemoteAnswerWithInvalidPacketization) {
2086 cricket::VideoCodec local_codec(98, "VP8");
2087 local_codec.packetization = cricket::kPacketizationParamRaw;
2088 cricket::VideoCodec remote_codec(99, "VP8");
2089 remote_codec.packetization = "unknownpacketizationattributevalue";
2090 cricket::VideoContentDescription local_video;
2091 local_video.set_codecs({local_codec});
2092 cricket::VideoContentDescription remote_video;
2093 remote_video.set_codecs({remote_codec});
2094
2095 CreateChannels(0, 0);
2096
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002097 std::string err;
2098 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2099 EXPECT_TRUE(err.empty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002100 EXPECT_FALSE(
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002101 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2102 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002103 ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2104 EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002105 cricket::kPacketizationParamRaw);
Tommic9625f02021-05-06 22:03:19 +02002106 EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002107}
2108
2109TEST_F(VideoChannelSingleThreadTest,
2110 TestSetLocalAnswerWithInvalidPacketization) {
2111 cricket::VideoCodec local_codec(98, "VP8");
2112 local_codec.packetization = cricket::kPacketizationParamRaw;
2113 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2114 cricket::VideoContentDescription local_video;
2115 local_video.set_codecs({local_codec});
2116 cricket::VideoContentDescription remote_video;
2117 remote_video.set_codecs({kRemoteCodec});
2118
2119 CreateChannels(0, 0);
2120
Tomas Gunnarssond908d742022-01-05 10:44:26 +00002121 std::string err;
2122 EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2123 EXPECT_TRUE(err.empty());
2124 EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2125 EXPECT_FALSE(err.empty());
Tommic9625f02021-05-06 22:03:19 +02002126 EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2127 ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2128 EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002129}
2130
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002131// VideoChannelDoubleThreadTest
2132TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2133 Base::TestInit();
2134}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002136TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2137 Base::TestDeinit();
2138}
2139
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002140TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2141 Base::TestSetContents();
2142}
2143
Johannes Kron9190b822018-10-29 11:22:05 +01002144TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2145 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2146}
2147
2148TEST_F(VideoChannelDoubleThreadTest,
2149 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2150 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2151}
2152
2153TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2154 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2155}
2156
2157TEST_F(VideoChannelDoubleThreadTest,
2158 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2159 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2160}
2161
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002162TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2163 Base::TestSetContentsNullOffer();
2164}
2165
2166TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2167 Base::TestSetContentsRtcpMux();
2168}
2169
2170TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2171 Base::TestSetContentsRtcpMux();
2172}
2173
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002174TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2175 Base::TestChangeStreamParamsInContent();
2176}
2177
2178TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2179 Base::TestPlayoutAndSendingStates();
2180}
2181
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2183 Base::TestMediaContentDirection();
2184}
2185
2186TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2187 Base::TestNetworkRouteChanges();
2188}
2189
2190TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2191 Base::TestCallSetup();
2192}
2193
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002194TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2195 Base::SendRtpToRtp();
2196}
2197
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002198TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002199 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002200}
2201
2202TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002203 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002204}
2205
2206TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2207 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2208}
2209
2210TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2211 Base::SendRtpToRtpOnThread();
2212}
2213
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002214TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2215 Base::SendWithWritabilityLoss();
2216}
2217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002218TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2219 Base::TestSetContentFailure();
2220}
2221
2222TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2223 Base::TestSendTwoOffers();
2224}
2225
2226TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2227 Base::TestReceiveTwoOffers();
2228}
2229
2230TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2231 Base::TestSendPrAnswer();
2232}
2233
2234TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2235 Base::TestReceivePrAnswer();
2236}
2237
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002238TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2239 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2240}
2241
2242TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2243 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2244}
2245
2246TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2247 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2248}
2249
2250TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2251 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2252}
2253
zstein56162b92017-04-24 16:54:35 -07002254TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2255 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256}
2257
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002258TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2259 Base::DefaultMaxBitrateIsUnlimited();
2260}
2261
Steve Anton8a63f782017-10-23 13:08:53 -07002262TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2263 Base::SocketOptionsMergedOnSetTransport();
2264}
2265
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267// TODO(pthatcher): TestSetReceiver?