blob: 35413edf8fda4c2e4396ba63fa2efe084c270c42 [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 uint32_t kSsrc1 = 0x1111;
56const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070057const uint32_t kSsrc3 = 0x3333;
58const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020059const int kAudioPts[] = {0, 8};
60const int kVideoPts[] = {97, 99};
61enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010062
Danil Chapovalov33b01f22016-05-11 19:55:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
deadbeefcbecd352015-09-23 11:50:27 -070065template <class ChannelT,
66 class MediaChannelT,
67 class ContentT,
68 class CodecT,
69 class MediaInfoT,
70 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071class Traits {
72 public:
73 typedef ChannelT Channel;
74 typedef MediaChannelT MediaChannel;
75 typedef ContentT Content;
76 typedef CodecT Codec;
77 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020078 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079};
80
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081class VoiceTraits : public Traits<cricket::VoiceChannel,
82 cricket::FakeVoiceMediaChannel,
83 cricket::AudioContentDescription,
84 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020085 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070086 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087
88class VideoTraits : public Traits<cricket::VideoChannel,
89 cricket::FakeVideoMediaChannel,
90 cricket::VideoContentDescription,
91 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020092 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070093 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094
Harald Alvestrand48171ec2021-04-20 15:06:03 +000095// Base class for Voice/Video tests
Yves Gerey665174f2018-06-19 15:03:05 +020096template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +020097class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 public:
deadbeefac22f702017-01-12 21:59:29 -080099 enum Flags {
100 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800101 SSRC_MUX = 0x8,
102 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800103 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800104 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700105 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800106 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107
Peter Boström34fbfff2015-09-24 19:20:30 +0200108 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200109 rtc::ArrayView<const uint8_t> rtp_data,
110 rtc::ArrayView<const uint8_t> rtcp_data,
111 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200112 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200113 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800114 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 if (network_is_worker == NetworkIsWorker::Yes) {
116 network_thread_ = rtc::Thread::Current();
117 } else {
118 network_thread_keeper_ = rtc::Thread::Create();
119 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200120 network_thread_ = network_thread_keeper_.get();
121 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200125 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800126 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200127 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800128 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200129 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
Steve Anton8699a322017-11-06 15:53:33 -0800131 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
132 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200133 int flags1,
134 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800135 // Network thread is started in CreateChannels, to allow the test to
136 // configure a fake clock before any threads are spawned and attempt to
137 // access the time.
138 if (network_thread_keeper_) {
139 network_thread_keeper_->Start();
140 }
Zhi Huange830e682018-03-30 10:48:35 -0700141
deadbeeff5346592017-01-24 21:51:21 -0800142 // Make sure if using raw packet transports, they're used for both
143 // channels.
144 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200145 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800146 media_channel1_ = ch1.get();
147 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800148 rtc::PacketTransportInternal* rtp1 = nullptr;
149 rtc::PacketTransportInternal* rtcp1 = nullptr;
150 rtc::PacketTransportInternal* rtp2 = nullptr;
151 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800152 // Based on flags, create fake DTLS or raw packet transports.
153 if (flags1 & RAW_PACKET_TRANSPORT) {
154 fake_rtp_packet_transport1_.reset(
155 new rtc::FakePacketTransport("channel1_rtp"));
156 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700157 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800158 fake_rtcp_packet_transport1_.reset(
159 new rtc::FakePacketTransport("channel1_rtcp"));
160 rtcp1 = fake_rtcp_packet_transport1_.get();
161 }
162 } else {
163 // Confirmed to work with KT_RSA and KT_ECDSA.
164 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100165 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800166 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700167 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800168 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100169 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
170 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800171 rtcp1 = fake_rtcp_dtls_transport1_.get();
172 }
173 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100174 auto cert1 = rtc::RTCCertificate::Create(
175 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800176 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
177 if (fake_rtcp_dtls_transport1_) {
178 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
179 }
180 }
181 }
182 // Based on flags, create fake DTLS or raw packet transports.
183 if (flags2 & RAW_PACKET_TRANSPORT) {
184 fake_rtp_packet_transport2_.reset(
185 new rtc::FakePacketTransport("channel2_rtp"));
186 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700187 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800188 fake_rtcp_packet_transport2_.reset(
189 new rtc::FakePacketTransport("channel2_rtcp"));
190 rtcp2 = fake_rtcp_packet_transport2_.get();
191 }
192 } else {
193 // Confirmed to work with KT_RSA and KT_ECDSA.
194 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100195 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800196 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700197 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800198 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100199 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
200 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800201 rtcp2 = fake_rtcp_dtls_transport2_.get();
202 }
203 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100204 auto cert2 = rtc::RTCCertificate::Create(
205 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800206 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
207 if (fake_rtcp_dtls_transport2_) {
208 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
209 }
210 }
211 }
Zhi Huange830e682018-03-30 10:48:35 -0700212 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
213 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
214 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
215 flags1);
216 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
217 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
218 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
219 flags2);
220
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800221 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
222 rtp_transport1_.get(), flags1);
223 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
224 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200225 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
226 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000227 CopyContent(local_media_content1_, &remote_media_content1_);
228 CopyContent(local_media_content2_, &remote_media_content2_);
229
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 // Add stream information (SSRC) to the local content but not to the remote
231 // content. This means that we per default know the SSRC of what we send but
232 // not what we receive.
233 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
234 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
235
236 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
237 if (flags1 & SSRC_MUX) {
238 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
239 }
240 if (flags2 & SSRC_MUX) {
241 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
242 }
243 }
Steve Anton8699a322017-11-06 15:53:33 -0800244 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200245 rtc::Thread* worker_thread,
246 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800247 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700248 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200249 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250
Zhi Huange830e682018-03-30 10:48:35 -0700251 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
252 rtc::PacketTransportInternal* rtp_packet_transport,
253 rtc::PacketTransportInternal* rtcp_packet_transport,
254 DtlsTransportInternal* rtp_dtls_transport,
255 DtlsTransportInternal* rtcp_dtls_transport,
256 int flags) {
257 if (flags & RTCP_MUX) {
258 rtcp_packet_transport = nullptr;
259 rtcp_dtls_transport = nullptr;
260 }
261
262 if (flags & DTLS) {
263 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
264 } else {
265 if (flags & RAW_PACKET_TRANSPORT) {
266 return CreateUnencryptedTransport(rtp_packet_transport,
267 rtcp_packet_transport);
268 } else {
269 return CreateUnencryptedTransport(rtp_dtls_transport,
270 rtcp_dtls_transport);
271 }
272 }
273 }
274
275 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
276 rtc::PacketTransportInternal* rtp_packet_transport,
277 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200278 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200279 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700280
Niels Möller92430882021-03-18 10:03:19 +0100281 network_thread_->Invoke<void>(
282 RTC_FROM_HERE,
283 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
284 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
285 if (rtcp_packet_transport) {
286 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
287 }
288 });
Zhi Huange830e682018-03-30 10:48:35 -0700289 return rtp_transport;
290 }
291
292 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
293 cricket::DtlsTransportInternal* rtp_dtls_transport,
294 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200295 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700296 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700297
Niels Möller92430882021-03-18 10:03:19 +0100298 network_thread_->Invoke<void>(
299 RTC_FROM_HERE,
300 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
301 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
302 rtcp_dtls_transport);
303 });
Zhi Huange830e682018-03-30 10:48:35 -0700304 return dtls_srtp_transport;
305 }
306
deadbeeff5346592017-01-24 21:51:21 -0800307 void ConnectFakeTransports() {
308 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
309 bool asymmetric = false;
310 // Depending on test flags, could be using DTLS or raw packet transport.
311 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
312 fake_rtp_dtls_transport1_->SetDestination(
313 fake_rtp_dtls_transport2_.get(), asymmetric);
314 }
315 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
316 fake_rtcp_dtls_transport1_->SetDestination(
317 fake_rtcp_dtls_transport2_.get(), asymmetric);
318 }
319 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
320 fake_rtp_packet_transport1_->SetDestination(
321 fake_rtp_packet_transport2_.get(), asymmetric);
322 }
323 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
324 fake_rtcp_packet_transport1_->SetDestination(
325 fake_rtcp_packet_transport2_.get(), asymmetric);
326 }
327 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800328 // The transport becoming writable will asynchronously update the send state
329 // on the worker thread; since this test uses the main thread as the worker
330 // thread, we must process the message queue for this to occur.
331 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800332 }
333
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000335 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800336 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337 if (result) {
338 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000339 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800340 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800342 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000343 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800344 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 }
346 }
347 return result;
348 }
349
350 bool SendAccept() {
351 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000352 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800353 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 }
355
356 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000357 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800358 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 if (result) {
360 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000361 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800362 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 }
364 return result;
365 }
366
367 bool SendProvisionalAnswer() {
368 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800369 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 if (result) {
371 channel2_->Enable(true);
372 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800373 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800374 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 }
376 return result;
377 }
378
379 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000380 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800381 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000382 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000383 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800384 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 return result;
386 }
387
deadbeeff5346592017-01-24 21:51:21 -0800388 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 channel1_.reset();
390 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800391 fake_rtp_dtls_transport1_.reset();
392 fake_rtcp_dtls_transport1_.reset();
393 fake_rtp_dtls_transport2_.reset();
394 fake_rtcp_dtls_transport2_.reset();
395 fake_rtp_packet_transport1_.reset();
396 fake_rtcp_packet_transport1_.reset();
397 fake_rtp_packet_transport2_.reset();
398 fake_rtcp_packet_transport2_.reset();
399 if (network_thread_keeper_) {
400 network_thread_keeper_.reset();
401 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 return true;
403 }
404
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200405 void SendRtp1() {
406 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
407 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200409 void SendRtp2() {
410 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
411 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
415 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
416 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
419 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
420 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200424 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
426 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200430 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
432 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200434 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
436 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200438 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
439 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 rtc::SetBE32(data.data() + 8, ssrc);
442 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000443 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200444 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000445 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 return data;
447 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448
Yves Gerey665174f2018-06-19 15:03:05 +0200449 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
450 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451
452 void CreateContent(int flags,
453 const cricket::AudioCodec& audio_codec,
454 const cricket::VideoCodec& video_codec,
455 typename T::Content* content) {
456 // overridden in specialized classes
457 }
458 void CopyContent(const typename T::Content& source,
459 typename T::Content* content) {
460 // overridden in specialized classes
461 }
462
Steve Anton18ee1d52017-09-11 11:32:35 -0700463 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700465 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
466 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700467 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700468 AddLegacyStreamInContent(ssrc, 0, content);
469 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
471
ossu292d6582016-03-17 02:31:13 -0700472 // Will manage the lifetime of a CallThread, making sure it's
473 // destroyed before this object goes out of scope.
474 class ScopedCallThread {
475 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100477 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100478 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700479 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100480 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700481 }
482
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700484
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200485 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700486
487 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200488 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700489 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
492 return false; // overridden in specialized classes
493 }
494
Honghai Zhangcc411c02016-03-29 17:27:21 -0700495 cricket::CandidatePairInterface* last_selected_candidate_pair() {
496 return last_selected_candidate_pair_;
497 }
498
Peter Boström0c4e06b2015-10-07 12:23:21 +0200499 void AddLegacyStreamInContent(uint32_t ssrc,
500 int flags,
501 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 // Base implementation.
503 }
504
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200505 // Utility method that calls BaseChannel::srtp_active() on the network thread
506 // and returns the result. The |srtp_active()| state is maintained on the
507 // network thread, which callers need to factor in.
508 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
509 RTC_DCHECK(channel.get());
510 return network_thread_->Invoke<bool>(
511 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
512 }
513
514 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
515 // returns true.
516 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
517 RTC_DCHECK(channel.get());
518 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
519 return channel->rtp_transport() &&
520 channel->rtp_transport()->rtcp_mux_enabled();
521 });
522 }
523
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524 // Tests that can be used by derived classes.
525
526 // Basic sanity check.
527 void TestInit() {
528 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200529 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200531 if (verify_playout_) {
532 EXPECT_FALSE(media_channel1_->playout());
533 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534 EXPECT_TRUE(media_channel1_->codecs().empty());
535 EXPECT_TRUE(media_channel1_->recv_streams().empty());
536 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 }
538
539 // Test that SetLocalContent and SetRemoteContent properly configure
540 // the codecs.
541 void TestSetContents() {
542 CreateChannels(0, 0);
543 typename T::Content content;
544 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800545 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800547 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200549 EXPECT_TRUE(
550 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 }
552
Johannes Kron9190b822018-10-29 11:22:05 +0100553 // Test that SetLocalContent and SetRemoteContent properly configure
554 // extmap-allow-mixed.
555 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
556 // For a caller, SetLocalContent() is called first with an offer and next
557 // SetRemoteContent() is called with the answer.
558 CreateChannels(0, 0);
559 typename T::Content content;
560 CreateContent(0, kPcmuCodec, kH264Codec, &content);
561 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
562 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
563 content.set_extmap_allow_mixed_enum(offer_enum);
564 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
565 content.set_extmap_allow_mixed_enum(answer_enum);
566 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
567 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
568 }
569 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
570 // For a callee, SetRemoteContent() is called first with an offer and next
571 // SetLocalContent() is called with the answer.
572 CreateChannels(0, 0);
573 typename T::Content content;
574 CreateContent(0, kPcmuCodec, kH264Codec, &content);
575 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
576 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
577 content.set_extmap_allow_mixed_enum(offer_enum);
578 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
579 content.set_extmap_allow_mixed_enum(answer_enum);
580 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
581 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
582 }
583
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 // Test that SetLocalContent and SetRemoteContent properly deals
585 // with an empty offer.
586 void TestSetContentsNullOffer() {
587 CreateChannels(0, 0);
588 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800589 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000590 CreateContent(0, kPcmuCodec, kH264Codec, &content);
591 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800592 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200594 EXPECT_TRUE(
595 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 }
597
598 // Test that SetLocalContent and SetRemoteContent properly set RTCP
599 // mux.
600 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800601 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 typename T::Content content;
603 CreateContent(0, kPcmuCodec, kH264Codec, &content);
604 // Both sides agree on mux. Should no longer be a separate RTCP channel.
605 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800606 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
607 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800611 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 }
613
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 // Test that SetLocalContent and SetRemoteContent properly
615 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800616 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 void TestChangeStreamParamsInContent() {
618 cricket::StreamParams stream1;
619 stream1.groupid = "group1";
620 stream1.id = "stream1";
621 stream1.ssrcs.push_back(kSsrc1);
622 stream1.cname = "stream1_cname";
623
624 cricket::StreamParams stream2;
625 stream2.groupid = "group1";
626 stream2.id = "stream2";
627 stream2.ssrcs.push_back(kSsrc2);
628 stream2.cname = "stream2_cname";
629
630 // Setup a call where channel 1 send |stream1| to channel 2.
631 CreateChannels(0, 0);
632 typename T::Content content1;
633 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
634 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800635 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 EXPECT_TRUE(channel1_->Enable(true));
637 EXPECT_EQ(1u, media_channel1_->send_streams().size());
638
Steve Anton3828c062017-12-06 10:34:51 -0800639 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800641 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642
643 // Channel 2 do not send anything.
644 typename T::Content content2;
645 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800648 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_TRUE(channel2_->Enable(true));
650 EXPECT_EQ(0u, media_channel2_->send_streams().size());
651
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200652 SendCustomRtp1(kSsrc1, 0);
653 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
655
656 // Let channel 2 update the content by sending |stream2| and enable SRTP.
657 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700658 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800660 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 ASSERT_EQ(1u, media_channel2_->send_streams().size());
662 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
663
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
666 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
667
668 // Channel 1 replies but stop sending stream1.
669 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700670 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800671 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 EXPECT_EQ(0u, media_channel1_->send_streams().size());
673
Steve Anton3828c062017-12-06 10:34:51 -0800674 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
676
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200677 SendCustomRtp2(kSsrc2, 0);
678 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
680 }
681
682 // Test that we only start playout and sending at the right times.
683 void TestPlayoutAndSendingStates() {
684 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200685 if (verify_playout_) {
686 EXPECT_FALSE(media_channel1_->playout());
687 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200689 if (verify_playout_) {
690 EXPECT_FALSE(media_channel2_->playout());
691 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_FALSE(media_channel2_->sending());
693 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200694 if (verify_playout_) {
695 EXPECT_FALSE(media_channel1_->playout());
696 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800699 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200700 if (verify_playout_) {
701 EXPECT_TRUE(media_channel1_->playout());
702 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800705 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200706 if (verify_playout_) {
707 EXPECT_FALSE(media_channel2_->playout());
708 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800711 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200712 if (verify_playout_) {
713 EXPECT_FALSE(media_channel2_->playout());
714 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800716 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200717 if (verify_playout_) {
718 EXPECT_TRUE(media_channel1_->playout());
719 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200721 if (verify_playout_) {
722 EXPECT_FALSE(media_channel2_->playout());
723 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_FALSE(media_channel2_->sending());
725 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200726 if (verify_playout_) {
727 EXPECT_TRUE(media_channel2_->playout());
728 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000729 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000730 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800731 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 if (verify_playout_) {
733 EXPECT_TRUE(media_channel1_->playout());
734 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_TRUE(media_channel1_->sending());
736 }
737
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738 // Test that changing the MediaContentDirection in the local and remote
739 // session description start playout and sending at the right time.
740 void TestMediaContentDirection() {
741 CreateChannels(0, 0);
742 typename T::Content content1;
743 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
744 typename T::Content content2;
745 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
746 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800747 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748
749 EXPECT_TRUE(channel1_->Enable(true));
750 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 if (verify_playout_) {
752 EXPECT_FALSE(media_channel1_->playout());
753 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
756 EXPECT_FALSE(media_channel2_->playout());
757 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_FALSE(media_channel2_->sending());
759
Steve Anton3828c062017-12-06 10:34:51 -0800760 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
761 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
762 EXPECT_TRUE(
763 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
764 EXPECT_TRUE(
765 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800766 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767
Peter Boström34fbfff2015-09-24 19:20:30 +0200768 if (verify_playout_) {
769 EXPECT_TRUE(media_channel1_->playout());
770 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 if (verify_playout_) {
773 EXPECT_FALSE(media_channel2_->playout()); // local InActive
774 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 EXPECT_FALSE(media_channel2_->sending()); // local InActive
776
777 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800778 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800779 EXPECT_TRUE(
780 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
781 EXPECT_TRUE(
782 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_TRUE(media_channel1_->playout());
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200788 if (verify_playout_) {
789 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
790 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
792
793 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800794 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800795 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
796 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
799 EXPECT_TRUE(media_channel1_->playout());
800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200802 if (verify_playout_) {
803 EXPECT_TRUE(media_channel2_->playout());
804 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805 EXPECT_TRUE(media_channel2_->sending());
806 }
807
Honghai Zhangcc411c02016-03-29 17:27:21 -0700808 // Tests that when the transport channel signals a candidate pair change
809 // event, the media channel will receive a call on the network route change.
810 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700811 static constexpr uint16_t kLocalNetId = 1;
812 static constexpr uint16_t kRemoteNetId = 2;
813 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800814 // Ipv4(20) + UDP(8).
815 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800816 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200817
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800818 CreateChannels(DTLS, DTLS);
819 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700820
Honghai Zhangcc411c02016-03-29 17:27:21 -0700821 typename T::MediaChannel* media_channel1 =
822 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200823 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700824
Zhi Huang942bc2e2017-11-13 13:26:07 -0800825 // Need to wait for the threads before calling
826 // |set_num_network_route_changes| because the network route would be set
827 // when creating the channel.
828 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200829 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800830 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800831 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200832 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800833 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200834 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200835 });
836 WaitForThreads();
837 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700838 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200839 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700840
eladalon05b07bb2017-08-24 07:40:16 -0700841 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800842 rtc::NetworkRoute network_route;
843 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100844 network_route.local =
845 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
846 network_route.remote =
847 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800848 network_route.last_sent_packet_id = kLastPacketId;
849 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200850 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800851 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
852
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200853 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200854 });
855 WaitForThreads();
856 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100857 EXPECT_TRUE(media_channel1->last_network_route().connected);
858 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100859 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100860 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100861 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200862 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700863 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800864 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800865 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700866 }
867
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 // Test setting up a call.
869 void TestCallSetup() {
870 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200871 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200873 if (verify_playout_) {
874 EXPECT_TRUE(media_channel1_->playout());
875 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 EXPECT_FALSE(media_channel1_->sending());
877 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200878 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 EXPECT_TRUE(media_channel1_->sending());
880 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200881 if (verify_playout_) {
882 EXPECT_TRUE(media_channel2_->playout());
883 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 EXPECT_TRUE(media_channel2_->sending());
885 EXPECT_EQ(1U, media_channel2_->codecs().size());
886 }
887
888 // Test that we don't crash if packets are sent during call teardown
889 // when RTCP mux is enabled. This is a regression test against a specific
890 // race condition that would only occur when a RTCP packet was sent during
891 // teardown of a channel on which RTCP mux was enabled.
892 void TestCallTeardownRtcpMux() {
893 class LastWordMediaChannel : public T::MediaChannel {
894 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200895 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000896 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700897 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
898 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
900 }
901 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200902 CreateChannels(std::make_unique<LastWordMediaChannel>(),
903 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200904 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905 EXPECT_TRUE(SendInitiate());
906 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800907 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000908 }
909
910 // Send voice RTP data to the other side and ensure it gets there.
911 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700912 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 EXPECT_TRUE(SendInitiate());
914 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200915 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
916 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200917 SendRtp1();
918 SendRtp2();
919 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 EXPECT_TRUE(CheckRtp1());
921 EXPECT_TRUE(CheckRtp2());
922 EXPECT_TRUE(CheckNoRtp1());
923 EXPECT_TRUE(CheckNoRtp2());
924 }
925
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200926 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800927 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200928 EXPECT_TRUE(SendInitiate());
929 EXPECT_TRUE(SendAccept());
930 SendRtp1();
931 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200932 // Do not wait, destroy channels.
933 channel1_.reset(nullptr);
934 channel2_.reset(nullptr);
935 }
936
Zhi Huange830e682018-03-30 10:48:35 -0700937 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
938 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200939 EXPECT_FALSE(IsSrtpActive(channel1_));
940 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000941 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200942 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200944 EXPECT_TRUE(IsSrtpActive(channel1_));
945 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200946 SendRtp1();
947 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200948 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 EXPECT_TRUE(CheckRtp1());
950 EXPECT_TRUE(CheckRtp2());
951 EXPECT_TRUE(CheckNoRtp1());
952 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 }
954
955 // Test that we can send and receive early media when a provisional answer is
956 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
957 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200958 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959
Yves Gerey665174f2018-06-19 15:03:05 +0200960 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
961 EXPECT_TRUE(SendOffer());
962 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200963 EXPECT_TRUE(IsSrtpActive(channel1_));
964 EXPECT_TRUE(IsSrtpActive(channel2_));
965 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
966 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200967 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200968 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
969 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200970 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971
Yves Gerey665174f2018-06-19 15:03:05 +0200972 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200973 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
974 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200975 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000976
Yves Gerey665174f2018-06-19 15:03:05 +0200977 // Complete call setup and ensure everything is still OK.
978 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200979 EXPECT_TRUE(IsSrtpActive(channel1_));
980 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200981 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200982 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
983 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200984 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200985 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 }
987
988 // Test that we properly send RTP without SRTP from a thread.
989 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800990 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 EXPECT_TRUE(SendInitiate());
992 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200993 ScopedCallThread send_rtp1([this] { SendRtp1(); });
994 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700995 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200996 WaitForThreads(involved_threads);
997 EXPECT_TRUE(CheckRtp1());
998 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 EXPECT_TRUE(CheckNoRtp1());
1000 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 }
1002
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 // Test that the mediachannel retains its sending state after the transport
1004 // becomes non-writable.
1005 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001006 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 EXPECT_TRUE(SendInitiate());
1008 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001009 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1010 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001011 SendRtp1();
1012 SendRtp2();
1013 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(CheckRtp1());
1015 EXPECT_TRUE(CheckRtp2());
1016 EXPECT_TRUE(CheckNoRtp1());
1017 EXPECT_TRUE(CheckNoRtp2());
1018
wu@webrtc.org97077a32013-10-25 21:18:33 +00001019 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001020 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1021 fake_rtp_dtls_transport1_->SetWritable(false);
1022 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 SendRtp1();
1024 SendRtp2();
1025 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(CheckRtp1());
1027 EXPECT_TRUE(CheckNoRtp2());
1028
1029 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001030 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1031 fake_rtp_dtls_transport1_->SetWritable(true);
1032 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001034 SendRtp1();
1035 SendRtp2();
1036 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037 EXPECT_TRUE(CheckRtp1());
1038 EXPECT_TRUE(CheckRtp2());
1039 EXPECT_TRUE(CheckNoRtp1());
1040 EXPECT_TRUE(CheckNoRtp2());
1041
1042 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001043 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1044 bool asymmetric = true;
1045 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1046 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 EXPECT_TRUE(media_channel1_->sending());
1048
wu@webrtc.org97077a32013-10-25 21:18:33 +00001049 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001050 SendRtp1();
1051 SendRtp2();
1052 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 EXPECT_TRUE(CheckRtp1());
1054 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001055 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056
1057 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001058 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001059 bool asymmetric = true;
1060 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1061 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001062 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001063 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001064 SendRtp1();
1065 SendRtp2();
1066 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 EXPECT_TRUE(CheckRtp1());
1068 EXPECT_TRUE(CheckRtp2());
1069 EXPECT_TRUE(CheckNoRtp1());
1070 EXPECT_TRUE(CheckNoRtp2());
1071 }
1072
Yves Gerey665174f2018-06-19 15:03:05 +02001073 void SendBundleToBundle(const int* pl_types,
1074 int len,
1075 bool rtcp_mux,
1076 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001077 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001079 // Only pl_type1 was added to the bundle filter for both |channel1_|
1080 // and |channel2_|.
1081 int pl_type1 = pl_types[0];
1082 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001083 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001084 if (secure)
1085 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001086 if (rtcp_mux) {
1087 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001088 }
1089 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001092
1093 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001094 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1095 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1096 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001097 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001098 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1099 EXPECT_TRUE(CheckNoRtp1());
1100 EXPECT_TRUE(CheckNoRtp2());
1101
Zhi Huang365381f2018-04-13 16:44:34 -07001102 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1103 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001104 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001105 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1106 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 }
1108
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 void TestSetContentFailure() {
1110 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111
Peter Thatchera6d24442015-07-09 21:26:36 -07001112 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001113 std::unique_ptr<typename T::Content> content(
1114 CreateMediaContentWithStream(1));
1115
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001117 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001118 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001119 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001120 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001123 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001124 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001125
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001127 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001128 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 }
1130
1131 void TestSendTwoOffers() {
1132 CreateChannels(0, 0);
1133
Peter Thatchera6d24442015-07-09 21:26:36 -07001134 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001135 std::unique_ptr<typename T::Content> content1(
1136 CreateMediaContentWithStream(1));
1137 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001138 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1140
Steve Anton18ee1d52017-09-11 11:32:35 -07001141 std::unique_ptr<typename T::Content> content2(
1142 CreateMediaContentWithStream(2));
1143 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001144 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1146 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1147 }
1148
1149 void TestReceiveTwoOffers() {
1150 CreateChannels(0, 0);
1151
Peter Thatchera6d24442015-07-09 21:26:36 -07001152 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001153 std::unique_ptr<typename T::Content> content1(
1154 CreateMediaContentWithStream(1));
1155 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001156 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1158
Steve Anton18ee1d52017-09-11 11:32:35 -07001159 std::unique_ptr<typename T::Content> content2(
1160 CreateMediaContentWithStream(2));
1161 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001162 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1164 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1165 }
1166
1167 void TestSendPrAnswer() {
1168 CreateChannels(0, 0);
1169
Peter Thatchera6d24442015-07-09 21:26:36 -07001170 std::string err;
1171 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001172 std::unique_ptr<typename T::Content> content1(
1173 CreateMediaContentWithStream(1));
1174 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001175 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1177
Peter Thatchera6d24442015-07-09 21:26:36 -07001178 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001179 std::unique_ptr<typename T::Content> content2(
1180 CreateMediaContentWithStream(2));
1181 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001182 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1184 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1185
Peter Thatchera6d24442015-07-09 21:26:36 -07001186 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001187 std::unique_ptr<typename T::Content> content3(
1188 CreateMediaContentWithStream(3));
1189 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001190 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1192 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1193 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1194 }
1195
1196 void TestReceivePrAnswer() {
1197 CreateChannels(0, 0);
1198
Peter Thatchera6d24442015-07-09 21:26:36 -07001199 std::string err;
1200 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001201 std::unique_ptr<typename T::Content> content1(
1202 CreateMediaContentWithStream(1));
1203 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001204 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1206
Peter Thatchera6d24442015-07-09 21:26:36 -07001207 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001208 std::unique_ptr<typename T::Content> content2(
1209 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001210 EXPECT_TRUE(
1211 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1213 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1214
Peter Thatchera6d24442015-07-09 21:26:36 -07001215 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001216 std::unique_ptr<typename T::Content> content3(
1217 CreateMediaContentWithStream(3));
1218 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001219 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1221 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1222 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1223 }
1224
zstein56162b92017-04-24 16:54:35 -07001225 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001226 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001228
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001229 network_thread_->PostTask(
1230 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001231 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232 EXPECT_TRUE(media_channel1_->ready_to_send());
1233
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001234 network_thread_->PostTask(
1235 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001236 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001237 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 }
1239
skvladdc1c62c2016-03-16 19:07:43 -07001240 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1241 typename T::Content content;
1242 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1243 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001244 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001245 }
1246
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001247 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001248 webrtc::RtpParameters parameters;
1249 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001250 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001251 parameters.encodings.push_back(encoding);
1252 return parameters;
1253 }
1254
1255 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001256 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001257 EXPECT_EQ(1UL, parameters.encodings.size());
1258 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1259 }
1260
1261 void DefaultMaxBitrateIsUnlimited() {
1262 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001263 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1264 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001265 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001266 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001267 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001268 }
1269
Zhi Huange830e682018-03-30 10:48:35 -07001270 // Test that when a channel gets new RtpTransport with a call to
1271 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1272 // with the options on the new one.
1273
Steve Anton8a63f782017-10-23 13:08:53 -07001274 // For example, audio and video may use separate socket options, but initially
1275 // be unbundled, then later become bundled. When this happens, their preferred
1276 // socket options should be merged to the underlying transport they share.
1277 void SocketOptionsMergedOnSetTransport() {
1278 constexpr int kSndBufSize = 4000;
1279 constexpr int kRcvBufSize = 8000;
1280
Zhi Huange830e682018-03-30 10:48:35 -07001281 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001282
1283 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1284 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1285 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1286 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1287
Zhi Huange830e682018-03-30 10:48:35 -07001288 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001289 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001290
Niels Möller92430882021-03-18 10:03:19 +01001291 bool rcv_success, send_success;
1292 int rcv_buf, send_buf;
1293 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001294 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001295 send_success = fake_rtp_dtls_transport2_->GetOption(
1296 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1297 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1298 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1299 });
1300
1301 ASSERT_TRUE(send_success);
1302 EXPECT_EQ(kSndBufSize, send_buf);
1303 ASSERT_TRUE(rcv_success);
1304 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001305 }
1306
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001307 void CreateSimulcastContent(const std::vector<std::string>& rids,
1308 typename T::Content* content) {
1309 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001310 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001311 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1312 }
1313
1314 StreamParams stream;
1315 stream.set_rids(rid_descriptions);
1316 CreateContent(0, kPcmuCodec, kH264Codec, content);
1317 // This is for unified plan, so there can be only one StreamParams.
1318 content->mutable_streams().clear();
1319 content->AddStream(stream);
1320 }
1321
1322 void VerifySimulcastStreamParams(const StreamParams& expected,
1323 const typename T::Channel* channel) {
1324 const std::vector<StreamParams>& streams = channel->local_streams();
1325 ASSERT_EQ(1u, streams.size());
1326 const StreamParams& result = streams[0];
1327 EXPECT_EQ(expected.rids(), result.rids());
1328 EXPECT_TRUE(result.has_ssrcs());
1329 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1330 std::vector<uint32_t> primary_ssrcs;
1331 result.GetPrimarySsrcs(&primary_ssrcs);
1332 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1333 }
1334
1335 void TestUpdateLocalStreamsWithSimulcast() {
1336 CreateChannels(0, 0);
1337 typename T::Content content1, content2, content3;
1338 CreateSimulcastContent({"f", "h", "q"}, &content1);
1339 EXPECT_TRUE(
1340 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1341 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1342 StreamParams stream1 = channel1_->local_streams()[0];
1343
1344 // Create a similar offer. SetLocalContent should not remove and add.
1345 CreateSimulcastContent({"f", "h", "q"}, &content2);
1346 EXPECT_TRUE(
1347 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1348 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1349 StreamParams stream2 = channel1_->local_streams()[0];
1350 // Check that the streams are identical (SSRCs didn't change).
1351 EXPECT_EQ(stream1, stream2);
1352
1353 // Create third offer that has same RIDs in different order.
1354 CreateSimulcastContent({"f", "q", "h"}, &content3);
1355 EXPECT_TRUE(
1356 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1357 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1358 }
1359
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001361 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1362 static void ProcessThreadQueue(rtc::Thread* thread) {
1363 RTC_DCHECK(thread->IsCurrent());
1364 while (!thread->empty()) {
1365 thread->ProcessMessages(0);
1366 }
1367 }
1368 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1369 // |threads| and current thread post packets to network thread.
1370 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001371 thread->Invoke<void>(RTC_FROM_HERE,
1372 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001373 }
1374 ProcessThreadQueue(rtc::Thread::Current());
1375 // Network thread move them around and post back to worker = current thread.
1376 if (!network_thread_->IsCurrent()) {
1377 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001378 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001379 }
1380 // Worker thread = current Thread process received messages.
1381 ProcessThreadQueue(rtc::Thread::Current());
1382 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001383 // TODO(pbos): Remove playout from all media channels and let renderers mute
1384 // themselves.
1385 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001386 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1387 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001388 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1389 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1390 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1391 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1392 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1393 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1394 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1395 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001396 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1397 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1398 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001399 cricket::FakeMediaEngine media_engine_;
1400 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001401 typename T::MediaChannel* media_channel1_ = nullptr;
1402 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001403 std::unique_ptr<typename T::Channel> channel1_;
1404 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 typename T::Content local_media_content1_;
1406 typename T::Content local_media_content2_;
1407 typename T::Content remote_media_content1_;
1408 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001410 rtc::Buffer rtp_packet_;
1411 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001412 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001413 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414};
1415
Yves Gerey665174f2018-06-19 15:03:05 +02001416template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001417std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1418 rtc::Thread* worker_thread,
1419 rtc::Thread* network_thread,
1420 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1421 webrtc::RtpTransportInternal* rtp_transport,
1422 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001423 rtc::Thread* signaling_thread = rtc::Thread::Current();
1424 auto channel = std::make_unique<cricket::VoiceChannel>(
1425 worker_thread, network_thread, signaling_thread, std::move(ch),
1426 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1427 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001428 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001429 return channel;
1430}
1431
1432template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001433void ChannelTest<VoiceTraits>::CreateContent(
1434 int flags,
1435 const cricket::AudioCodec& audio_codec,
1436 const cricket::VideoCodec& video_codec,
1437 cricket::AudioContentDescription* audio) {
1438 audio->AddCodec(audio_codec);
1439 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440}
1441
Yves Gerey665174f2018-06-19 15:03:05 +02001442template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443void ChannelTest<VoiceTraits>::CopyContent(
1444 const cricket::AudioContentDescription& source,
1445 cricket::AudioContentDescription* audio) {
1446 *audio = source;
1447}
1448
Yves Gerey665174f2018-06-19 15:03:05 +02001449template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1451 const cricket::AudioCodec& c2) {
1452 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001453 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454}
1455
Peter Boström0c4e06b2015-10-07 12:23:21 +02001456template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001458 uint32_t ssrc,
1459 int flags,
1460 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461 audio->AddLegacyStream(ssrc);
1462}
1463
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001464class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 public:
solenberg1dd98f32015-09-10 01:57:14 -07001466 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001467 VoiceChannelSingleThreadTest()
1468 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1469};
1470
1471class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1472 public:
1473 typedef ChannelTest<VoiceTraits> Base;
1474 VoiceChannelDoubleThreadTest()
1475 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476};
1477
jbauch5869f502017-06-29 12:31:36 -07001478class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001479 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001480 public:
1481 typedef ChannelTest<VoiceTraits> Base;
1482 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001483 : Base(true,
1484 kPcmuFrameWithExtensions,
1485 kRtcpReport,
1486 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001487};
1488
1489class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001490 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001491 public:
1492 typedef ChannelTest<VoiceTraits> Base;
1493 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001494 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1495 }
jbauch5869f502017-06-29 12:31:36 -07001496};
1497
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001499template <>
Steve Anton8699a322017-11-06 15:53:33 -08001500std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001501 rtc::Thread* worker_thread,
1502 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001503 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001504 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001505 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001506 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001507 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001508 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001509 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1510 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001511 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512 return channel;
1513}
1514
Yves Gerey665174f2018-06-19 15:03:05 +02001515template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516void ChannelTest<VideoTraits>::CreateContent(
1517 int flags,
1518 const cricket::AudioCodec& audio_codec,
1519 const cricket::VideoCodec& video_codec,
1520 cricket::VideoContentDescription* video) {
1521 video->AddCodec(video_codec);
1522 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523}
1524
Yves Gerey665174f2018-06-19 15:03:05 +02001525template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526void ChannelTest<VideoTraits>::CopyContent(
1527 const cricket::VideoContentDescription& source,
1528 cricket::VideoContentDescription* video) {
1529 *video = source;
1530}
1531
Yves Gerey665174f2018-06-19 15:03:05 +02001532template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1534 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001535 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536}
1537
Peter Boström0c4e06b2015-10-07 12:23:21 +02001538template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001540 uint32_t ssrc,
1541 int flags,
1542 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 video->AddLegacyStream(ssrc);
1544}
1545
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001546class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 public:
solenberg1dd98f32015-09-10 01:57:14 -07001548 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001549 VideoChannelSingleThreadTest()
1550 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551};
1552
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001553class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1554 public:
1555 typedef ChannelTest<VideoTraits> Base;
1556 VideoChannelDoubleThreadTest()
1557 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1558};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001560TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561 Base::TestInit();
1562 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1563 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1564}
1565
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001566TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1567 Base::TestDeinit();
1568}
1569
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001570TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571 Base::TestSetContents();
1572}
1573
Johannes Kron9190b822018-10-29 11:22:05 +01001574TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1575 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1576}
1577
1578TEST_F(VoiceChannelSingleThreadTest,
1579 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1580 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1581}
1582
1583TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1584 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1585}
1586
1587TEST_F(VoiceChannelSingleThreadTest,
1588 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1589 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1590}
1591
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001592TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593 Base::TestSetContentsNullOffer();
1594}
1595
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001596TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597 Base::TestSetContentsRtcpMux();
1598}
1599
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001600TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601 Base::TestSetContentsRtcpMux();
1602}
1603
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001604TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 Base::TestChangeStreamParamsInContent();
1606}
1607
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001608TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 Base::TestPlayoutAndSendingStates();
1610}
1611
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001612TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613 Base::TestMediaContentDirection();
1614}
1615
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001616TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001617 Base::TestNetworkRouteChanges();
1618}
1619
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001620TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 Base::TestCallSetup();
1622}
1623
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001624TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625 Base::TestCallTeardownRtcpMux();
1626}
1627
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001628TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629 Base::SendRtpToRtp();
1630}
1631
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001632TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001633 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634}
1635
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001636TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001637 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001638}
1639
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001640TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1642}
1643
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001644TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 Base::SendRtpToRtpOnThread();
1646}
1647
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001648TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649 Base::SendWithWritabilityLoss();
1650}
1651
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001652TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653 Base::TestSetContentFailure();
1654}
1655
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001656TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 Base::TestSendTwoOffers();
1658}
1659
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001660TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 Base::TestReceiveTwoOffers();
1662}
1663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001664TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 Base::TestSendPrAnswer();
1666}
1667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001668TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 Base::TestReceivePrAnswer();
1670}
1671
zstein56162b92017-04-24 16:54:35 -07001672TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1673 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674}
1675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001676TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001677 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678}
1679
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001680TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001681 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001682}
1683
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001684TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001685 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001686}
1687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001688TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001689 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690}
1691
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001692TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001693 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001694}
1695
Steve Anton8a63f782017-10-23 13:08:53 -07001696TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1697 Base::SocketOptionsMergedOnSetTransport();
1698}
1699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700// VoiceChannelDoubleThreadTest
1701TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001703 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1704 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705}
1706
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001707TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1708 Base::TestDeinit();
1709}
1710
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 Base::TestSetContents();
1713}
1714
Johannes Kron9190b822018-10-29 11:22:05 +01001715TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1716 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1717}
1718
1719TEST_F(VoiceChannelDoubleThreadTest,
1720 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1721 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1722}
1723
1724TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1725 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1726}
1727
1728TEST_F(VoiceChannelDoubleThreadTest,
1729 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1730 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1731}
1732
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001733TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 Base::TestSetContentsNullOffer();
1735}
1736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 Base::TestSetContentsRtcpMux();
1739}
1740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 Base::TestSetContentsRtcpMux();
1743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 Base::TestChangeStreamParamsInContent();
1747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 Base::TestPlayoutAndSendingStates();
1751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1754 Base::TestMediaContentDirection();
1755}
1756
1757TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1758 Base::TestNetworkRouteChanges();
1759}
1760
1761TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1762 Base::TestCallSetup();
1763}
1764
1765TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1766 Base::TestCallTeardownRtcpMux();
1767}
1768
1769TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1770 Base::SendRtpToRtp();
1771}
1772
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001774 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001775}
1776
1777TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001778 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001779}
1780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1782 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1783}
1784
1785TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1786 Base::SendRtpToRtpOnThread();
1787}
1788
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1790 Base::SendWithWritabilityLoss();
1791}
1792
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001793TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1794 Base::TestSetContentFailure();
1795}
1796
1797TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1798 Base::TestSendTwoOffers();
1799}
1800
1801TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1802 Base::TestReceiveTwoOffers();
1803}
1804
1805TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1806 Base::TestSendPrAnswer();
1807}
1808
1809TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1810 Base::TestReceivePrAnswer();
1811}
1812
zstein56162b92017-04-24 16:54:35 -07001813TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1814 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001815}
1816
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001817TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1818 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1819}
1820
1821TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1822 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1823}
1824
1825TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1826 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1827}
1828
1829TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1830 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1831}
1832
1833TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1834 Base::DefaultMaxBitrateIsUnlimited();
1835}
1836
Steve Anton8a63f782017-10-23 13:08:53 -07001837TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1838 Base::SocketOptionsMergedOnSetTransport();
1839}
1840
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001841// VideoChannelSingleThreadTest
1842TEST_F(VideoChannelSingleThreadTest, TestInit) {
1843 Base::TestInit();
1844}
1845
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001846TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1847 Base::TestDeinit();
1848}
1849
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001850TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1851 Base::TestSetContents();
1852}
1853
Johannes Kron9190b822018-10-29 11:22:05 +01001854TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1855 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1856}
1857
1858TEST_F(VideoChannelSingleThreadTest,
1859 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1860 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1861}
1862
1863TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1864 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1865}
1866
1867TEST_F(VideoChannelSingleThreadTest,
1868 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1869 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1870}
1871
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001872TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1873 Base::TestSetContentsNullOffer();
1874}
1875
1876TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1877 Base::TestSetContentsRtcpMux();
1878}
1879
1880TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1881 Base::TestSetContentsRtcpMux();
1882}
1883
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001884TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1885 Base::TestChangeStreamParamsInContent();
1886}
1887
1888TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1889 Base::TestPlayoutAndSendingStates();
1890}
1891
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001892TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 Base::TestMediaContentDirection();
1894}
1895
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001896TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001897 Base::TestNetworkRouteChanges();
1898}
1899
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001900TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001901 Base::TestCallSetup();
1902}
1903
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001904TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 Base::TestCallTeardownRtcpMux();
1906}
1907
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001908TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 Base::SendRtpToRtp();
1910}
1911
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001912TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001913 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914}
1915
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001916TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001917 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918}
1919
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001920TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1922}
1923
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001924TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 Base::SendRtpToRtpOnThread();
1926}
1927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001928TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 Base::SendWithWritabilityLoss();
1930}
1931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001932TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001933 Base::TestSetContentFailure();
1934}
1935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001936TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937 Base::TestSendTwoOffers();
1938}
1939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001940TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 Base::TestReceiveTwoOffers();
1942}
1943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001944TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 Base::TestSendPrAnswer();
1946}
1947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 Base::TestReceivePrAnswer();
1950}
1951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001952TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001953 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954}
1955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001956TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001957 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001958}
1959
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001960TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001961 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001962}
1963
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001964TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001965 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966}
1967
zstein56162b92017-04-24 16:54:35 -07001968TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1969 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970}
1971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001972TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001973 Base::DefaultMaxBitrateIsUnlimited();
1974}
1975
Steve Anton8a63f782017-10-23 13:08:53 -07001976TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1977 Base::SocketOptionsMergedOnSetTransport();
1978}
1979
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001980TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1981 Base::TestUpdateLocalStreamsWithSimulcast();
1982}
1983
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001984TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1985 const cricket::VideoCodec kVp8Codec(97, "VP8");
1986 cricket::VideoCodec vp9_codec(98, "VP9");
1987 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1988 cricket::VideoContentDescription video;
1989 video.set_codecs({kVp8Codec, vp9_codec});
1990
1991 CreateChannels(0, 0);
1992
1993 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
1994 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
1995 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
1996 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
1997 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
1998 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
1999 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2000 cricket::kPacketizationParamRaw);
2001}
2002
2003TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2004 const cricket::VideoCodec kVp8Codec(97, "VP8");
2005 cricket::VideoCodec vp9_codec(98, "VP9");
2006 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2007 cricket::VideoContentDescription video;
2008 video.set_codecs({kVp8Codec, vp9_codec});
2009
2010 CreateChannels(0, 0);
2011
2012 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2013 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2014 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2015 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2016 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2017 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2018 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2019 cricket::kPacketizationParamRaw);
2020}
2021
2022TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2023 const cricket::VideoCodec kVp8Codec(97, "VP8");
2024 cricket::VideoCodec vp9_codec(98, "VP9");
2025 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2026 cricket::VideoContentDescription video;
2027 video.set_codecs({kVp8Codec, vp9_codec});
2028
2029 CreateChannels(0, 0);
2030
2031 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2032 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2033 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2034 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2035 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2036 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2037 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2038 cricket::kPacketizationParamRaw);
2039 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2040 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2041 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2042 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2043 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2044 cricket::kPacketizationParamRaw);
2045}
2046
2047TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2048 const cricket::VideoCodec kLocalCodec(98, "VP8");
2049 cricket::VideoCodec remote_codec(99, "VP8");
2050 remote_codec.packetization = cricket::kPacketizationParamRaw;
2051 cricket::VideoContentDescription local_video;
2052 local_video.set_codecs({kLocalCodec});
2053 cricket::VideoContentDescription remote_video;
2054 remote_video.set_codecs({remote_codec});
2055
2056 CreateChannels(0, 0);
2057
2058 EXPECT_TRUE(
2059 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2060 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2061 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2062 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2063 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2064 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2065}
2066
2067TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2068 cricket::VideoCodec local_codec(98, "VP8");
2069 local_codec.packetization = cricket::kPacketizationParamRaw;
2070 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2071 cricket::VideoContentDescription local_video;
2072 local_video.set_codecs({local_codec});
2073 cricket::VideoContentDescription remote_video;
2074 remote_video.set_codecs({kRemoteCodec});
2075
2076 CreateChannels(0, 0);
2077
2078 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2079 EXPECT_TRUE(
2080 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2081 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2082 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2083 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2084 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2085}
2086
2087TEST_F(VideoChannelSingleThreadTest,
2088 TestSetRemoteAnswerWithInvalidPacketization) {
2089 cricket::VideoCodec local_codec(98, "VP8");
2090 local_codec.packetization = cricket::kPacketizationParamRaw;
2091 cricket::VideoCodec remote_codec(99, "VP8");
2092 remote_codec.packetization = "unknownpacketizationattributevalue";
2093 cricket::VideoContentDescription local_video;
2094 local_video.set_codecs({local_codec});
2095 cricket::VideoContentDescription remote_video;
2096 remote_video.set_codecs({remote_codec});
2097
2098 CreateChannels(0, 0);
2099
2100 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2101 EXPECT_FALSE(
2102 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2103 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2104 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2105 cricket::kPacketizationParamRaw);
2106 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2107}
2108
2109TEST_F(VideoChannelSingleThreadTest,
2110 TestSetLocalAnswerWithInvalidPacketization) {
2111 cricket::VideoCodec local_codec(98, "VP8");
2112 local_codec.packetization = cricket::kPacketizationParamRaw;
2113 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2114 cricket::VideoContentDescription local_video;
2115 local_video.set_codecs({local_codec});
2116 cricket::VideoContentDescription remote_video;
2117 remote_video.set_codecs({kRemoteCodec});
2118
2119 CreateChannels(0, 0);
2120
2121 EXPECT_TRUE(
2122 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2123 EXPECT_FALSE(
2124 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2125 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2126 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2127 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2128}
2129
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002130// VideoChannelDoubleThreadTest
2131TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2132 Base::TestInit();
2133}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002135TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2136 Base::TestDeinit();
2137}
2138
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002139TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2140 Base::TestSetContents();
2141}
2142
Johannes Kron9190b822018-10-29 11:22:05 +01002143TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2144 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2145}
2146
2147TEST_F(VideoChannelDoubleThreadTest,
2148 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2149 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2150}
2151
2152TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2153 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2154}
2155
2156TEST_F(VideoChannelDoubleThreadTest,
2157 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2158 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2159}
2160
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002161TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2162 Base::TestSetContentsNullOffer();
2163}
2164
2165TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2166 Base::TestSetContentsRtcpMux();
2167}
2168
2169TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2170 Base::TestSetContentsRtcpMux();
2171}
2172
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002173TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2174 Base::TestChangeStreamParamsInContent();
2175}
2176
2177TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2178 Base::TestPlayoutAndSendingStates();
2179}
2180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002181TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2182 Base::TestMediaContentDirection();
2183}
2184
2185TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2186 Base::TestNetworkRouteChanges();
2187}
2188
2189TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2190 Base::TestCallSetup();
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2194 Base::TestCallTeardownRtcpMux();
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2198 Base::SendRtpToRtp();
2199}
2200
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002201TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002202 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203}
2204
2205TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002206 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207}
2208
2209TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2210 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2211}
2212
2213TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2214 Base::SendRtpToRtpOnThread();
2215}
2216
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002217TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2218 Base::SendWithWritabilityLoss();
2219}
2220
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002221TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2222 Base::TestSetContentFailure();
2223}
2224
2225TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2226 Base::TestSendTwoOffers();
2227}
2228
2229TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2230 Base::TestReceiveTwoOffers();
2231}
2232
2233TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2234 Base::TestSendPrAnswer();
2235}
2236
2237TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2238 Base::TestReceivePrAnswer();
2239}
2240
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2242 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2243}
2244
2245TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2246 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2247}
2248
2249TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2250 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2251}
2252
2253TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2254 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2255}
2256
zstein56162b92017-04-24 16:54:35 -07002257TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2258 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002259}
2260
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2262 Base::DefaultMaxBitrateIsUnlimited();
2263}
2264
Steve Anton8a63f782017-10-23 13:08:53 -07002265TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2266 Base::SocketOptionsMergedOnSetTransport();
2267}
2268
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270// TODO(pthatcher): TestSetReceiver?