blob: 4322219c8d5c7a299a30f3368cd8df8d94178ef1 [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"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020038#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040
zhihuangb2cdd932017-01-19 16:54:25 -080041using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080043using cricket::RidDescription;
44using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080046using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080047using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049namespace {
50const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
51const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
52const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070053const cricket::VideoCodec kH264Codec(97, "H264");
54const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020055const cricket::DataCodec kGoogleDataCodec(101, "google-data");
56const uint32_t kSsrc1 = 0x1111;
57const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070058const uint32_t kSsrc3 = 0x3333;
59const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020060const int kAudioPts[] = {0, 8};
61const int kVideoPts[] = {97, 99};
62enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010063
Danil Chapovalov33b01f22016-05-11 19:55:27 +020064} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
deadbeefcbecd352015-09-23 11:50:27 -070066template <class ChannelT,
67 class MediaChannelT,
68 class ContentT,
69 class CodecT,
70 class MediaInfoT,
71 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072class Traits {
73 public:
74 typedef ChannelT Channel;
75 typedef MediaChannelT MediaChannel;
76 typedef ContentT Content;
77 typedef CodecT Codec;
78 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080};
81
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082class VoiceTraits : public Traits<cricket::VoiceChannel,
83 cricket::FakeVoiceMediaChannel,
84 cricket::AudioContentDescription,
85 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
89class VideoTraits : public Traits<cricket::VideoChannel,
90 cricket::FakeVideoMediaChannel,
91 cricket::VideoContentDescription,
92 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020093 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070094 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
deadbeef953c2ce2017-01-09 14:53:41 -080096// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +020097template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +020098class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 public:
deadbeefac22f702017-01-12 21:59:29 -0800100 enum Flags {
101 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800102 SSRC_MUX = 0x8,
103 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800104 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800105 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700106 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800107 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108
Peter Boström34fbfff2015-09-24 19:20:30 +0200109 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200110 rtc::ArrayView<const uint8_t> rtp_data,
111 rtc::ArrayView<const uint8_t> rtcp_data,
112 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200113 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800115 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200116 if (network_is_worker == NetworkIsWorker::Yes) {
117 network_thread_ = rtc::Thread::Current();
118 } else {
119 network_thread_keeper_ = rtc::Thread::Create();
120 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 network_thread_ = network_thread_keeper_.get();
122 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200126 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800127 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200128 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800129 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 }
Steve Anton8699a322017-11-06 15:53:33 -0800132 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
133 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200134 int flags1,
135 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800136 // Network thread is started in CreateChannels, to allow the test to
137 // configure a fake clock before any threads are spawned and attempt to
138 // access the time.
139 if (network_thread_keeper_) {
140 network_thread_keeper_->Start();
141 }
Zhi Huange830e682018-03-30 10:48:35 -0700142
deadbeeff5346592017-01-24 21:51:21 -0800143 // Make sure if using raw packet transports, they're used for both
144 // channels.
145 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200146 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800147 media_channel1_ = ch1.get();
148 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800149 rtc::PacketTransportInternal* rtp1 = nullptr;
150 rtc::PacketTransportInternal* rtcp1 = nullptr;
151 rtc::PacketTransportInternal* rtp2 = nullptr;
152 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800153 // Based on flags, create fake DTLS or raw packet transports.
154 if (flags1 & RAW_PACKET_TRANSPORT) {
155 fake_rtp_packet_transport1_.reset(
156 new rtc::FakePacketTransport("channel1_rtp"));
157 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700158 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800159 fake_rtcp_packet_transport1_.reset(
160 new rtc::FakePacketTransport("channel1_rtcp"));
161 rtcp1 = fake_rtcp_packet_transport1_.get();
162 }
163 } else {
164 // Confirmed to work with KT_RSA and KT_ECDSA.
165 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100166 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800167 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700168 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800169 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
171 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800172 rtcp1 = fake_rtcp_dtls_transport1_.get();
173 }
174 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100175 auto cert1 = rtc::RTCCertificate::Create(
176 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800177 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
178 if (fake_rtcp_dtls_transport1_) {
179 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
180 }
181 }
182 }
183 // Based on flags, create fake DTLS or raw packet transports.
184 if (flags2 & RAW_PACKET_TRANSPORT) {
185 fake_rtp_packet_transport2_.reset(
186 new rtc::FakePacketTransport("channel2_rtp"));
187 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700188 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800189 fake_rtcp_packet_transport2_.reset(
190 new rtc::FakePacketTransport("channel2_rtcp"));
191 rtcp2 = fake_rtcp_packet_transport2_.get();
192 }
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_));
deadbeeff5346592017-01-24 21:51:21 -0800197 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700198 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800199 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100200 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
201 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800202 rtcp2 = fake_rtcp_dtls_transport2_.get();
203 }
204 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100205 auto cert2 = rtc::RTCCertificate::Create(
206 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800207 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
208 if (fake_rtcp_dtls_transport2_) {
209 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
210 }
211 }
212 }
Zhi Huange830e682018-03-30 10:48:35 -0700213 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
214 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
215 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
216 flags1);
217 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
218 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
219 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
220 flags2);
221
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800222 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
223 rtp_transport1_.get(), flags1);
224 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
225 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200226 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
227 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228 CopyContent(local_media_content1_, &remote_media_content1_);
229 CopyContent(local_media_content2_, &remote_media_content2_);
230
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 // Add stream information (SSRC) to the local content but not to the remote
232 // content. This means that we per default know the SSRC of what we send but
233 // not what we receive.
234 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
235 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
236
237 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
238 if (flags1 & SSRC_MUX) {
239 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
240 }
241 if (flags2 & SSRC_MUX) {
242 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
243 }
244 }
Steve Anton8699a322017-11-06 15:53:33 -0800245 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200246 rtc::Thread* worker_thread,
247 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800248 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700249 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200250 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000251
Zhi Huange830e682018-03-30 10:48:35 -0700252 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
253 rtc::PacketTransportInternal* rtp_packet_transport,
254 rtc::PacketTransportInternal* rtcp_packet_transport,
255 DtlsTransportInternal* rtp_dtls_transport,
256 DtlsTransportInternal* rtcp_dtls_transport,
257 int flags) {
258 if (flags & RTCP_MUX) {
259 rtcp_packet_transport = nullptr;
260 rtcp_dtls_transport = nullptr;
261 }
262
263 if (flags & DTLS) {
264 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
265 } else {
266 if (flags & RAW_PACKET_TRANSPORT) {
267 return CreateUnencryptedTransport(rtp_packet_transport,
268 rtcp_packet_transport);
269 } else {
270 return CreateUnencryptedTransport(rtp_dtls_transport,
271 rtcp_dtls_transport);
272 }
273 }
274 }
275
276 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
277 rtc::PacketTransportInternal* rtp_packet_transport,
278 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200279 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200280 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700281
Niels Möller92430882021-03-18 10:03:19 +0100282 network_thread_->Invoke<void>(
283 RTC_FROM_HERE,
284 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
285 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
286 if (rtcp_packet_transport) {
287 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
288 }
289 });
Zhi Huange830e682018-03-30 10:48:35 -0700290 return rtp_transport;
291 }
292
293 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
294 cricket::DtlsTransportInternal* rtp_dtls_transport,
295 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200296 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700297 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700298
Niels Möller92430882021-03-18 10:03:19 +0100299 network_thread_->Invoke<void>(
300 RTC_FROM_HERE,
301 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
302 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
303 rtcp_dtls_transport);
304 });
Zhi Huange830e682018-03-30 10:48:35 -0700305 return dtls_srtp_transport;
306 }
307
deadbeeff5346592017-01-24 21:51:21 -0800308 void ConnectFakeTransports() {
309 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
310 bool asymmetric = false;
311 // Depending on test flags, could be using DTLS or raw packet transport.
312 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
313 fake_rtp_dtls_transport1_->SetDestination(
314 fake_rtp_dtls_transport2_.get(), asymmetric);
315 }
316 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
317 fake_rtcp_dtls_transport1_->SetDestination(
318 fake_rtcp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
321 fake_rtp_packet_transport1_->SetDestination(
322 fake_rtp_packet_transport2_.get(), asymmetric);
323 }
324 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
325 fake_rtcp_packet_transport1_->SetDestination(
326 fake_rtcp_packet_transport2_.get(), asymmetric);
327 }
328 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800329 // The transport becoming writable will asynchronously update the send state
330 // on the worker thread; since this test uses the main thread as the worker
331 // thread, we must process the message queue for this to occur.
332 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800333 }
334
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800337 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
339 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800341 SdpType::kOffer, NULL);
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_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800345 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347 }
348 return result;
349 }
350
351 bool SendAccept() {
352 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356
357 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
361 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 return result;
366 }
367
368 bool SendProvisionalAnswer() {
369 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800370 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel2_->Enable(true);
373 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800374 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000384 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800385 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 return result;
387 }
388
deadbeeff5346592017-01-24 21:51:21 -0800389 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 channel1_.reset();
391 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800392 fake_rtp_dtls_transport1_.reset();
393 fake_rtcp_dtls_transport1_.reset();
394 fake_rtp_dtls_transport2_.reset();
395 fake_rtcp_dtls_transport2_.reset();
396 fake_rtp_packet_transport1_.reset();
397 fake_rtcp_packet_transport1_.reset();
398 fake_rtp_packet_transport2_.reset();
399 fake_rtcp_packet_transport2_.reset();
400 if (network_thread_keeper_) {
401 network_thread_keeper_.reset();
402 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 return true;
404 }
405
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200406 void SendRtp1() {
407 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
408 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp2() {
411 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
416 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
417 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
427 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200431 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
433 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200435 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
437 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
440 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::SetBE32(data.data() + 8, ssrc);
443 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000444 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000446 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 return data;
448 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
Yves Gerey665174f2018-06-19 15:03:05 +0200450 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
451 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452
453 void CreateContent(int flags,
454 const cricket::AudioCodec& audio_codec,
455 const cricket::VideoCodec& video_codec,
456 typename T::Content* content) {
457 // overridden in specialized classes
458 }
459 void CopyContent(const typename T::Content& source,
460 typename T::Content* content) {
461 // overridden in specialized classes
462 }
463
Steve Anton18ee1d52017-09-11 11:32:35 -0700464 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700466 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
467 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700468 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700469 AddLegacyStreamInContent(ssrc, 0, content);
470 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
472
ossu292d6582016-03-17 02:31:13 -0700473 // Will manage the lifetime of a CallThread, making sure it's
474 // destroyed before this object goes out of scope.
475 class ScopedCallThread {
476 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100478 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100479 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700480 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100481 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700482 }
483
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700485
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700487
488 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700490 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
493 return false; // overridden in specialized classes
494 }
495
Honghai Zhangcc411c02016-03-29 17:27:21 -0700496 cricket::CandidatePairInterface* last_selected_candidate_pair() {
497 return last_selected_candidate_pair_;
498 }
499
Peter Boström0c4e06b2015-10-07 12:23:21 +0200500 void AddLegacyStreamInContent(uint32_t ssrc,
501 int flags,
502 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 // Base implementation.
504 }
505
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200506 // Utility method that calls BaseChannel::srtp_active() on the network thread
507 // and returns the result. The |srtp_active()| state is maintained on the
508 // network thread, which callers need to factor in.
509 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
510 RTC_DCHECK(channel.get());
511 return network_thread_->Invoke<bool>(
512 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
513 }
514
515 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
516 // returns true.
517 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
518 RTC_DCHECK(channel.get());
519 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
520 return channel->rtp_transport() &&
521 channel->rtp_transport()->rtcp_mux_enabled();
522 });
523 }
524
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525 // Tests that can be used by derived classes.
526
527 // Basic sanity check.
528 void TestInit() {
529 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200530 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200532 if (verify_playout_) {
533 EXPECT_FALSE(media_channel1_->playout());
534 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 EXPECT_TRUE(media_channel1_->codecs().empty());
536 EXPECT_TRUE(media_channel1_->recv_streams().empty());
537 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 }
539
540 // Test that SetLocalContent and SetRemoteContent properly configure
541 // the codecs.
542 void TestSetContents() {
543 CreateChannels(0, 0);
544 typename T::Content content;
545 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800546 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800548 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200550 EXPECT_TRUE(
551 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000552 }
553
Johannes Kron9190b822018-10-29 11:22:05 +0100554 // Test that SetLocalContent and SetRemoteContent properly configure
555 // extmap-allow-mixed.
556 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
557 // For a caller, SetLocalContent() is called first with an offer and next
558 // SetRemoteContent() is called with the answer.
559 CreateChannels(0, 0);
560 typename T::Content content;
561 CreateContent(0, kPcmuCodec, kH264Codec, &content);
562 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
563 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
564 content.set_extmap_allow_mixed_enum(offer_enum);
565 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
566 content.set_extmap_allow_mixed_enum(answer_enum);
567 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
568 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
569 }
570 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
571 // For a callee, SetRemoteContent() is called first with an offer and next
572 // SetLocalContent() is called with the answer.
573 CreateChannels(0, 0);
574 typename T::Content content;
575 CreateContent(0, kPcmuCodec, kH264Codec, &content);
576 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
577 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
578 content.set_extmap_allow_mixed_enum(offer_enum);
579 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
580 content.set_extmap_allow_mixed_enum(answer_enum);
581 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
582 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
583 }
584
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 // Test that SetLocalContent and SetRemoteContent properly deals
586 // with an empty offer.
587 void TestSetContentsNullOffer() {
588 CreateChannels(0, 0);
589 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800590 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 CreateContent(0, kPcmuCodec, kH264Codec, &content);
592 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800593 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200595 EXPECT_TRUE(
596 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 }
598
599 // Test that SetLocalContent and SetRemoteContent properly set RTCP
600 // mux.
601 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800602 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 typename T::Content content;
604 CreateContent(0, kPcmuCodec, kH264Codec, &content);
605 // Both sides agree on mux. Should no longer be a separate RTCP channel.
606 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800607 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
608 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800610 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800612 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 }
614
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 // Test that SetLocalContent and SetRemoteContent properly
616 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800617 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 void TestChangeStreamParamsInContent() {
619 cricket::StreamParams stream1;
620 stream1.groupid = "group1";
621 stream1.id = "stream1";
622 stream1.ssrcs.push_back(kSsrc1);
623 stream1.cname = "stream1_cname";
624
625 cricket::StreamParams stream2;
626 stream2.groupid = "group1";
627 stream2.id = "stream2";
628 stream2.ssrcs.push_back(kSsrc2);
629 stream2.cname = "stream2_cname";
630
631 // Setup a call where channel 1 send |stream1| to channel 2.
632 CreateChannels(0, 0);
633 typename T::Content content1;
634 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
635 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800636 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 EXPECT_TRUE(channel1_->Enable(true));
638 EXPECT_EQ(1u, media_channel1_->send_streams().size());
639
Steve Anton3828c062017-12-06 10:34:51 -0800640 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800642 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643
644 // Channel 2 do not send anything.
645 typename T::Content content2;
646 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800649 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_TRUE(channel2_->Enable(true));
651 EXPECT_EQ(0u, media_channel2_->send_streams().size());
652
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200653 SendCustomRtp1(kSsrc1, 0);
654 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
656
657 // Let channel 2 update the content by sending |stream2| and enable SRTP.
658 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700659 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800661 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 ASSERT_EQ(1u, media_channel2_->send_streams().size());
663 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
664
Steve Anton3828c062017-12-06 10:34:51 -0800665 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
667 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
668
669 // Channel 1 replies but stop sending stream1.
670 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700671 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800672 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_EQ(0u, media_channel1_->send_streams().size());
674
Steve Anton3828c062017-12-06 10:34:51 -0800675 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
677
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200678 SendCustomRtp2(kSsrc2, 0);
679 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
681 }
682
683 // Test that we only start playout and sending at the right times.
684 void TestPlayoutAndSendingStates() {
685 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200686 if (verify_playout_) {
687 EXPECT_FALSE(media_channel1_->playout());
688 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200690 if (verify_playout_) {
691 EXPECT_FALSE(media_channel2_->playout());
692 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_FALSE(media_channel2_->sending());
694 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200695 if (verify_playout_) {
696 EXPECT_FALSE(media_channel1_->playout());
697 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800700 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200701 if (verify_playout_) {
702 EXPECT_TRUE(media_channel1_->playout());
703 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000705 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800706 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200707 if (verify_playout_) {
708 EXPECT_FALSE(media_channel2_->playout());
709 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000711 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800712 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200713 if (verify_playout_) {
714 EXPECT_FALSE(media_channel2_->playout());
715 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800717 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200718 if (verify_playout_) {
719 EXPECT_TRUE(media_channel1_->playout());
720 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200722 if (verify_playout_) {
723 EXPECT_FALSE(media_channel2_->playout());
724 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 EXPECT_FALSE(media_channel2_->sending());
726 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200727 if (verify_playout_) {
728 EXPECT_TRUE(media_channel2_->playout());
729 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000731 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800732 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200733 if (verify_playout_) {
734 EXPECT_TRUE(media_channel1_->playout());
735 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736 EXPECT_TRUE(media_channel1_->sending());
737 }
738
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 // Test that changing the MediaContentDirection in the local and remote
740 // session description start playout and sending at the right time.
741 void TestMediaContentDirection() {
742 CreateChannels(0, 0);
743 typename T::Content content1;
744 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
745 typename T::Content content2;
746 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
747 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800748 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749
750 EXPECT_TRUE(channel1_->Enable(true));
751 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 if (verify_playout_) {
753 EXPECT_FALSE(media_channel1_->playout());
754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200756 if (verify_playout_) {
757 EXPECT_FALSE(media_channel2_->playout());
758 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 EXPECT_FALSE(media_channel2_->sending());
760
Steve Anton3828c062017-12-06 10:34:51 -0800761 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
762 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
763 EXPECT_TRUE(
764 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
765 EXPECT_TRUE(
766 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800767 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 if (verify_playout_) {
770 EXPECT_TRUE(media_channel1_->playout());
771 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_FALSE(media_channel2_->playout()); // local InActive
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_FALSE(media_channel2_->sending()); // local InActive
777
778 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800779 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800780 EXPECT_TRUE(
781 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
782 EXPECT_TRUE(
783 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 if (verify_playout_) {
786 EXPECT_TRUE(media_channel1_->playout());
787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200789 if (verify_playout_) {
790 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
791 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
793
794 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800795 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800796 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
797 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 if (verify_playout_) {
800 EXPECT_TRUE(media_channel1_->playout());
801 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 if (verify_playout_) {
804 EXPECT_TRUE(media_channel2_->playout());
805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_TRUE(media_channel2_->sending());
807 }
808
Honghai Zhangcc411c02016-03-29 17:27:21 -0700809 // Tests that when the transport channel signals a candidate pair change
810 // event, the media channel will receive a call on the network route change.
811 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700812 static constexpr uint16_t kLocalNetId = 1;
813 static constexpr uint16_t kRemoteNetId = 2;
814 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800815 // Ipv4(20) + UDP(8).
816 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800817 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200818
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800819 CreateChannels(DTLS, DTLS);
820 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700821
Honghai Zhangcc411c02016-03-29 17:27:21 -0700822 typename T::MediaChannel* media_channel1 =
823 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200824 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700825
Zhi Huang942bc2e2017-11-13 13:26:07 -0800826 // Need to wait for the threads before calling
827 // |set_num_network_route_changes| because the network route would be set
828 // when creating the channel.
829 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200830 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800831 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800832 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200833 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800834 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200835 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200836 });
837 WaitForThreads();
838 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700839 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200840 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700841
eladalon05b07bb2017-08-24 07:40:16 -0700842 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800843 rtc::NetworkRoute network_route;
844 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100845 network_route.local =
846 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
847 network_route.remote =
848 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800849 network_route.last_sent_packet_id = kLastPacketId;
850 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200851 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800852 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
853
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200854 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200855 });
856 WaitForThreads();
857 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100858 EXPECT_TRUE(media_channel1->last_network_route().connected);
859 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100860 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100861 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100862 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200863 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700864 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800865 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800866 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700867 }
868
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869 // Test setting up a call.
870 void TestCallSetup() {
871 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200872 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200874 if (verify_playout_) {
875 EXPECT_TRUE(media_channel1_->playout());
876 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 EXPECT_FALSE(media_channel1_->sending());
878 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200879 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880 EXPECT_TRUE(media_channel1_->sending());
881 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200882 if (verify_playout_) {
883 EXPECT_TRUE(media_channel2_->playout());
884 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885 EXPECT_TRUE(media_channel2_->sending());
886 EXPECT_EQ(1U, media_channel2_->codecs().size());
887 }
888
889 // Test that we don't crash if packets are sent during call teardown
890 // when RTCP mux is enabled. This is a regression test against a specific
891 // race condition that would only occur when a RTCP packet was sent during
892 // teardown of a channel on which RTCP mux was enabled.
893 void TestCallTeardownRtcpMux() {
894 class LastWordMediaChannel : public T::MediaChannel {
895 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200896 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700898 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
899 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
901 }
902 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200903 CreateChannels(std::make_unique<LastWordMediaChannel>(),
904 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200905 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 EXPECT_TRUE(SendInitiate());
907 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800908 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 }
910
911 // Send voice RTP data to the other side and ensure it gets there.
912 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700913 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 EXPECT_TRUE(SendInitiate());
915 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200916 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
917 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200918 SendRtp1();
919 SendRtp2();
920 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 EXPECT_TRUE(CheckRtp1());
922 EXPECT_TRUE(CheckRtp2());
923 EXPECT_TRUE(CheckNoRtp1());
924 EXPECT_TRUE(CheckNoRtp2());
925 }
926
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200927 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800928 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200929 EXPECT_TRUE(SendInitiate());
930 EXPECT_TRUE(SendAccept());
931 SendRtp1();
932 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200933 // Do not wait, destroy channels.
934 channel1_.reset(nullptr);
935 channel2_.reset(nullptr);
936 }
937
Zhi Huange830e682018-03-30 10:48:35 -0700938 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
939 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200940 EXPECT_FALSE(IsSrtpActive(channel1_));
941 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200943 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200945 EXPECT_TRUE(IsSrtpActive(channel1_));
946 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200947 SendRtp1();
948 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200949 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950 EXPECT_TRUE(CheckRtp1());
951 EXPECT_TRUE(CheckRtp2());
952 EXPECT_TRUE(CheckNoRtp1());
953 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954 }
955
956 // Test that we can send and receive early media when a provisional answer is
957 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
958 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200959 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960
Yves Gerey665174f2018-06-19 15:03:05 +0200961 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
962 EXPECT_TRUE(SendOffer());
963 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200964 EXPECT_TRUE(IsSrtpActive(channel1_));
965 EXPECT_TRUE(IsSrtpActive(channel2_));
966 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
967 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200968 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200969 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
970 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200971 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972
Yves Gerey665174f2018-06-19 15:03:05 +0200973 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200974 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
975 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200976 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977
Yves Gerey665174f2018-06-19 15:03:05 +0200978 // Complete call setup and ensure everything is still OK.
979 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200980 EXPECT_TRUE(IsSrtpActive(channel1_));
981 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200982 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200983 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
984 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200985 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200986 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987 }
988
989 // Test that we properly send RTP without SRTP from a thread.
990 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800991 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 EXPECT_TRUE(SendInitiate());
993 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200994 ScopedCallThread send_rtp1([this] { SendRtp1(); });
995 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700996 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200997 WaitForThreads(involved_threads);
998 EXPECT_TRUE(CheckRtp1());
999 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 EXPECT_TRUE(CheckNoRtp1());
1001 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 }
1003
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 // Test that the mediachannel retains its sending state after the transport
1005 // becomes non-writable.
1006 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001007 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 EXPECT_TRUE(SendInitiate());
1009 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001010 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1011 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
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(CheckRtp2());
1017 EXPECT_TRUE(CheckNoRtp1());
1018 EXPECT_TRUE(CheckNoRtp2());
1019
wu@webrtc.org97077a32013-10-25 21:18:33 +00001020 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001021 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1022 fake_rtp_dtls_transport1_->SetWritable(false);
1023 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001024 SendRtp1();
1025 SendRtp2();
1026 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 EXPECT_TRUE(CheckRtp1());
1028 EXPECT_TRUE(CheckNoRtp2());
1029
1030 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001031 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1032 fake_rtp_dtls_transport1_->SetWritable(true);
1033 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001035 SendRtp1();
1036 SendRtp2();
1037 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038 EXPECT_TRUE(CheckRtp1());
1039 EXPECT_TRUE(CheckRtp2());
1040 EXPECT_TRUE(CheckNoRtp1());
1041 EXPECT_TRUE(CheckNoRtp2());
1042
1043 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001044 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1045 bool asymmetric = true;
1046 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1047 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001048 EXPECT_TRUE(media_channel1_->sending());
1049
wu@webrtc.org97077a32013-10-25 21:18:33 +00001050 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001051 SendRtp1();
1052 SendRtp2();
1053 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 EXPECT_TRUE(CheckRtp1());
1055 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001056 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057
1058 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001059 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001060 bool asymmetric = true;
1061 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1062 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001063 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001065 SendRtp1();
1066 SendRtp2();
1067 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068 EXPECT_TRUE(CheckRtp1());
1069 EXPECT_TRUE(CheckRtp2());
1070 EXPECT_TRUE(CheckNoRtp1());
1071 EXPECT_TRUE(CheckNoRtp2());
1072 }
1073
Yves Gerey665174f2018-06-19 15:03:05 +02001074 void SendBundleToBundle(const int* pl_types,
1075 int len,
1076 bool rtcp_mux,
1077 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001078 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001080 // Only pl_type1 was added to the bundle filter for both |channel1_|
1081 // and |channel2_|.
1082 int pl_type1 = pl_types[0];
1083 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001084 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001085 if (secure)
1086 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001087 if (rtcp_mux) {
1088 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001089 }
1090 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001093
1094 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001095 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1096 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1097 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001098 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001099 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1100 EXPECT_TRUE(CheckNoRtp1());
1101 EXPECT_TRUE(CheckNoRtp2());
1102
Zhi Huang365381f2018-04-13 16:44:34 -07001103 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1104 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001105 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001106 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1107 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 }
1109
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 void TestSetContentFailure() {
1111 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112
Peter Thatchera6d24442015-07-09 21:26:36 -07001113 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001114 std::unique_ptr<typename T::Content> content(
1115 CreateMediaContentWithStream(1));
1116
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001118 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001119 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001120 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001121 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001124 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001125 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001126
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001128 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001129 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 }
1131
1132 void TestSendTwoOffers() {
1133 CreateChannels(0, 0);
1134
Peter Thatchera6d24442015-07-09 21:26:36 -07001135 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001136 std::unique_ptr<typename T::Content> content1(
1137 CreateMediaContentWithStream(1));
1138 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001139 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1141
Steve Anton18ee1d52017-09-11 11:32:35 -07001142 std::unique_ptr<typename T::Content> content2(
1143 CreateMediaContentWithStream(2));
1144 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001145 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1147 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1148 }
1149
1150 void TestReceiveTwoOffers() {
1151 CreateChannels(0, 0);
1152
Peter Thatchera6d24442015-07-09 21:26:36 -07001153 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001154 std::unique_ptr<typename T::Content> content1(
1155 CreateMediaContentWithStream(1));
1156 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001157 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1159
Steve Anton18ee1d52017-09-11 11:32:35 -07001160 std::unique_ptr<typename T::Content> content2(
1161 CreateMediaContentWithStream(2));
1162 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001163 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1165 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1166 }
1167
1168 void TestSendPrAnswer() {
1169 CreateChannels(0, 0);
1170
Peter Thatchera6d24442015-07-09 21:26:36 -07001171 std::string err;
1172 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001173 std::unique_ptr<typename T::Content> content1(
1174 CreateMediaContentWithStream(1));
1175 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001176 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1178
Peter Thatchera6d24442015-07-09 21:26:36 -07001179 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001180 std::unique_ptr<typename T::Content> content2(
1181 CreateMediaContentWithStream(2));
1182 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001183 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1185 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1186
Peter Thatchera6d24442015-07-09 21:26:36 -07001187 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001188 std::unique_ptr<typename T::Content> content3(
1189 CreateMediaContentWithStream(3));
1190 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001191 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1193 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1194 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1195 }
1196
1197 void TestReceivePrAnswer() {
1198 CreateChannels(0, 0);
1199
Peter Thatchera6d24442015-07-09 21:26:36 -07001200 std::string err;
1201 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001202 std::unique_ptr<typename T::Content> content1(
1203 CreateMediaContentWithStream(1));
1204 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001205 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1207
Peter Thatchera6d24442015-07-09 21:26:36 -07001208 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001209 std::unique_ptr<typename T::Content> content2(
1210 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001211 EXPECT_TRUE(
1212 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1214 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1215
Peter Thatchera6d24442015-07-09 21:26:36 -07001216 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001217 std::unique_ptr<typename T::Content> content3(
1218 CreateMediaContentWithStream(3));
1219 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001220 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001221 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1222 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1223 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1224 }
1225
zstein56162b92017-04-24 16:54:35 -07001226 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001227 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001229
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001230 network_thread_->PostTask(
1231 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001232 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 EXPECT_TRUE(media_channel1_->ready_to_send());
1234
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001235 network_thread_->PostTask(
1236 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001237 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 }
1240
skvladdc1c62c2016-03-16 19:07:43 -07001241 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1242 typename T::Content content;
1243 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1244 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001245 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001246 }
1247
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001248 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001249 webrtc::RtpParameters parameters;
1250 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001251 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001252 parameters.encodings.push_back(encoding);
1253 return parameters;
1254 }
1255
1256 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001257 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001258 EXPECT_EQ(1UL, parameters.encodings.size());
1259 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1260 }
1261
1262 void DefaultMaxBitrateIsUnlimited() {
1263 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001264 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1265 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001266 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001267 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001268 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001269 }
1270
Zhi Huange830e682018-03-30 10:48:35 -07001271 // Test that when a channel gets new RtpTransport with a call to
1272 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1273 // with the options on the new one.
1274
Steve Anton8a63f782017-10-23 13:08:53 -07001275 // For example, audio and video may use separate socket options, but initially
1276 // be unbundled, then later become bundled. When this happens, their preferred
1277 // socket options should be merged to the underlying transport they share.
1278 void SocketOptionsMergedOnSetTransport() {
1279 constexpr int kSndBufSize = 4000;
1280 constexpr int kRcvBufSize = 8000;
1281
Zhi Huange830e682018-03-30 10:48:35 -07001282 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001283
1284 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1285 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1286 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1287 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1288
Zhi Huange830e682018-03-30 10:48:35 -07001289 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001290 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001291
Niels Möller92430882021-03-18 10:03:19 +01001292 bool rcv_success, send_success;
1293 int rcv_buf, send_buf;
1294 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001295 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001296 send_success = fake_rtp_dtls_transport2_->GetOption(
1297 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1298 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1299 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1300 });
1301
1302 ASSERT_TRUE(send_success);
1303 EXPECT_EQ(kSndBufSize, send_buf);
1304 ASSERT_TRUE(rcv_success);
1305 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001306 }
1307
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001308 void CreateSimulcastContent(const std::vector<std::string>& rids,
1309 typename T::Content* content) {
1310 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001311 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001312 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1313 }
1314
1315 StreamParams stream;
1316 stream.set_rids(rid_descriptions);
1317 CreateContent(0, kPcmuCodec, kH264Codec, content);
1318 // This is for unified plan, so there can be only one StreamParams.
1319 content->mutable_streams().clear();
1320 content->AddStream(stream);
1321 }
1322
1323 void VerifySimulcastStreamParams(const StreamParams& expected,
1324 const typename T::Channel* channel) {
1325 const std::vector<StreamParams>& streams = channel->local_streams();
1326 ASSERT_EQ(1u, streams.size());
1327 const StreamParams& result = streams[0];
1328 EXPECT_EQ(expected.rids(), result.rids());
1329 EXPECT_TRUE(result.has_ssrcs());
1330 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1331 std::vector<uint32_t> primary_ssrcs;
1332 result.GetPrimarySsrcs(&primary_ssrcs);
1333 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1334 }
1335
1336 void TestUpdateLocalStreamsWithSimulcast() {
1337 CreateChannels(0, 0);
1338 typename T::Content content1, content2, content3;
1339 CreateSimulcastContent({"f", "h", "q"}, &content1);
1340 EXPECT_TRUE(
1341 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1342 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1343 StreamParams stream1 = channel1_->local_streams()[0];
1344
1345 // Create a similar offer. SetLocalContent should not remove and add.
1346 CreateSimulcastContent({"f", "h", "q"}, &content2);
1347 EXPECT_TRUE(
1348 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1349 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1350 StreamParams stream2 = channel1_->local_streams()[0];
1351 // Check that the streams are identical (SSRCs didn't change).
1352 EXPECT_EQ(stream1, stream2);
1353
1354 // Create third offer that has same RIDs in different order.
1355 CreateSimulcastContent({"f", "q", "h"}, &content3);
1356 EXPECT_TRUE(
1357 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1358 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1359 }
1360
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001362 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1363 static void ProcessThreadQueue(rtc::Thread* thread) {
1364 RTC_DCHECK(thread->IsCurrent());
1365 while (!thread->empty()) {
1366 thread->ProcessMessages(0);
1367 }
1368 }
1369 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1370 // |threads| and current thread post packets to network thread.
1371 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001372 thread->Invoke<void>(RTC_FROM_HERE,
1373 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001374 }
1375 ProcessThreadQueue(rtc::Thread::Current());
1376 // Network thread move them around and post back to worker = current thread.
1377 if (!network_thread_->IsCurrent()) {
1378 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001379 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001380 }
1381 // Worker thread = current Thread process received messages.
1382 ProcessThreadQueue(rtc::Thread::Current());
1383 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001384 // TODO(pbos): Remove playout from all media channels and let renderers mute
1385 // themselves.
1386 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001387 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1388 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001389 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1390 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1391 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1392 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1393 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1394 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1395 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1396 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001397 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1398 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1399 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400 cricket::FakeMediaEngine media_engine_;
1401 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001402 typename T::MediaChannel* media_channel1_ = nullptr;
1403 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001404 std::unique_ptr<typename T::Channel> channel1_;
1405 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406 typename T::Content local_media_content1_;
1407 typename T::Content local_media_content2_;
1408 typename T::Content remote_media_content1_;
1409 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001410 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001411 rtc::Buffer rtp_packet_;
1412 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001413 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001414 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001415};
1416
Yves Gerey665174f2018-06-19 15:03:05 +02001417template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001418std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1419 rtc::Thread* worker_thread,
1420 rtc::Thread* network_thread,
1421 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1422 webrtc::RtpTransportInternal* rtp_transport,
1423 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001424 rtc::Thread* signaling_thread = rtc::Thread::Current();
1425 auto channel = std::make_unique<cricket::VoiceChannel>(
1426 worker_thread, network_thread, signaling_thread, std::move(ch),
1427 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1428 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001429 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001430 return channel;
1431}
1432
1433template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001434void ChannelTest<VoiceTraits>::CreateContent(
1435 int flags,
1436 const cricket::AudioCodec& audio_codec,
1437 const cricket::VideoCodec& video_codec,
1438 cricket::AudioContentDescription* audio) {
1439 audio->AddCodec(audio_codec);
1440 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441}
1442
Yves Gerey665174f2018-06-19 15:03:05 +02001443template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001444void ChannelTest<VoiceTraits>::CopyContent(
1445 const cricket::AudioContentDescription& source,
1446 cricket::AudioContentDescription* audio) {
1447 *audio = source;
1448}
1449
Yves Gerey665174f2018-06-19 15:03:05 +02001450template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1452 const cricket::AudioCodec& c2) {
1453 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001454 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001455}
1456
Peter Boström0c4e06b2015-10-07 12:23:21 +02001457template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001459 uint32_t ssrc,
1460 int flags,
1461 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 audio->AddLegacyStream(ssrc);
1463}
1464
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001465class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466 public:
solenberg1dd98f32015-09-10 01:57:14 -07001467 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001468 VoiceChannelSingleThreadTest()
1469 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1470};
1471
1472class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1473 public:
1474 typedef ChannelTest<VoiceTraits> Base;
1475 VoiceChannelDoubleThreadTest()
1476 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477};
1478
jbauch5869f502017-06-29 12:31:36 -07001479class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001480 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001481 public:
1482 typedef ChannelTest<VoiceTraits> Base;
1483 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001484 : Base(true,
1485 kPcmuFrameWithExtensions,
1486 kRtcpReport,
1487 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001488};
1489
1490class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001491 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001492 public:
1493 typedef ChannelTest<VoiceTraits> Base;
1494 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001495 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1496 }
jbauch5869f502017-06-29 12:31:36 -07001497};
1498
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001500template <>
Steve Anton8699a322017-11-06 15:53:33 -08001501std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001502 rtc::Thread* worker_thread,
1503 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001504 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001505 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001506 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001507 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001508 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001509 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001510 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1511 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001512 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 return channel;
1514}
1515
Yves Gerey665174f2018-06-19 15:03:05 +02001516template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517void ChannelTest<VideoTraits>::CreateContent(
1518 int flags,
1519 const cricket::AudioCodec& audio_codec,
1520 const cricket::VideoCodec& video_codec,
1521 cricket::VideoContentDescription* video) {
1522 video->AddCodec(video_codec);
1523 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524}
1525
Yves Gerey665174f2018-06-19 15:03:05 +02001526template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527void ChannelTest<VideoTraits>::CopyContent(
1528 const cricket::VideoContentDescription& source,
1529 cricket::VideoContentDescription* video) {
1530 *video = source;
1531}
1532
Yves Gerey665174f2018-06-19 15:03:05 +02001533template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1535 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001536 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537}
1538
Peter Boström0c4e06b2015-10-07 12:23:21 +02001539template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001541 uint32_t ssrc,
1542 int flags,
1543 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 video->AddLegacyStream(ssrc);
1545}
1546
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001547class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 public:
solenberg1dd98f32015-09-10 01:57:14 -07001549 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001550 VideoChannelSingleThreadTest()
1551 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552};
1553
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001554class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1555 public:
1556 typedef ChannelTest<VideoTraits> Base;
1557 VideoChannelDoubleThreadTest()
1558 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1559};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001561TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 Base::TestInit();
1563 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1564 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1565}
1566
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001567TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1568 Base::TestDeinit();
1569}
1570
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001571TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572 Base::TestSetContents();
1573}
1574
Johannes Kron9190b822018-10-29 11:22:05 +01001575TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1576 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1577}
1578
1579TEST_F(VoiceChannelSingleThreadTest,
1580 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1581 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1582}
1583
1584TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1585 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1586}
1587
1588TEST_F(VoiceChannelSingleThreadTest,
1589 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1590 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1591}
1592
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001593TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594 Base::TestSetContentsNullOffer();
1595}
1596
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001597TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 Base::TestSetContentsRtcpMux();
1599}
1600
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001601TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 Base::TestSetContentsRtcpMux();
1603}
1604
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001605TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 Base::TestChangeStreamParamsInContent();
1607}
1608
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001609TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610 Base::TestPlayoutAndSendingStates();
1611}
1612
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001613TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 Base::TestMediaContentDirection();
1615}
1616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001617TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001618 Base::TestNetworkRouteChanges();
1619}
1620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001621TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 Base::TestCallSetup();
1623}
1624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 Base::TestCallTeardownRtcpMux();
1627}
1628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001629TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 Base::SendRtpToRtp();
1631}
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001634 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635}
1636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001638 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001639}
1640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1643}
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 Base::SendRtpToRtpOnThread();
1647}
1648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001649TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001650 Base::SendWithWritabilityLoss();
1651}
1652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 Base::TestSetContentFailure();
1655}
1656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001657TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 Base::TestSendTwoOffers();
1659}
1660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001661TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 Base::TestReceiveTwoOffers();
1663}
1664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 Base::TestSendPrAnswer();
1667}
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 Base::TestReceivePrAnswer();
1671}
1672
zstein56162b92017-04-24 16:54:35 -07001673TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1674 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001678 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001682 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001683}
1684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001685TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001686 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001690 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691}
1692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001693TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001694 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001695}
1696
Steve Anton8a63f782017-10-23 13:08:53 -07001697TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1698 Base::SocketOptionsMergedOnSetTransport();
1699}
1700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001701// VoiceChannelDoubleThreadTest
1702TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001704 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1705 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706}
1707
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001708TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1709 Base::TestDeinit();
1710}
1711
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001712TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 Base::TestSetContents();
1714}
1715
Johannes Kron9190b822018-10-29 11:22:05 +01001716TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1717 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1718}
1719
1720TEST_F(VoiceChannelDoubleThreadTest,
1721 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1722 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1723}
1724
1725TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1726 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1727}
1728
1729TEST_F(VoiceChannelDoubleThreadTest,
1730 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1731 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 Base::TestSetContentsNullOffer();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestSetContentsRtcpMux();
1740}
1741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001742TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 Base::TestSetContentsRtcpMux();
1744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 Base::TestChangeStreamParamsInContent();
1748}
1749
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001750TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 Base::TestPlayoutAndSendingStates();
1752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1755 Base::TestMediaContentDirection();
1756}
1757
1758TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1759 Base::TestNetworkRouteChanges();
1760}
1761
1762TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1763 Base::TestCallSetup();
1764}
1765
1766TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1767 Base::TestCallTeardownRtcpMux();
1768}
1769
1770TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1771 Base::SendRtpToRtp();
1772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001775 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776}
1777
1778TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001779 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001780}
1781
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1783 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1784}
1785
1786TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1787 Base::SendRtpToRtpOnThread();
1788}
1789
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001790TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1791 Base::SendWithWritabilityLoss();
1792}
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1795 Base::TestSetContentFailure();
1796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1799 Base::TestSendTwoOffers();
1800}
1801
1802TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1803 Base::TestReceiveTwoOffers();
1804}
1805
1806TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1807 Base::TestSendPrAnswer();
1808}
1809
1810TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1811 Base::TestReceivePrAnswer();
1812}
1813
zstein56162b92017-04-24 16:54:35 -07001814TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1815 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001816}
1817
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001818TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1819 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1820}
1821
1822TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1823 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1824}
1825
1826TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1827 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1828}
1829
1830TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1831 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1832}
1833
1834TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1835 Base::DefaultMaxBitrateIsUnlimited();
1836}
1837
Steve Anton8a63f782017-10-23 13:08:53 -07001838TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1839 Base::SocketOptionsMergedOnSetTransport();
1840}
1841
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001842// VideoChannelSingleThreadTest
1843TEST_F(VideoChannelSingleThreadTest, TestInit) {
1844 Base::TestInit();
1845}
1846
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001847TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1848 Base::TestDeinit();
1849}
1850
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001851TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1852 Base::TestSetContents();
1853}
1854
Johannes Kron9190b822018-10-29 11:22:05 +01001855TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1856 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1857}
1858
1859TEST_F(VideoChannelSingleThreadTest,
1860 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1861 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1862}
1863
1864TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1865 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1866}
1867
1868TEST_F(VideoChannelSingleThreadTest,
1869 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1870 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1871}
1872
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001873TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1874 Base::TestSetContentsNullOffer();
1875}
1876
1877TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1878 Base::TestSetContentsRtcpMux();
1879}
1880
1881TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1882 Base::TestSetContentsRtcpMux();
1883}
1884
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001885TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1886 Base::TestChangeStreamParamsInContent();
1887}
1888
1889TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1890 Base::TestPlayoutAndSendingStates();
1891}
1892
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001893TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894 Base::TestMediaContentDirection();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001898 Base::TestNetworkRouteChanges();
1899}
1900
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001901TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902 Base::TestCallSetup();
1903}
1904
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001905TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906 Base::TestCallTeardownRtcpMux();
1907}
1908
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001909TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 Base::SendRtpToRtp();
1911}
1912
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001913TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001914 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915}
1916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001918 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919}
1920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1923}
1924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001925TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 Base::SendRtpToRtpOnThread();
1927}
1928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001929TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930 Base::SendWithWritabilityLoss();
1931}
1932
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001933TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934 Base::TestSetContentFailure();
1935}
1936
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001937TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 Base::TestSendTwoOffers();
1939}
1940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 Base::TestReceiveTwoOffers();
1943}
1944
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001945TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 Base::TestSendPrAnswer();
1947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 Base::TestReceivePrAnswer();
1951}
1952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001953TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001954 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955}
1956
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001958 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001959}
1960
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001961TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001962 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001963}
1964
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001966 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
zstein56162b92017-04-24 16:54:35 -07001969TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1970 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971}
1972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001974 Base::DefaultMaxBitrateIsUnlimited();
1975}
1976
Steve Anton8a63f782017-10-23 13:08:53 -07001977TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1978 Base::SocketOptionsMergedOnSetTransport();
1979}
1980
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001981TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1982 Base::TestUpdateLocalStreamsWithSimulcast();
1983}
1984
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001985TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1986 const cricket::VideoCodec kVp8Codec(97, "VP8");
1987 cricket::VideoCodec vp9_codec(98, "VP9");
1988 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1989 cricket::VideoContentDescription video;
1990 video.set_codecs({kVp8Codec, vp9_codec});
1991
1992 CreateChannels(0, 0);
1993
1994 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
1995 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
1996 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
1997 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
1998 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
1999 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2000 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2001 cricket::kPacketizationParamRaw);
2002}
2003
2004TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2005 const cricket::VideoCodec kVp8Codec(97, "VP8");
2006 cricket::VideoCodec vp9_codec(98, "VP9");
2007 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2008 cricket::VideoContentDescription video;
2009 video.set_codecs({kVp8Codec, vp9_codec});
2010
2011 CreateChannels(0, 0);
2012
2013 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2014 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2015 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2016 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2017 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2018 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2019 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2020 cricket::kPacketizationParamRaw);
2021}
2022
2023TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2024 const cricket::VideoCodec kVp8Codec(97, "VP8");
2025 cricket::VideoCodec vp9_codec(98, "VP9");
2026 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2027 cricket::VideoContentDescription video;
2028 video.set_codecs({kVp8Codec, vp9_codec});
2029
2030 CreateChannels(0, 0);
2031
2032 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2033 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2034 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2035 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2036 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2037 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2038 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2039 cricket::kPacketizationParamRaw);
2040 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2041 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2042 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2043 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2044 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2045 cricket::kPacketizationParamRaw);
2046}
2047
2048TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2049 const cricket::VideoCodec kLocalCodec(98, "VP8");
2050 cricket::VideoCodec remote_codec(99, "VP8");
2051 remote_codec.packetization = cricket::kPacketizationParamRaw;
2052 cricket::VideoContentDescription local_video;
2053 local_video.set_codecs({kLocalCodec});
2054 cricket::VideoContentDescription remote_video;
2055 remote_video.set_codecs({remote_codec});
2056
2057 CreateChannels(0, 0);
2058
2059 EXPECT_TRUE(
2060 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2061 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2062 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2063 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2064 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2065 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2066}
2067
2068TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2069 cricket::VideoCodec local_codec(98, "VP8");
2070 local_codec.packetization = cricket::kPacketizationParamRaw;
2071 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2072 cricket::VideoContentDescription local_video;
2073 local_video.set_codecs({local_codec});
2074 cricket::VideoContentDescription remote_video;
2075 remote_video.set_codecs({kRemoteCodec});
2076
2077 CreateChannels(0, 0);
2078
2079 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2080 EXPECT_TRUE(
2081 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2082 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2083 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2084 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2085 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2086}
2087
2088TEST_F(VideoChannelSingleThreadTest,
2089 TestSetRemoteAnswerWithInvalidPacketization) {
2090 cricket::VideoCodec local_codec(98, "VP8");
2091 local_codec.packetization = cricket::kPacketizationParamRaw;
2092 cricket::VideoCodec remote_codec(99, "VP8");
2093 remote_codec.packetization = "unknownpacketizationattributevalue";
2094 cricket::VideoContentDescription local_video;
2095 local_video.set_codecs({local_codec});
2096 cricket::VideoContentDescription remote_video;
2097 remote_video.set_codecs({remote_codec});
2098
2099 CreateChannels(0, 0);
2100
2101 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2102 EXPECT_FALSE(
2103 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2104 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2105 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2106 cricket::kPacketizationParamRaw);
2107 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2108}
2109
2110TEST_F(VideoChannelSingleThreadTest,
2111 TestSetLocalAnswerWithInvalidPacketization) {
2112 cricket::VideoCodec local_codec(98, "VP8");
2113 local_codec.packetization = cricket::kPacketizationParamRaw;
2114 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2115 cricket::VideoContentDescription local_video;
2116 local_video.set_codecs({local_codec});
2117 cricket::VideoContentDescription remote_video;
2118 remote_video.set_codecs({kRemoteCodec});
2119
2120 CreateChannels(0, 0);
2121
2122 EXPECT_TRUE(
2123 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2124 EXPECT_FALSE(
2125 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2126 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);
2129}
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
2194TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2195 Base::TestCallTeardownRtcpMux();
2196}
2197
2198TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2199 Base::SendRtpToRtp();
2200}
2201
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002202TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002203 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002204}
2205
2206TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002207 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002208}
2209
2210TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2211 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2212}
2213
2214TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2215 Base::SendRtpToRtpOnThread();
2216}
2217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002218TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2219 Base::SendWithWritabilityLoss();
2220}
2221
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002222TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2223 Base::TestSetContentFailure();
2224}
2225
2226TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2227 Base::TestSendTwoOffers();
2228}
2229
2230TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2231 Base::TestReceiveTwoOffers();
2232}
2233
2234TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2235 Base::TestSendPrAnswer();
2236}
2237
2238TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2239 Base::TestReceivePrAnswer();
2240}
2241
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002242TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2243 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2244}
2245
2246TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2247 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2248}
2249
2250TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2251 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2252}
2253
2254TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2255 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2256}
2257
zstein56162b92017-04-24 16:54:35 -07002258TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2259 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002260}
2261
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002262TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2263 Base::DefaultMaxBitrateIsUnlimited();
2264}
2265
Steve Anton8a63f782017-10-23 13:08:53 -07002266TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2267 Base::SocketOptionsMergedOnSetTransport();
2268}
2269
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271// TODO(pthatcher): TestSetReceiver?