blob: 4eef70f4eae87270b48052233e3bbd3d46c9d1f6 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:131/*
kjellander65c7f672016-02-12 08:05:012 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:133 *
kjellander65c7f672016-02-12 08:05:014 * 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:139 */
henrike@webrtc.org28e20752013-07-10 00:45:3610
Anton Sukhanov4f08faa2019-05-21 18:12:5711#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 15:47:4913#include <cstdint>
kwiberg31022942016-03-11 22:18:2114#include <memory>
Mirko Bonadeic61ce0d2017-11-21 16:04:2015#include <utility>
kwiberg31022942016-03-11 22:18:2116
Mirko Bonadei92ea95e2017-09-15 04:47:3117#include "api/array_view.h"
Yves Gerey3e707812018-11-28 15:47:4918#include "api/audio_options.h"
Steve Anton10542f22019-01-11 17:11:0019#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 15:47:4920#include "media/base/codec.h"
Steve Anton10542f22019-01-11 17:11:0021#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 17:11:0029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 15:47:4932#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3133#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 17:11:0034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3135#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 17:11:0036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 13:38:5038#include "test/gmock.h"
Yves Gerey3e707812018-11-28 15:47:4939#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:3640
zhihuangb2cdd932017-01-20 00:54:2541using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:3642using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-26 01:13:5643using cricket::RidDescription;
44using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:3645using cricket::StreamParams;
Steve Anton4e70a722017-11-28 22:57:1046using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 18:34:5147using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:3648
Danil Chapovalov33b01f22016-05-11 17:55:2749namespace {
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 08:21:1653const cricket::VideoCodec kH264Codec(97, "H264");
54const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 17:55:2755const cricket::DataCodec kGoogleDataCodec(101, "google-data");
56const uint32_t kSsrc1 = 0x1111;
57const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 23:44:3458const uint32_t kSsrc3 = 0x3333;
59const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 17:55:2760const int kAudioPts[] = {0, 8};
61const int kVideoPts[] = {97, 99};
62enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 09:22:4763
Danil Chapovalov33b01f22016-05-11 17:55:2764} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:3665
deadbeefcbecd352015-09-23 18:50:2766template <class ChannelT,
67 class MediaChannelT,
68 class ContentT,
69 class CodecT,
70 class MediaInfoT,
71 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:3672class Traits {
73 public:
74 typedef ChannelT Channel;
75 typedef MediaChannelT MediaChannel;
76 typedef ContentT Content;
77 typedef CodecT Codec;
78 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 14:42:5679 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:3680};
81
henrike@webrtc.org28e20752013-07-10 00:45:3682class VoiceTraits : public Traits<cricket::VoiceChannel,
83 cricket::FakeVoiceMediaChannel,
84 cricket::AudioContentDescription,
85 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 14:42:5686 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 18:50:2787 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:3688
89class VideoTraits : public Traits<cricket::VideoChannel,
90 cricket::FakeVideoMediaChannel,
91 cricket::VideoContentDescription,
92 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 14:42:5693 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 18:50:2794 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:3695
deadbeef953c2ce2017-01-09 22:53:4196class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:3697 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 11:36:1698 cricket::RtpDataContentDescription,
99 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 14:42:56100 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 18:50:27101 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36102
deadbeef953c2ce2017-01-09 22:53:41103// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 13:03:05104template <class T>
Mirko Bonadei6a489f22019-04-09 13:11:12105class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36106 public:
deadbeefac22f702017-01-13 05:59:29107 enum Flags {
108 RTCP_MUX = 0x1,
deadbeefac22f702017-01-13 05:59:29109 SSRC_MUX = 0x8,
110 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 19:31:50111 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-25 05:51:21112 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 10:23:33113 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-13 05:59:29114 };
henrike@webrtc.org28e20752013-07-10 00:45:36115
Peter Boström34fbfff2015-09-24 17:20:30116 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 17:55:27117 rtc::ArrayView<const uint8_t> rtp_data,
118 rtc::ArrayView<const uint8_t> rtcp_data,
119 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 17:20:30120 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 17:55:27121 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-25 05:51:21122 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 17:55:27123 if (network_is_worker == NetworkIsWorker::Yes) {
124 network_thread_ = rtc::Thread::Current();
125 } else {
126 network_thread_keeper_ = rtc::Thread::Create();
127 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 17:55:27128 network_thread_ = network_thread_keeper_.get();
129 }
Danil Chapovalov33b01f22016-05-11 17:55:27130 }
henrike@webrtc.org28e20752013-07-10 00:45:36131
henrike@webrtc.org28e20752013-07-10 00:45:36132 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 15:06:18133 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 23:53:33134 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 15:06:18135 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 23:53:33136 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 17:55:27137 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36138 }
Steve Anton8699a322017-11-06 23:53:33139 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
140 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 17:55:27141 int flags1,
142 int flags2) {
deadbeeff5346592017-01-25 05:51:21143 // Network thread is started in CreateChannels, to allow the test to
144 // configure a fake clock before any threads are spawned and attempt to
145 // access the time.
146 if (network_thread_keeper_) {
147 network_thread_keeper_->Start();
148 }
Zhi Huange830e682018-03-30 17:48:35149
deadbeeff5346592017-01-25 05:51:21150 // Make sure if using raw packet transports, they're used for both
151 // channels.
152 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 17:55:27153 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 23:53:33154 media_channel1_ = ch1.get();
155 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 19:31:50156 rtc::PacketTransportInternal* rtp1 = nullptr;
157 rtc::PacketTransportInternal* rtcp1 = nullptr;
158 rtc::PacketTransportInternal* rtp2 = nullptr;
159 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-25 05:51:21160 // Based on flags, create fake DTLS or raw packet transports.
161 if (flags1 & RAW_PACKET_TRANSPORT) {
162 fake_rtp_packet_transport1_.reset(
163 new rtc::FakePacketTransport("channel1_rtp"));
164 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 17:48:35165 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-25 05:51:21166 fake_rtcp_packet_transport1_.reset(
167 new rtc::FakePacketTransport("channel1_rtcp"));
168 rtcp1 = fake_rtcp_packet_transport1_.get();
169 }
170 } else {
171 // Confirmed to work with KT_RSA and KT_ECDSA.
172 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
173 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
174 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 17:48:35175 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-25 05:51:21176 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
177 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
178 rtcp1 = fake_rtcp_dtls_transport1_.get();
179 }
180 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 21:51:32181 auto cert1 = rtc::RTCCertificate::Create(
182 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-25 05:51:21183 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
186 }
187 }
188 }
189 // Based on flags, create fake DTLS or raw packet transports.
190 if (flags2 & RAW_PACKET_TRANSPORT) {
191 fake_rtp_packet_transport2_.reset(
192 new rtc::FakePacketTransport("channel2_rtp"));
193 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 17:48:35194 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-25 05:51:21195 fake_rtcp_packet_transport2_.reset(
196 new rtc::FakePacketTransport("channel2_rtcp"));
197 rtcp2 = fake_rtcp_packet_transport2_.get();
198 }
199 } else {
200 // Confirmed to work with KT_RSA and KT_ECDSA.
201 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
202 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
203 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 17:48:35204 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-25 05:51:21205 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
206 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
207 rtcp2 = fake_rtcp_dtls_transport2_.get();
208 }
209 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 21:51:32210 auto cert2 = rtc::RTCCertificate::Create(
211 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-25 05:51:21212 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
213 if (fake_rtcp_dtls_transport2_) {
214 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
215 }
216 }
217 }
Zhi Huange830e682018-03-30 17:48:35218 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
219 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
220 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
221 flags1);
222 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
223 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
224 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
225 flags2);
226
Amit Hilbuchbcd39d42019-01-26 01:13:56227 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
228 rtp_transport1_.get(), flags1);
229 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
230 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 13:03:05231 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
232 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36233 CopyContent(local_media_content1_, &remote_media_content1_);
234 CopyContent(local_media_content2_, &remote_media_content2_);
235
henrike@webrtc.org28e20752013-07-10 00:45:36236 // Add stream information (SSRC) to the local content but not to the remote
237 // content. This means that we per default know the SSRC of what we send but
238 // not what we receive.
239 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
240 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
241
242 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
243 if (flags1 & SSRC_MUX) {
244 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
245 }
246 if (flags2 & SSRC_MUX) {
247 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
248 }
249 }
Steve Anton8699a322017-11-06 23:53:33250 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 17:55:27251 rtc::Thread* worker_thread,
252 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 23:53:33253 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 17:48:35254 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 16:22:12255 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36256
Zhi Huange830e682018-03-30 17:48:35257 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
258 rtc::PacketTransportInternal* rtp_packet_transport,
259 rtc::PacketTransportInternal* rtcp_packet_transport,
260 DtlsTransportInternal* rtp_dtls_transport,
261 DtlsTransportInternal* rtcp_dtls_transport,
262 int flags) {
263 if (flags & RTCP_MUX) {
264 rtcp_packet_transport = nullptr;
265 rtcp_dtls_transport = nullptr;
266 }
267
268 if (flags & DTLS) {
269 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
270 } else {
271 if (flags & RAW_PACKET_TRANSPORT) {
272 return CreateUnencryptedTransport(rtp_packet_transport,
273 rtcp_packet_transport);
274 } else {
275 return CreateUnencryptedTransport(rtp_dtls_transport,
276 rtcp_dtls_transport);
277 }
278 }
279 }
280
281 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
282 rtc::PacketTransportInternal* rtp_packet_transport,
283 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 15:06:18284 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 09:40:33285 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 17:48:35286
287 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
288 if (rtcp_packet_transport) {
289 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
290 }
291 return rtp_transport;
292 }
293
294 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
295 cricket::DtlsTransportInternal* rtp_dtls_transport,
296 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 15:06:18297 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 23:44:34298 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 17:48:35299
300 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
301 rtcp_dtls_transport);
302 return dtls_srtp_transport;
303 }
304
deadbeeff5346592017-01-25 05:51:21305 void ConnectFakeTransports() {
306 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
307 bool asymmetric = false;
308 // Depending on test flags, could be using DTLS or raw packet transport.
309 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
310 fake_rtp_dtls_transport1_->SetDestination(
311 fake_rtp_dtls_transport2_.get(), asymmetric);
312 }
313 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
314 fake_rtcp_dtls_transport1_->SetDestination(
315 fake_rtcp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
318 fake_rtp_packet_transport1_->SetDestination(
319 fake_rtp_packet_transport2_.get(), asymmetric);
320 }
321 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
322 fake_rtcp_packet_transport1_->SetDestination(
323 fake_rtcp_packet_transport2_.get(), asymmetric);
324 }
325 });
326 }
327
henrike@webrtc.org28e20752013-07-10 00:45:36328 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54329 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 18:34:51330 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36331 if (result) {
332 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54333 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 18:34:51334 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36335 if (result) {
deadbeeff5346592017-01-25 05:51:21336 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54337 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 18:34:51338 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36339 }
340 }
341 return result;
342 }
343
344 bool SendAccept() {
345 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54346 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 18:34:51347 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36348 }
349
350 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54351 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 18:34:51352 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36353 if (result) {
354 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54355 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 18:34:51356 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36357 }
358 return result;
359 }
360
361 bool SendProvisionalAnswer() {
362 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 18:34:51363 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36364 if (result) {
365 channel2_->Enable(true);
366 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 18:34:51367 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-25 05:51:21368 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36369 }
370 return result;
371 }
372
373 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54374 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 18:34:51375 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36376 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54377 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 18:34:51378 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36379 return result;
380 }
381
deadbeeff5346592017-01-25 05:51:21382 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36383 channel1_.reset();
384 channel2_.reset();
deadbeeff5346592017-01-25 05:51:21385 fake_rtp_dtls_transport1_.reset();
386 fake_rtcp_dtls_transport1_.reset();
387 fake_rtp_dtls_transport2_.reset();
388 fake_rtcp_dtls_transport2_.reset();
389 fake_rtp_packet_transport1_.reset();
390 fake_rtcp_packet_transport1_.reset();
391 fake_rtp_packet_transport2_.reset();
392 fake_rtcp_packet_transport2_.reset();
393 if (network_thread_keeper_) {
394 network_thread_keeper_.reset();
395 }
henrike@webrtc.org28e20752013-07-10 00:45:36396 return true;
397 }
398
Danil Chapovalov33b01f22016-05-11 17:55:27399 void SendRtp1() {
400 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
401 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36402 }
Danil Chapovalov33b01f22016-05-11 17:55:27403 void SendRtp2() {
404 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
405 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36406 }
henrike@webrtc.org28e20752013-07-10 00:45:36407 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 17:55:27408 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
409 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
410 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36411 }
Danil Chapovalov33b01f22016-05-11 17:55:27412 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
413 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
414 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36415 }
Danil Chapovalov33b01f22016-05-11 17:55:27416
henrike@webrtc.org28e20752013-07-10 00:45:36417 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 17:55:27418 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36419 }
420 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 17:55:27421 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36422 }
henrike@webrtc.org28e20752013-07-10 00:45:36423 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 10:23:21424 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 17:55:27425 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
426 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36427 }
Peter Boström0c4e06b2015-10-07 10:23:21428 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 17:55:27429 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
430 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36431 }
Danil Chapovalov33b01f22016-05-11 17:55:27432 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
433 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36434 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 17:55:27435 rtc::SetBE32(data.data() + 8, ssrc);
436 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08437 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 17:55:27438 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08439 }
henrike@webrtc.org28e20752013-07-10 00:45:36440 return data;
441 }
henrike@webrtc.org28e20752013-07-10 00:45:36442
Yves Gerey665174f2018-06-19 13:03:05443 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
444 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36445
446 void CreateContent(int flags,
447 const cricket::AudioCodec& audio_codec,
448 const cricket::VideoCodec& video_codec,
449 typename T::Content* content) {
450 // overridden in specialized classes
451 }
452 void CopyContent(const typename T::Content& source,
453 typename T::Content* content) {
454 // overridden in specialized classes
455 }
456
Steve Anton18ee1d52017-09-11 18:32:35457 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36458 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 18:32:35459 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
460 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 17:48:35461 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 18:32:35462 AddLegacyStreamInContent(ssrc, 0, content);
463 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36464 }
465
ossu292d6582016-03-17 09:31:13466 // Will manage the lifetime of a CallThread, making sure it's
467 // destroyed before this object goes out of scope.
468 class ScopedCallThread {
469 public:
Danil Chapovalov33b01f22016-05-11 17:55:27470 template <class FunctorT>
Artem Titovd8bd7502019-01-09 20:10:00471 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 14:19:27472 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 09:31:13473 thread_->Start();
Danil Chapovalovb877e712019-11-29 14:19:27474 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 09:31:13475 }
476
Danil Chapovalov33b01f22016-05-11 17:55:27477 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 09:31:13478
Danil Chapovalov33b01f22016-05-11 17:55:27479 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 09:31:13480
481 private:
Danil Chapovalov33b01f22016-05-11 17:55:27482 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 09:31:13483 };
henrike@webrtc.org28e20752013-07-10 00:45:36484
henrike@webrtc.org28e20752013-07-10 00:45:36485 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
486 return false; // overridden in specialized classes
487 }
488
Honghai Zhangcc411c02016-03-30 00:27:21489 cricket::CandidatePairInterface* last_selected_candidate_pair() {
490 return last_selected_candidate_pair_;
491 }
492
Peter Boström0c4e06b2015-10-07 10:23:21493 void AddLegacyStreamInContent(uint32_t ssrc,
494 int flags,
495 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36496 // Base implementation.
497 }
498
499 // Tests that can be used by derived classes.
500
501 // Basic sanity check.
502 void TestInit() {
503 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 19:12:30504 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36505 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30506 if (verify_playout_) {
507 EXPECT_FALSE(media_channel1_->playout());
508 }
henrike@webrtc.org28e20752013-07-10 00:45:36509 EXPECT_TRUE(media_channel1_->codecs().empty());
510 EXPECT_TRUE(media_channel1_->recv_streams().empty());
511 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36512 }
513
514 // Test that SetLocalContent and SetRemoteContent properly configure
515 // the codecs.
516 void TestSetContents() {
517 CreateChannels(0, 0);
518 typename T::Content content;
519 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 18:34:51520 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36521 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 18:34:51522 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36523 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 13:03:05524 EXPECT_TRUE(
525 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36526 }
527
Johannes Kron9190b822018-10-29 10:22:05528 // Test that SetLocalContent and SetRemoteContent properly configure
529 // extmap-allow-mixed.
530 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
531 // For a caller, SetLocalContent() is called first with an offer and next
532 // SetRemoteContent() is called with the answer.
533 CreateChannels(0, 0);
534 typename T::Content content;
535 CreateContent(0, kPcmuCodec, kH264Codec, &content);
536 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
537 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
538 content.set_extmap_allow_mixed_enum(offer_enum);
539 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
540 content.set_extmap_allow_mixed_enum(answer_enum);
541 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
542 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
543 }
544 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
545 // For a callee, SetRemoteContent() is called first with an offer and next
546 // SetLocalContent() is called with the answer.
547 CreateChannels(0, 0);
548 typename T::Content content;
549 CreateContent(0, kPcmuCodec, kH264Codec, &content);
550 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
551 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
552 content.set_extmap_allow_mixed_enum(offer_enum);
553 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
554 content.set_extmap_allow_mixed_enum(answer_enum);
555 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
556 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
557 }
558
henrike@webrtc.org28e20752013-07-10 00:45:36559 // Test that SetLocalContent and SetRemoteContent properly deals
560 // with an empty offer.
561 void TestSetContentsNullOffer() {
562 CreateChannels(0, 0);
563 typename T::Content content;
Steve Anton3828c062017-12-06 18:34:51564 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36565 CreateContent(0, kPcmuCodec, kH264Codec, &content);
566 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 18:34:51567 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36568 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 13:03:05569 EXPECT_TRUE(
570 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36571 }
572
573 // Test that SetLocalContent and SetRemoteContent properly set RTCP
574 // mux.
575 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-13 05:59:29576 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36577 typename T::Content content;
578 CreateContent(0, kPcmuCodec, kH264Codec, &content);
579 // Both sides agree on mux. Should no longer be a separate RTCP channel.
580 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 18:34:51581 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
582 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36583 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 18:34:51584 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36585 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 18:34:51586 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36587 }
588
henrike@webrtc.org28e20752013-07-10 00:45:36589 // Test that SetLocalContent and SetRemoteContent properly
590 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 18:34:51591 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36592 void TestChangeStreamParamsInContent() {
593 cricket::StreamParams stream1;
594 stream1.groupid = "group1";
595 stream1.id = "stream1";
596 stream1.ssrcs.push_back(kSsrc1);
597 stream1.cname = "stream1_cname";
598
599 cricket::StreamParams stream2;
600 stream2.groupid = "group1";
601 stream2.id = "stream2";
602 stream2.ssrcs.push_back(kSsrc2);
603 stream2.cname = "stream2_cname";
604
605 // Setup a call where channel 1 send |stream1| to channel 2.
606 CreateChannels(0, 0);
607 typename T::Content content1;
608 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
609 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 18:34:51610 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36611 EXPECT_TRUE(channel1_->Enable(true));
612 EXPECT_EQ(1u, media_channel1_->send_streams().size());
613
Steve Anton3828c062017-12-06 18:34:51614 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36615 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-25 05:51:21616 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36617
618 // Channel 2 do not send anything.
619 typename T::Content content2;
620 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 18:34:51621 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36622 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 18:34:51623 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36624 EXPECT_TRUE(channel2_->Enable(true));
625 EXPECT_EQ(0u, media_channel2_->send_streams().size());
626
Danil Chapovalov33b01f22016-05-11 17:55:27627 SendCustomRtp1(kSsrc1, 0);
628 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36629 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
630
631 // Let channel 2 update the content by sending |stream2| and enable SRTP.
632 typename T::Content content3;
Zhi Huange830e682018-03-30 17:48:35633 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36634 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 18:34:51635 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36636 ASSERT_EQ(1u, media_channel2_->send_streams().size());
637 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
638
Steve Anton3828c062017-12-06 18:34:51639 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36640 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
641 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
642
643 // Channel 1 replies but stop sending stream1.
644 typename T::Content content4;
Zhi Huange830e682018-03-30 17:48:35645 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 18:34:51646 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36647 EXPECT_EQ(0u, media_channel1_->send_streams().size());
648
Steve Anton3828c062017-12-06 18:34:51649 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36650 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
651
Danil Chapovalov33b01f22016-05-11 17:55:27652 SendCustomRtp2(kSsrc2, 0);
653 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36654 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
655 }
656
657 // Test that we only start playout and sending at the right times.
658 void TestPlayoutAndSendingStates() {
659 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 17:20:30660 if (verify_playout_) {
661 EXPECT_FALSE(media_channel1_->playout());
662 }
henrike@webrtc.org28e20752013-07-10 00:45:36663 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30664 if (verify_playout_) {
665 EXPECT_FALSE(media_channel2_->playout());
666 }
henrike@webrtc.org28e20752013-07-10 00:45:36667 EXPECT_FALSE(media_channel2_->sending());
668 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 17:20:30669 if (verify_playout_) {
670 EXPECT_FALSE(media_channel1_->playout());
671 }
henrike@webrtc.org28e20752013-07-10 00:45:36672 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54673 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 18:34:51674 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 17:20:30675 if (verify_playout_) {
676 EXPECT_TRUE(media_channel1_->playout());
677 }
henrike@webrtc.org28e20752013-07-10 00:45:36678 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54679 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 18:34:51680 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 17:20:30681 if (verify_playout_) {
682 EXPECT_FALSE(media_channel2_->playout());
683 }
henrike@webrtc.org28e20752013-07-10 00:45:36684 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54685 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 18:34:51686 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 17:20:30687 if (verify_playout_) {
688 EXPECT_FALSE(media_channel2_->playout());
689 }
henrike@webrtc.org28e20752013-07-10 00:45:36690 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-25 05:51:21691 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 17:20:30692 if (verify_playout_) {
693 EXPECT_TRUE(media_channel1_->playout());
694 }
henrike@webrtc.org28e20752013-07-10 00:45:36695 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30696 if (verify_playout_) {
697 EXPECT_FALSE(media_channel2_->playout());
698 }
henrike@webrtc.org28e20752013-07-10 00:45:36699 EXPECT_FALSE(media_channel2_->sending());
700 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 17:20:30701 if (verify_playout_) {
702 EXPECT_TRUE(media_channel2_->playout());
703 }
henrike@webrtc.org28e20752013-07-10 00:45:36704 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54705 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 18:34:51706 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 17:20:30707 if (verify_playout_) {
708 EXPECT_TRUE(media_channel1_->playout());
709 }
henrike@webrtc.org28e20752013-07-10 00:45:36710 EXPECT_TRUE(media_channel1_->sending());
711 }
712
henrike@webrtc.org28e20752013-07-10 00:45:36713 // Test that changing the MediaContentDirection in the local and remote
714 // session description start playout and sending at the right time.
715 void TestMediaContentDirection() {
716 CreateChannels(0, 0);
717 typename T::Content content1;
718 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
719 typename T::Content content2;
720 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
721 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 22:57:10722 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36723
724 EXPECT_TRUE(channel1_->Enable(true));
725 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 17:20:30726 if (verify_playout_) {
727 EXPECT_FALSE(media_channel1_->playout());
728 }
henrike@webrtc.org28e20752013-07-10 00:45:36729 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30730 if (verify_playout_) {
731 EXPECT_FALSE(media_channel2_->playout());
732 }
henrike@webrtc.org28e20752013-07-10 00:45:36733 EXPECT_FALSE(media_channel2_->sending());
734
Steve Anton3828c062017-12-06 18:34:51735 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
736 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
737 EXPECT_TRUE(
738 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
739 EXPECT_TRUE(
740 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-25 05:51:21741 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36742
Peter Boström34fbfff2015-09-24 17:20:30743 if (verify_playout_) {
744 EXPECT_TRUE(media_channel1_->playout());
745 }
henrike@webrtc.org28e20752013-07-10 00:45:36746 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 17:20:30747 if (verify_playout_) {
748 EXPECT_FALSE(media_channel2_->playout()); // local InActive
749 }
henrike@webrtc.org28e20752013-07-10 00:45:36750 EXPECT_FALSE(media_channel2_->sending()); // local InActive
751
752 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 22:57:10753 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 18:34:51754 EXPECT_TRUE(
755 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
756 EXPECT_TRUE(
757 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36758
Peter Boström34fbfff2015-09-24 17:20:30759 if (verify_playout_) {
760 EXPECT_TRUE(media_channel1_->playout());
761 }
henrike@webrtc.org28e20752013-07-10 00:45:36762 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30763 if (verify_playout_) {
764 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
765 }
henrike@webrtc.org28e20752013-07-10 00:45:36766 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
767
768 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 22:57:10769 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 18:34:51770 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
771 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36772
Peter Boström34fbfff2015-09-24 17:20:30773 if (verify_playout_) {
774 EXPECT_TRUE(media_channel1_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36776 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 17:20:30777 if (verify_playout_) {
778 EXPECT_TRUE(media_channel2_->playout());
779 }
henrike@webrtc.org28e20752013-07-10 00:45:36780 EXPECT_TRUE(media_channel2_->sending());
781 }
782
Honghai Zhangcc411c02016-03-30 00:27:21783 // Tests that when the transport channel signals a candidate pair change
784 // event, the media channel will receive a call on the network route change.
785 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 14:40:16786 static constexpr uint16_t kLocalNetId = 1;
787 static constexpr uint16_t kRemoteNetId = 2;
788 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 21:26:07789 // Ipv4(20) + UDP(8).
790 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 18:40:07791 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 17:55:27792
Zhi Huangcf6e24a2018-02-21 18:40:07793 CreateChannels(DTLS, DTLS);
794 SendInitiate();
Honghai Zhangcc411c02016-03-30 00:27:21795
Honghai Zhangcc411c02016-03-30 00:27:21796 typename T::MediaChannel* media_channel1 =
797 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 17:55:27798 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-30 00:27:21799
Zhi Huang942bc2e2017-11-13 21:26:07800 // Need to wait for the threads before calling
801 // |set_num_network_route_changes| because the network route would be set
802 // when creating the channel.
803 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 17:55:27804 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-25 05:51:21805 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 21:26:07806 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 17:55:27807 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 21:26:07808 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 14:47:43809 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 17:55:27810 });
811 WaitForThreads();
812 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-30 00:27:21813 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 17:55:27814 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-30 00:27:21815
eladalon05b07bb2017-08-24 14:40:16816 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 21:26:07817 rtc::NetworkRoute network_route;
818 network_route.connected = true;
Jonas Oreland71fda362020-03-20 15:11:56819 network_route.local =
820 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
821 network_route.remote =
822 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 21:26:07823 network_route.last_sent_packet_id = kLastPacketId;
824 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 17:55:27825 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 21:26:07826 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
827
Danil Chapovalov66cadcc2018-06-19 14:47:43828 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 17:55:27829 });
830 WaitForThreads();
831 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 10:16:19832 EXPECT_TRUE(media_channel1->last_network_route().connected);
833 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 15:11:56834 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 10:16:19835 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 15:11:56836 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 17:55:27837 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce73f2016-03-31 19:37:31838 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 18:40:07839 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 10:50:09840 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-30 00:27:21841 }
842
henrike@webrtc.org28e20752013-07-10 00:45:36843 // Test setting up a call.
844 void TestCallSetup() {
845 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 19:12:30846 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36847 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 17:20:30848 if (verify_playout_) {
849 EXPECT_TRUE(media_channel1_->playout());
850 }
henrike@webrtc.org28e20752013-07-10 00:45:36851 EXPECT_FALSE(media_channel1_->sending());
852 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 19:12:30853 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36854 EXPECT_TRUE(media_channel1_->sending());
855 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 17:20:30856 if (verify_playout_) {
857 EXPECT_TRUE(media_channel2_->playout());
858 }
henrike@webrtc.org28e20752013-07-10 00:45:36859 EXPECT_TRUE(media_channel2_->sending());
860 EXPECT_EQ(1U, media_channel2_->codecs().size());
861 }
862
863 // Test that we don't crash if packets are sent during call teardown
864 // when RTCP mux is enabled. This is a regression test against a specific
865 // race condition that would only occur when a RTCP packet was sent during
866 // teardown of a channel on which RTCP mux was enabled.
867 void TestCallTeardownRtcpMux() {
868 class LastWordMediaChannel : public T::MediaChannel {
869 public:
Fredrik Solenbergb071a192015-09-17 14:42:56870 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36871 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 14:26:07872 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
873 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36874 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
875 }
876 };
Mirko Bonadei317a1f02019-09-17 15:06:18877 CreateChannels(std::make_unique<LastWordMediaChannel>(),
878 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 09:40:33879 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36880 EXPECT_TRUE(SendInitiate());
881 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-25 05:51:21882 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36883 }
884
885 // Send voice RTP data to the other side and ensure it gets there.
886 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 17:48:35887 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36888 EXPECT_TRUE(SendInitiate());
889 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 23:13:08890 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
891 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 17:55:27892 SendRtp1();
893 SendRtp2();
894 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36895 EXPECT_TRUE(CheckRtp1());
896 EXPECT_TRUE(CheckRtp2());
897 EXPECT_TRUE(CheckNoRtp1());
898 EXPECT_TRUE(CheckNoRtp2());
899 }
900
Danil Chapovalovdae07ba2016-05-13 23:43:50901 void TestDeinit() {
deadbeefac22f702017-01-13 05:59:29902 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-13 23:43:50903 EXPECT_TRUE(SendInitiate());
904 EXPECT_TRUE(SendAccept());
905 SendRtp1();
906 SendRtp2();
Danil Chapovalovdae07ba2016-05-13 23:43:50907 // Do not wait, destroy channels.
908 channel1_.reset(nullptr);
909 channel2_.reset(nullptr);
910 }
911
Zhi Huange830e682018-03-30 17:48:35912 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
913 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 19:12:30914 EXPECT_FALSE(channel1_->srtp_active());
915 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36916 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 17:55:27917 WaitForThreads();
918 EXPECT_TRUE(channel1_->writable());
919 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36920 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 19:12:30921 EXPECT_TRUE(channel1_->srtp_active());
922 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 17:55:27923 SendRtp1();
924 SendRtp2();
Danil Chapovalov33b01f22016-05-11 17:55:27925 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36926 EXPECT_TRUE(CheckRtp1());
927 EXPECT_TRUE(CheckRtp2());
928 EXPECT_TRUE(CheckNoRtp1());
929 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36930 }
931
932 // Test that we can send and receive early media when a provisional answer is
933 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
934 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 13:03:05935 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36936
Yves Gerey665174f2018-06-19 13:03:05937 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
938 EXPECT_TRUE(SendOffer());
939 EXPECT_TRUE(SendProvisionalAnswer());
940 EXPECT_TRUE(channel1_->srtp_active());
941 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 23:13:08942 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
943 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 13:03:05944 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 13:03:05945 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
946 WaitForThreads();
Yves Gerey665174f2018-06-19 13:03:05947 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36948
Yves Gerey665174f2018-06-19 13:03:05949 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 13:03:05950 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
951 WaitForThreads();
Yves Gerey665174f2018-06-19 13:03:05952 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36953
Yves Gerey665174f2018-06-19 13:03:05954 // Complete call setup and ensure everything is still OK.
955 EXPECT_TRUE(SendFinalAnswer());
956 EXPECT_TRUE(channel1_->srtp_active());
957 EXPECT_TRUE(channel2_->srtp_active());
Yves Gerey665174f2018-06-19 13:03:05958 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 13:03:05959 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
960 WaitForThreads();
Yves Gerey665174f2018-06-19 13:03:05961 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 13:03:05962 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36963 }
964
965 // Test that we properly send RTP without SRTP from a thread.
966 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-13 05:59:29967 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36968 EXPECT_TRUE(SendInitiate());
969 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 17:55:27970 ScopedCallThread send_rtp1([this] { SendRtp1(); });
971 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 17:49:53972 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 17:55:27973 WaitForThreads(involved_threads);
974 EXPECT_TRUE(CheckRtp1());
975 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36976 EXPECT_TRUE(CheckNoRtp1());
977 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36978 }
979
henrike@webrtc.org28e20752013-07-10 00:45:36980 // Test that the mediachannel retains its sending state after the transport
981 // becomes non-writable.
982 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 17:48:35983 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36984 EXPECT_TRUE(SendInitiate());
985 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 23:13:08986 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
987 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 17:55:27988 SendRtp1();
989 SendRtp2();
990 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36991 EXPECT_TRUE(CheckRtp1());
992 EXPECT_TRUE(CheckRtp2());
993 EXPECT_TRUE(CheckNoRtp1());
994 EXPECT_TRUE(CheckNoRtp2());
995
wu@webrtc.org97077a32013-10-25 21:18:33996 // Lose writability, which should fail.
deadbeeff5346592017-01-25 05:51:21997 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
998 fake_rtp_dtls_transport1_->SetWritable(false);
999 });
Danil Chapovalov33b01f22016-05-11 17:55:271000 SendRtp1();
1001 SendRtp2();
1002 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361003 EXPECT_TRUE(CheckRtp1());
1004 EXPECT_TRUE(CheckNoRtp2());
1005
1006 // Regain writability
deadbeeff5346592017-01-25 05:51:211007 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1008 fake_rtp_dtls_transport1_->SetWritable(true);
1009 });
henrike@webrtc.org28e20752013-07-10 00:45:361010 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 17:55:271011 SendRtp1();
1012 SendRtp2();
1013 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361014 EXPECT_TRUE(CheckRtp1());
1015 EXPECT_TRUE(CheckRtp2());
1016 EXPECT_TRUE(CheckNoRtp1());
1017 EXPECT_TRUE(CheckNoRtp2());
1018
1019 // Lose writability completely
deadbeeff5346592017-01-25 05:51:211020 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1021 bool asymmetric = true;
1022 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1023 });
henrike@webrtc.org28e20752013-07-10 00:45:361024 EXPECT_TRUE(media_channel1_->sending());
1025
wu@webrtc.org97077a32013-10-25 21:18:331026 // Should fail also.
Danil Chapovalov33b01f22016-05-11 17:55:271027 SendRtp1();
1028 SendRtp2();
1029 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361030 EXPECT_TRUE(CheckRtp1());
1031 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-20 00:54:251032 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:361033
1034 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 21:17:271035 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-25 05:51:211036 bool asymmetric = true;
1037 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1038 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 21:17:271039 });
henrike@webrtc.org28e20752013-07-10 00:45:361040 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 17:55:271041 SendRtp1();
1042 SendRtp2();
1043 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361044 EXPECT_TRUE(CheckRtp1());
1045 EXPECT_TRUE(CheckRtp2());
1046 EXPECT_TRUE(CheckNoRtp1());
1047 EXPECT_TRUE(CheckNoRtp2());
1048 }
1049
Yves Gerey665174f2018-06-19 13:03:051050 void SendBundleToBundle(const int* pl_types,
1051 int len,
1052 bool rtcp_mux,
1053 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:081054 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:361055 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:081056 // Only pl_type1 was added to the bundle filter for both |channel1_|
1057 // and |channel2_|.
1058 int pl_type1 = pl_types[0];
1059 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-13 05:59:291060 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 17:48:351061 if (secure)
1062 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:081063 if (rtcp_mux) {
1064 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:081065 }
1066 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:361067 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:361068 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:081069
1070 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 17:55:271071 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1072 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1073 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:081074 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:081075 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1076 EXPECT_TRUE(CheckNoRtp1());
1077 EXPECT_TRUE(CheckNoRtp2());
1078
Zhi Huang365381f2018-04-13 23:44:341079 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1080 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 17:55:271081 WaitForThreads();
Zhi Huang365381f2018-04-13 23:44:341082 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1083 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:361084 }
1085
henrike@webrtc.org28e20752013-07-10 00:45:361086 void TestSetContentFailure() {
1087 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:361088
Peter Thatchera6d24442015-07-10 04:26:361089 std::string err;
Steve Anton18ee1d52017-09-11 18:32:351090 std::unique_ptr<typename T::Content> content(
1091 CreateMediaContentWithStream(1));
1092
henrike@webrtc.org28e20752013-07-10 00:45:361093 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 18:32:351094 EXPECT_FALSE(
Steve Anton3828c062017-12-06 18:34:511095 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 18:32:351096 EXPECT_FALSE(
Steve Anton3828c062017-12-06 18:34:511097 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361098
henrike@webrtc.org28e20752013-07-10 00:45:361099 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 18:32:351100 EXPECT_FALSE(
Steve Anton3828c062017-12-06 18:34:511101 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 18:32:351102
henrike@webrtc.org28e20752013-07-10 00:45:361103 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 18:32:351104 EXPECT_FALSE(
Steve Anton3828c062017-12-06 18:34:511105 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361106 }
1107
1108 void TestSendTwoOffers() {
1109 CreateChannels(0, 0);
1110
Peter Thatchera6d24442015-07-10 04:26:361111 std::string err;
Steve Anton18ee1d52017-09-11 18:32:351112 std::unique_ptr<typename T::Content> content1(
1113 CreateMediaContentWithStream(1));
1114 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511115 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361116 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1117
Steve Anton18ee1d52017-09-11 18:32:351118 std::unique_ptr<typename T::Content> content2(
1119 CreateMediaContentWithStream(2));
1120 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511121 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361122 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1123 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1124 }
1125
1126 void TestReceiveTwoOffers() {
1127 CreateChannels(0, 0);
1128
Peter Thatchera6d24442015-07-10 04:26:361129 std::string err;
Steve Anton18ee1d52017-09-11 18:32:351130 std::unique_ptr<typename T::Content> content1(
1131 CreateMediaContentWithStream(1));
1132 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511133 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361134 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1135
Steve Anton18ee1d52017-09-11 18:32:351136 std::unique_ptr<typename T::Content> content2(
1137 CreateMediaContentWithStream(2));
1138 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511139 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361140 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1141 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1142 }
1143
1144 void TestSendPrAnswer() {
1145 CreateChannels(0, 0);
1146
Peter Thatchera6d24442015-07-10 04:26:361147 std::string err;
1148 // Receive offer
Steve Anton18ee1d52017-09-11 18:32:351149 std::unique_ptr<typename T::Content> content1(
1150 CreateMediaContentWithStream(1));
1151 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511152 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361153 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1154
Peter Thatchera6d24442015-07-10 04:26:361155 // Send PR answer
Steve Anton18ee1d52017-09-11 18:32:351156 std::unique_ptr<typename T::Content> content2(
1157 CreateMediaContentWithStream(2));
1158 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511159 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361160 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1161 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1162
Peter Thatchera6d24442015-07-10 04:26:361163 // Send answer
Steve Anton18ee1d52017-09-11 18:32:351164 std::unique_ptr<typename T::Content> content3(
1165 CreateMediaContentWithStream(3));
1166 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511167 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361168 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1169 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1170 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1171 }
1172
1173 void TestReceivePrAnswer() {
1174 CreateChannels(0, 0);
1175
Peter Thatchera6d24442015-07-10 04:26:361176 std::string err;
1177 // Send offer
Steve Anton18ee1d52017-09-11 18:32:351178 std::unique_ptr<typename T::Content> content1(
1179 CreateMediaContentWithStream(1));
1180 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511181 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361182 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1183
Peter Thatchera6d24442015-07-10 04:26:361184 // Receive PR answer
Steve Anton18ee1d52017-09-11 18:32:351185 std::unique_ptr<typename T::Content> content2(
1186 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 18:34:511187 EXPECT_TRUE(
1188 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361189 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1190 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1191
Peter Thatchera6d24442015-07-10 04:26:361192 // Receive answer
Steve Anton18ee1d52017-09-11 18:32:351193 std::unique_ptr<typename T::Content> content3(
1194 CreateMediaContentWithStream(3));
1195 EXPECT_TRUE(
Steve Anton3828c062017-12-06 18:34:511196 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:361197 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1198 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1199 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1200 }
1201
zstein56162b92017-04-24 23:54:351202 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-13 05:59:291203 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:361204 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 17:55:271205
zstein56162b92017-04-24 23:54:351206 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 17:55:271207 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361208 EXPECT_TRUE(media_channel1_->ready_to_send());
1209
zstein56162b92017-04-24 23:54:351210 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 17:55:271211 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:361212 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:361213 }
1214
skvladdc1c62c2016-03-17 02:07:431215 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1216 typename T::Content content;
1217 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1218 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 18:34:511219 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-17 02:07:431220 }
1221
Danil Chapovalov66cadcc2018-06-19 14:47:431222 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-17 02:07:431223 webrtc::RtpParameters parameters;
1224 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 20:38:121225 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-17 02:07:431226 parameters.encodings.push_back(encoding);
1227 return parameters;
1228 }
1229
1230 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 14:47:431231 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-17 02:07:431232 EXPECT_EQ(1UL, parameters.encodings.size());
1233 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1234 }
1235
1236 void DefaultMaxBitrateIsUnlimited() {
1237 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 18:34:511238 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1239 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-17 02:07:431240 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 20:09:011241 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 14:47:431242 absl::nullopt);
skvladdc1c62c2016-03-17 02:07:431243 }
1244
Zhi Huange830e682018-03-30 17:48:351245 // Test that when a channel gets new RtpTransport with a call to
1246 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1247 // with the options on the new one.
1248
Steve Anton8a63f782017-10-23 20:08:531249 // For example, audio and video may use separate socket options, but initially
1250 // be unbundled, then later become bundled. When this happens, their preferred
1251 // socket options should be merged to the underlying transport they share.
1252 void SocketOptionsMergedOnSetTransport() {
1253 constexpr int kSndBufSize = 4000;
1254 constexpr int kRcvBufSize = 8000;
1255
Zhi Huange830e682018-03-30 17:48:351256 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 20:08:531257
1258 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1259 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1260 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1261 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1262
Zhi Huange830e682018-03-30 17:48:351263 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 23:13:081264 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 17:48:351265 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 20:08:531266
1267 int option_val;
Bjorn A Mellem3a1b9272019-05-24 23:13:081268 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1269 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 20:08:531270 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 23:13:081271 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1272 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 20:08:531273 EXPECT_EQ(kRcvBufSize, option_val);
1274 }
1275
Amit Hilbuchbcd39d42019-01-26 01:13:561276 void CreateSimulcastContent(const std::vector<std::string>& rids,
1277 typename T::Content* content) {
1278 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 10:36:351279 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-26 01:13:561280 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1281 }
1282
1283 StreamParams stream;
1284 stream.set_rids(rid_descriptions);
1285 CreateContent(0, kPcmuCodec, kH264Codec, content);
1286 // This is for unified plan, so there can be only one StreamParams.
1287 content->mutable_streams().clear();
1288 content->AddStream(stream);
1289 }
1290
1291 void VerifySimulcastStreamParams(const StreamParams& expected,
1292 const typename T::Channel* channel) {
1293 const std::vector<StreamParams>& streams = channel->local_streams();
1294 ASSERT_EQ(1u, streams.size());
1295 const StreamParams& result = streams[0];
1296 EXPECT_EQ(expected.rids(), result.rids());
1297 EXPECT_TRUE(result.has_ssrcs());
1298 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1299 std::vector<uint32_t> primary_ssrcs;
1300 result.GetPrimarySsrcs(&primary_ssrcs);
1301 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1302 }
1303
1304 void TestUpdateLocalStreamsWithSimulcast() {
1305 CreateChannels(0, 0);
1306 typename T::Content content1, content2, content3;
1307 CreateSimulcastContent({"f", "h", "q"}, &content1);
1308 EXPECT_TRUE(
1309 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1310 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1311 StreamParams stream1 = channel1_->local_streams()[0];
1312
1313 // Create a similar offer. SetLocalContent should not remove and add.
1314 CreateSimulcastContent({"f", "h", "q"}, &content2);
1315 EXPECT_TRUE(
1316 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1317 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1318 StreamParams stream2 = channel1_->local_streams()[0];
1319 // Check that the streams are identical (SSRCs didn't change).
1320 EXPECT_EQ(stream1, stream2);
1321
1322 // Create third offer that has same RIDs in different order.
1323 CreateSimulcastContent({"f", "q", "h"}, &content3);
1324 EXPECT_TRUE(
1325 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1326 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1327 }
1328
henrike@webrtc.org28e20752013-07-10 00:45:361329 protected:
Danil Chapovalov33b01f22016-05-11 17:55:271330 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1331 static void ProcessThreadQueue(rtc::Thread* thread) {
1332 RTC_DCHECK(thread->IsCurrent());
1333 while (!thread->empty()) {
1334 thread->ProcessMessages(0);
1335 }
1336 }
1337 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1338 // |threads| and current thread post packets to network thread.
1339 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 21:17:271340 thread->Invoke<void>(RTC_FROM_HERE,
1341 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 17:55:271342 }
1343 ProcessThreadQueue(rtc::Thread::Current());
1344 // Network thread move them around and post back to worker = current thread.
1345 if (!network_thread_->IsCurrent()) {
1346 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 21:17:271347 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 17:55:271348 }
1349 // Worker thread = current Thread process received messages.
1350 ProcessThreadQueue(rtc::Thread::Current());
1351 }
Peter Boström34fbfff2015-09-24 17:20:301352 // TODO(pbos): Remove playout from all media channels and let renderers mute
1353 // themselves.
1354 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 17:55:271355 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1356 rtc::Thread* network_thread_;
deadbeeff5346592017-01-25 05:51:211357 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1358 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1359 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1360 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1361 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1362 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1363 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1364 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 17:48:351365 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1366 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1367 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:361368 cricket::FakeMediaEngine media_engine_;
1369 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-25 05:51:211370 typename T::MediaChannel* media_channel1_ = nullptr;
1371 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 22:18:211372 std::unique_ptr<typename T::Channel> channel1_;
1373 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:361374 typename T::Content local_media_content1_;
1375 typename T::Content local_media_content2_;
1376 typename T::Content remote_media_content1_;
1377 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:361378 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 17:55:271379 rtc::Buffer rtp_packet_;
1380 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-30 00:27:211381 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-26 01:13:561382 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:361383};
1384
Yves Gerey665174f2018-06-19 13:03:051385template <>
Sebastian Jansson1b83a9e2019-09-18 16:22:121386std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1387 rtc::Thread* worker_thread,
1388 rtc::Thread* network_thread,
1389 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1390 webrtc::RtpTransportInternal* rtp_transport,
1391 int flags) {
Sebastian Jansson1b83a9e2019-09-18 16:22:121392 rtc::Thread* signaling_thread = rtc::Thread::Current();
1393 auto channel = std::make_unique<cricket::VoiceChannel>(
1394 worker_thread, network_thread, signaling_thread, std::move(ch),
1395 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1396 &ssrc_generator_);
Niels Möller2a707032020-06-16 14:39:131397 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 16:22:121398 return channel;
1399}
1400
1401template <>
henrike@webrtc.org28e20752013-07-10 00:45:361402void ChannelTest<VoiceTraits>::CreateContent(
1403 int flags,
1404 const cricket::AudioCodec& audio_codec,
1405 const cricket::VideoCodec& video_codec,
1406 cricket::AudioContentDescription* audio) {
1407 audio->AddCodec(audio_codec);
1408 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:361409}
1410
Yves Gerey665174f2018-06-19 13:03:051411template <>
henrike@webrtc.org28e20752013-07-10 00:45:361412void ChannelTest<VoiceTraits>::CopyContent(
1413 const cricket::AudioContentDescription& source,
1414 cricket::AudioContentDescription* audio) {
1415 *audio = source;
1416}
1417
Yves Gerey665174f2018-06-19 13:03:051418template <>
henrike@webrtc.org28e20752013-07-10 00:45:361419bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1420 const cricket::AudioCodec& c2) {
1421 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 13:03:051422 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:361423}
1424
Peter Boström0c4e06b2015-10-07 10:23:211425template <>
henrike@webrtc.org28e20752013-07-10 00:45:361426void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 10:23:211427 uint32_t ssrc,
1428 int flags,
1429 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:361430 audio->AddLegacyStream(ssrc);
1431}
1432
Danil Chapovalov33b01f22016-05-11 17:55:271433class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:361434 public:
solenberg1dd98f32015-09-10 08:57:141435 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 17:55:271436 VoiceChannelSingleThreadTest()
1437 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1438};
1439
1440class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1441 public:
1442 typedef ChannelTest<VoiceTraits> Base;
1443 VoiceChannelDoubleThreadTest()
1444 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:361445};
1446
jbauch5869f502017-06-29 19:31:361447class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 13:03:051448 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 19:31:361449 public:
1450 typedef ChannelTest<VoiceTraits> Base;
1451 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 13:03:051452 : Base(true,
1453 kPcmuFrameWithExtensions,
1454 kRtcpReport,
1455 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 19:31:361456};
1457
1458class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 13:03:051459 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 19:31:361460 public:
1461 typedef ChannelTest<VoiceTraits> Base;
1462 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 13:03:051463 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1464 }
jbauch5869f502017-06-29 19:31:361465};
1466
henrike@webrtc.org28e20752013-07-10 00:45:361467// override to add NULL parameter
deadbeefcbecd352015-09-23 18:50:271468template <>
Steve Anton8699a322017-11-06 23:53:331469std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 17:55:271470 rtc::Thread* worker_thread,
1471 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 23:53:331472 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 17:48:351473 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 12:20:321474 int flags) {
deadbeeff5346592017-01-25 05:51:211475 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 15:06:181476 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 23:53:331477 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-26 01:13:561478 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1479 &ssrc_generator_);
Niels Möller2a707032020-06-16 14:39:131480 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:361481 return channel;
1482}
1483
Yves Gerey665174f2018-06-19 13:03:051484template <>
henrike@webrtc.org28e20752013-07-10 00:45:361485void ChannelTest<VideoTraits>::CreateContent(
1486 int flags,
1487 const cricket::AudioCodec& audio_codec,
1488 const cricket::VideoCodec& video_codec,
1489 cricket::VideoContentDescription* video) {
1490 video->AddCodec(video_codec);
1491 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:361492}
1493
Yves Gerey665174f2018-06-19 13:03:051494template <>
henrike@webrtc.org28e20752013-07-10 00:45:361495void ChannelTest<VideoTraits>::CopyContent(
1496 const cricket::VideoContentDescription& source,
1497 cricket::VideoContentDescription* video) {
1498 *video = source;
1499}
1500
Yves Gerey665174f2018-06-19 13:03:051501template <>
henrike@webrtc.org28e20752013-07-10 00:45:361502bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1503 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 08:21:161504 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:361505}
1506
Peter Boström0c4e06b2015-10-07 10:23:211507template <>
henrike@webrtc.org28e20752013-07-10 00:45:361508void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 10:23:211509 uint32_t ssrc,
1510 int flags,
1511 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:361512 video->AddLegacyStream(ssrc);
1513}
1514
Danil Chapovalov33b01f22016-05-11 17:55:271515class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:361516 public:
solenberg1dd98f32015-09-10 08:57:141517 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 17:55:271518 VideoChannelSingleThreadTest()
1519 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:361520};
1521
Danil Chapovalov33b01f22016-05-11 17:55:271522class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1523 public:
1524 typedef ChannelTest<VideoTraits> Base;
1525 VideoChannelDoubleThreadTest()
1526 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1527};
henrike@webrtc.org28e20752013-07-10 00:45:361528
Kári Tristan Helgason8b35df72017-09-25 12:46:431529TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:361530 Base::TestInit();
1531 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1532 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1533}
1534
Danil Chapovalovdae07ba2016-05-13 23:43:501535TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1536 Base::TestDeinit();
1537}
1538
Danil Chapovalov33b01f22016-05-11 17:55:271539TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:361540 Base::TestSetContents();
1541}
1542
Johannes Kron9190b822018-10-29 10:22:051543TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1544 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1545}
1546
1547TEST_F(VoiceChannelSingleThreadTest,
1548 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1549 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1550}
1551
1552TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1553 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1554}
1555
1556TEST_F(VoiceChannelSingleThreadTest,
1557 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1558 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1559}
1560
Danil Chapovalov33b01f22016-05-11 17:55:271561TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:361562 Base::TestSetContentsNullOffer();
1563}
1564
Danil Chapovalov33b01f22016-05-11 17:55:271565TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:361566 Base::TestSetContentsRtcpMux();
1567}
1568
Danil Chapovalov33b01f22016-05-11 17:55:271569TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361570 Base::TestSetContentsRtcpMux();
1571}
1572
Danil Chapovalov33b01f22016-05-11 17:55:271573TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:361574 Base::TestChangeStreamParamsInContent();
1575}
1576
Danil Chapovalov33b01f22016-05-11 17:55:271577TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:361578 Base::TestPlayoutAndSendingStates();
1579}
1580
Danil Chapovalov33b01f22016-05-11 17:55:271581TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:361582 Base::TestMediaContentDirection();
1583}
1584
Danil Chapovalov33b01f22016-05-11 17:55:271585TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-30 00:27:211586 Base::TestNetworkRouteChanges();
1587}
1588
Danil Chapovalov33b01f22016-05-11 17:55:271589TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:361590 Base::TestCallSetup();
1591}
1592
Danil Chapovalov33b01f22016-05-11 17:55:271593TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:361594 Base::TestCallTeardownRtcpMux();
1595}
1596
Danil Chapovalov33b01f22016-05-11 17:55:271597TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:361598 Base::SendRtpToRtp();
1599}
1600
Danil Chapovalov33b01f22016-05-11 17:55:271601TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 17:48:351602 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:361603}
1604
Danil Chapovalov33b01f22016-05-11 17:55:271605TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 17:48:351606 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-25 05:51:211607}
1608
Danil Chapovalov33b01f22016-05-11 17:55:271609TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:361610 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1611}
1612
Danil Chapovalov33b01f22016-05-11 17:55:271613TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:361614 Base::SendRtpToRtpOnThread();
1615}
1616
Danil Chapovalov33b01f22016-05-11 17:55:271617TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:361618 Base::SendWithWritabilityLoss();
1619}
1620
Danil Chapovalov33b01f22016-05-11 17:55:271621TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:361622 Base::TestSetContentFailure();
1623}
1624
Danil Chapovalov33b01f22016-05-11 17:55:271625TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:361626 Base::TestSendTwoOffers();
1627}
1628
Danil Chapovalov33b01f22016-05-11 17:55:271629TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:361630 Base::TestReceiveTwoOffers();
1631}
1632
Danil Chapovalov33b01f22016-05-11 17:55:271633TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361634 Base::TestSendPrAnswer();
1635}
1636
Danil Chapovalov33b01f22016-05-11 17:55:271637TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361638 Base::TestReceivePrAnswer();
1639}
1640
zstein56162b92017-04-24 23:54:351641TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1642 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:361643}
1644
Danil Chapovalov33b01f22016-05-11 17:55:271645TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-11 07:44:301646 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:361647}
1648
Danil Chapovalov33b01f22016-05-11 17:55:271649TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-11 07:44:301650 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:081651}
1652
Danil Chapovalov33b01f22016-05-11 17:55:271653TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-11 07:44:301654 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:081655}
1656
Danil Chapovalov33b01f22016-05-11 17:55:271657TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-11 07:44:301658 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:361659}
1660
Danil Chapovalov33b01f22016-05-11 17:55:271661TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-08 05:59:221662 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-17 02:07:431663}
1664
Steve Anton8a63f782017-10-23 20:08:531665TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1666 Base::SocketOptionsMergedOnSetTransport();
1667}
1668
Danil Chapovalov33b01f22016-05-11 17:55:271669// VoiceChannelDoubleThreadTest
1670TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:361671 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 17:55:271672 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1673 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:361674}
1675
Danil Chapovalovdae07ba2016-05-13 23:43:501676TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1677 Base::TestDeinit();
1678}
1679
Danil Chapovalov33b01f22016-05-11 17:55:271680TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:361681 Base::TestSetContents();
1682}
1683
Johannes Kron9190b822018-10-29 10:22:051684TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1685 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1686}
1687
1688TEST_F(VoiceChannelDoubleThreadTest,
1689 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1690 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1691}
1692
1693TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1694 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1695}
1696
1697TEST_F(VoiceChannelDoubleThreadTest,
1698 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1699 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1700}
1701
Danil Chapovalov33b01f22016-05-11 17:55:271702TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:361703 Base::TestSetContentsNullOffer();
1704}
1705
Danil Chapovalov33b01f22016-05-11 17:55:271706TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:361707 Base::TestSetContentsRtcpMux();
1708}
1709
Danil Chapovalov33b01f22016-05-11 17:55:271710TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361711 Base::TestSetContentsRtcpMux();
1712}
1713
Danil Chapovalov33b01f22016-05-11 17:55:271714TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:361715 Base::TestChangeStreamParamsInContent();
1716}
1717
Danil Chapovalov33b01f22016-05-11 17:55:271718TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:361719 Base::TestPlayoutAndSendingStates();
1720}
1721
Danil Chapovalov33b01f22016-05-11 17:55:271722TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1723 Base::TestMediaContentDirection();
1724}
1725
1726TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1727 Base::TestNetworkRouteChanges();
1728}
1729
1730TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1731 Base::TestCallSetup();
1732}
1733
1734TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1735 Base::TestCallTeardownRtcpMux();
1736}
1737
1738TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1739 Base::SendRtpToRtp();
1740}
1741
Danil Chapovalov33b01f22016-05-11 17:55:271742TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 17:48:351743 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 17:55:271744}
1745
1746TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 17:48:351747 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-25 05:51:211748}
1749
Danil Chapovalov33b01f22016-05-11 17:55:271750TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1751 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1752}
1753
1754TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1755 Base::SendRtpToRtpOnThread();
1756}
1757
Danil Chapovalov33b01f22016-05-11 17:55:271758TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1759 Base::SendWithWritabilityLoss();
1760}
1761
Danil Chapovalov33b01f22016-05-11 17:55:271762TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1763 Base::TestSetContentFailure();
1764}
1765
1766TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1767 Base::TestSendTwoOffers();
1768}
1769
1770TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1771 Base::TestReceiveTwoOffers();
1772}
1773
1774TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1775 Base::TestSendPrAnswer();
1776}
1777
1778TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1779 Base::TestReceivePrAnswer();
1780}
1781
zstein56162b92017-04-24 23:54:351782TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1783 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 17:55:271784}
1785
Danil Chapovalov33b01f22016-05-11 17:55:271786TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1787 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1788}
1789
1790TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1791 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1792}
1793
1794TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1795 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1799 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1800}
1801
1802TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1803 Base::DefaultMaxBitrateIsUnlimited();
1804}
1805
Steve Anton8a63f782017-10-23 20:08:531806TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1807 Base::SocketOptionsMergedOnSetTransport();
1808}
1809
Danil Chapovalov33b01f22016-05-11 17:55:271810// VideoChannelSingleThreadTest
1811TEST_F(VideoChannelSingleThreadTest, TestInit) {
1812 Base::TestInit();
1813}
1814
Danil Chapovalovdae07ba2016-05-13 23:43:501815TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1816 Base::TestDeinit();
1817}
1818
Danil Chapovalov33b01f22016-05-11 17:55:271819TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1820 Base::TestSetContents();
1821}
1822
Johannes Kron9190b822018-10-29 10:22:051823TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1824 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1825}
1826
1827TEST_F(VideoChannelSingleThreadTest,
1828 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1829 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1830}
1831
1832TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1833 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1834}
1835
1836TEST_F(VideoChannelSingleThreadTest,
1837 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1838 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1839}
1840
Danil Chapovalov33b01f22016-05-11 17:55:271841TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1842 Base::TestSetContentsNullOffer();
1843}
1844
1845TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1846 Base::TestSetContentsRtcpMux();
1847}
1848
1849TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1850 Base::TestSetContentsRtcpMux();
1851}
1852
Danil Chapovalov33b01f22016-05-11 17:55:271853TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1854 Base::TestChangeStreamParamsInContent();
1855}
1856
1857TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1858 Base::TestPlayoutAndSendingStates();
1859}
1860
Danil Chapovalov33b01f22016-05-11 17:55:271861TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:361862 Base::TestMediaContentDirection();
1863}
1864
Danil Chapovalov33b01f22016-05-11 17:55:271865TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-30 00:27:211866 Base::TestNetworkRouteChanges();
1867}
1868
Danil Chapovalov33b01f22016-05-11 17:55:271869TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:361870 Base::TestCallSetup();
1871}
1872
Danil Chapovalov33b01f22016-05-11 17:55:271873TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:361874 Base::TestCallTeardownRtcpMux();
1875}
1876
Danil Chapovalov33b01f22016-05-11 17:55:271877TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:361878 Base::SendRtpToRtp();
1879}
1880
Danil Chapovalov33b01f22016-05-11 17:55:271881TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 17:48:351882 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:361883}
1884
Danil Chapovalov33b01f22016-05-11 17:55:271885TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 17:48:351886 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:361887}
1888
Danil Chapovalov33b01f22016-05-11 17:55:271889TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:361890 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1891}
1892
Danil Chapovalov33b01f22016-05-11 17:55:271893TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:361894 Base::SendRtpToRtpOnThread();
1895}
1896
Danil Chapovalov33b01f22016-05-11 17:55:271897TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:361898 Base::SendWithWritabilityLoss();
1899}
1900
Danil Chapovalov33b01f22016-05-11 17:55:271901TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:361902 Base::TestSetContentFailure();
1903}
1904
Danil Chapovalov33b01f22016-05-11 17:55:271905TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:361906 Base::TestSendTwoOffers();
1907}
1908
Danil Chapovalov33b01f22016-05-11 17:55:271909TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:361910 Base::TestReceiveTwoOffers();
1911}
1912
Danil Chapovalov33b01f22016-05-11 17:55:271913TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361914 Base::TestSendPrAnswer();
1915}
1916
Danil Chapovalov33b01f22016-05-11 17:55:271917TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:361918 Base::TestReceivePrAnswer();
1919}
1920
Danil Chapovalov33b01f22016-05-11 17:55:271921TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-11 07:44:301922 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:361923}
1924
Danil Chapovalov33b01f22016-05-11 17:55:271925TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-11 07:44:301926 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:081927}
1928
Danil Chapovalov33b01f22016-05-11 17:55:271929TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-11 07:44:301930 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:081931}
1932
Danil Chapovalov33b01f22016-05-11 17:55:271933TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-11 07:44:301934 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:361935}
1936
zstein56162b92017-04-24 23:54:351937TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1938 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:361939}
1940
Danil Chapovalov33b01f22016-05-11 17:55:271941TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-17 02:07:431942 Base::DefaultMaxBitrateIsUnlimited();
1943}
1944
Steve Anton8a63f782017-10-23 20:08:531945TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1946 Base::SocketOptionsMergedOnSetTransport();
1947}
1948
Amit Hilbuchbcd39d42019-01-26 01:13:561949TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1950 Base::TestUpdateLocalStreamsWithSimulcast();
1951}
1952
Mirta Dvornicic479a3c02019-06-04 13:38:501953TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1954 const cricket::VideoCodec kVp8Codec(97, "VP8");
1955 cricket::VideoCodec vp9_codec(98, "VP9");
1956 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1957 cricket::VideoContentDescription video;
1958 video.set_codecs({kVp8Codec, vp9_codec});
1959
1960 CreateChannels(0, 0);
1961
1962 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
1963 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
1964 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
1965 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
1966 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
1967 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
1968 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
1969 cricket::kPacketizationParamRaw);
1970}
1971
1972TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
1973 const cricket::VideoCodec kVp8Codec(97, "VP8");
1974 cricket::VideoCodec vp9_codec(98, "VP9");
1975 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1976 cricket::VideoContentDescription video;
1977 video.set_codecs({kVp8Codec, vp9_codec});
1978
1979 CreateChannels(0, 0);
1980
1981 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
1982 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
1983 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
1984 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
1985 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
1986 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
1987 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
1988 cricket::kPacketizationParamRaw);
1989}
1990
1991TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
1992 const cricket::VideoCodec kVp8Codec(97, "VP8");
1993 cricket::VideoCodec vp9_codec(98, "VP9");
1994 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1995 cricket::VideoContentDescription video;
1996 video.set_codecs({kVp8Codec, vp9_codec});
1997
1998 CreateChannels(0, 0);
1999
2000 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2001 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2002 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2003 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2004 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2005 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2006 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2007 cricket::kPacketizationParamRaw);
2008 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2009 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2010 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2011 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2012 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2013 cricket::kPacketizationParamRaw);
2014}
2015
2016TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2017 const cricket::VideoCodec kLocalCodec(98, "VP8");
2018 cricket::VideoCodec remote_codec(99, "VP8");
2019 remote_codec.packetization = cricket::kPacketizationParamRaw;
2020 cricket::VideoContentDescription local_video;
2021 local_video.set_codecs({kLocalCodec});
2022 cricket::VideoContentDescription remote_video;
2023 remote_video.set_codecs({remote_codec});
2024
2025 CreateChannels(0, 0);
2026
2027 EXPECT_TRUE(
2028 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2029 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2030 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2031 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2032 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2033 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2034}
2035
2036TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2037 cricket::VideoCodec local_codec(98, "VP8");
2038 local_codec.packetization = cricket::kPacketizationParamRaw;
2039 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2040 cricket::VideoContentDescription local_video;
2041 local_video.set_codecs({local_codec});
2042 cricket::VideoContentDescription remote_video;
2043 remote_video.set_codecs({kRemoteCodec});
2044
2045 CreateChannels(0, 0);
2046
2047 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2048 EXPECT_TRUE(
2049 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2050 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2051 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2052 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2053 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2054}
2055
2056TEST_F(VideoChannelSingleThreadTest,
2057 TestSetRemoteAnswerWithInvalidPacketization) {
2058 cricket::VideoCodec local_codec(98, "VP8");
2059 local_codec.packetization = cricket::kPacketizationParamRaw;
2060 cricket::VideoCodec remote_codec(99, "VP8");
2061 remote_codec.packetization = "unknownpacketizationattributevalue";
2062 cricket::VideoContentDescription local_video;
2063 local_video.set_codecs({local_codec});
2064 cricket::VideoContentDescription remote_video;
2065 remote_video.set_codecs({remote_codec});
2066
2067 CreateChannels(0, 0);
2068
2069 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2070 EXPECT_FALSE(
2071 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2072 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2073 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2074 cricket::kPacketizationParamRaw);
2075 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2076}
2077
2078TEST_F(VideoChannelSingleThreadTest,
2079 TestSetLocalAnswerWithInvalidPacketization) {
2080 cricket::VideoCodec local_codec(98, "VP8");
2081 local_codec.packetization = cricket::kPacketizationParamRaw;
2082 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2083 cricket::VideoContentDescription local_video;
2084 local_video.set_codecs({local_codec});
2085 cricket::VideoContentDescription remote_video;
2086 remote_video.set_codecs({kRemoteCodec});
2087
2088 CreateChannels(0, 0);
2089
2090 EXPECT_TRUE(
2091 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2092 EXPECT_FALSE(
2093 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2094 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2095 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2096 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2097}
2098
Danil Chapovalov33b01f22016-05-11 17:55:272099// VideoChannelDoubleThreadTest
2100TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2101 Base::TestInit();
2102}
henrike@webrtc.org28e20752013-07-10 00:45:362103
Danil Chapovalovdae07ba2016-05-13 23:43:502104TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2105 Base::TestDeinit();
2106}
2107
Danil Chapovalov33b01f22016-05-11 17:55:272108TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2109 Base::TestSetContents();
2110}
2111
Johannes Kron9190b822018-10-29 10:22:052112TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2113 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2114}
2115
2116TEST_F(VideoChannelDoubleThreadTest,
2117 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2118 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2119}
2120
2121TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2122 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2123}
2124
2125TEST_F(VideoChannelDoubleThreadTest,
2126 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2127 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2128}
2129
Danil Chapovalov33b01f22016-05-11 17:55:272130TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2131 Base::TestSetContentsNullOffer();
2132}
2133
2134TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2135 Base::TestSetContentsRtcpMux();
2136}
2137
2138TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2139 Base::TestSetContentsRtcpMux();
2140}
2141
Danil Chapovalov33b01f22016-05-11 17:55:272142TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2143 Base::TestChangeStreamParamsInContent();
2144}
2145
2146TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2147 Base::TestPlayoutAndSendingStates();
2148}
2149
Danil Chapovalov33b01f22016-05-11 17:55:272150TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2151 Base::TestMediaContentDirection();
2152}
2153
2154TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2155 Base::TestNetworkRouteChanges();
2156}
2157
2158TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2159 Base::TestCallSetup();
2160}
2161
2162TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2163 Base::TestCallTeardownRtcpMux();
2164}
2165
2166TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2167 Base::SendRtpToRtp();
2168}
2169
Danil Chapovalov33b01f22016-05-11 17:55:272170TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 17:48:352171 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 17:55:272172}
2173
2174TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 17:48:352175 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 17:55:272176}
2177
2178TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2179 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2180}
2181
2182TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2183 Base::SendRtpToRtpOnThread();
2184}
2185
Danil Chapovalov33b01f22016-05-11 17:55:272186TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2187 Base::SendWithWritabilityLoss();
2188}
2189
Danil Chapovalov33b01f22016-05-11 17:55:272190TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2191 Base::TestSetContentFailure();
2192}
2193
2194TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2195 Base::TestSendTwoOffers();
2196}
2197
2198TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2199 Base::TestReceiveTwoOffers();
2200}
2201
2202TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2203 Base::TestSendPrAnswer();
2204}
2205
2206TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2207 Base::TestReceivePrAnswer();
2208}
2209
Danil Chapovalov33b01f22016-05-11 17:55:272210TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2211 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2212}
2213
2214TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2215 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2216}
2217
2218TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2219 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2220}
2221
2222TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2223 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2224}
2225
zstein56162b92017-04-24 23:54:352226TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2227 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 17:55:272228}
2229
Danil Chapovalov33b01f22016-05-11 17:55:272230TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2231 Base::DefaultMaxBitrateIsUnlimited();
2232}
2233
Steve Anton8a63f782017-10-23 20:08:532234TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2235 Base::SocketOptionsMergedOnSetTransport();
2236}
2237
deadbeef953c2ce2017-01-09 22:53:412238// RtpDataChannelSingleThreadTest
2239class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:362240 public:
Danil Chapovalov33b01f22016-05-11 17:55:272241 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 22:53:412242 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 17:55:272243 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2244};
2245
deadbeef953c2ce2017-01-09 22:53:412246// RtpDataChannelDoubleThreadTest
2247class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 17:55:272248 public:
2249 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 22:53:412250 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 17:55:272251 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:362252};
2253
2254// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 18:50:272255template <>
Steve Anton8699a322017-11-06 23:53:332256std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 17:55:272257 rtc::Thread* worker_thread,
2258 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 23:53:332259 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 17:48:352260 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 12:20:322261 int flags) {
deadbeeff5346592017-01-25 05:51:212262 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 15:06:182263 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 23:53:332264 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-26 01:13:562265 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2266 &ssrc_generator_);
Niels Möller2a707032020-06-16 14:39:132267 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:362268 return channel;
2269}
2270
Danil Chapovalov33b01f22016-05-11 17:55:272271template <>
henrike@webrtc.org28e20752013-07-10 00:45:362272void ChannelTest<DataTraits>::CreateContent(
2273 int flags,
2274 const cricket::AudioCodec& audio_codec,
2275 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 11:36:162276 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:362277 data->AddCodec(kGoogleDataCodec);
2278 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:362279}
2280
Danil Chapovalov33b01f22016-05-11 17:55:272281template <>
henrike@webrtc.org28e20752013-07-10 00:45:362282void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 11:36:162283 const cricket::RtpDataContentDescription& source,
2284 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:362285 *data = source;
2286}
2287
Danil Chapovalov33b01f22016-05-11 17:55:272288template <>
henrike@webrtc.org28e20752013-07-10 00:45:362289bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2290 const cricket::DataCodec& c2) {
2291 return c1.name == c2.name;
2292}
2293
Peter Boström0c4e06b2015-10-07 10:23:212294template <>
henrike@webrtc.org28e20752013-07-10 00:45:362295void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 10:23:212296 uint32_t ssrc,
2297 int flags,
Harald Alvestrand5fc28b12019-05-13 11:36:162298 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:362299 data->AddLegacyStream(ssrc);
2300}
2301
deadbeef953c2ce2017-01-09 22:53:412302TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:362303 Base::TestInit();
2304 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2305}
2306
deadbeef953c2ce2017-01-09 22:53:412307TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-13 23:43:502308 Base::TestDeinit();
2309}
2310
deadbeef953c2ce2017-01-09 22:53:412311TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:362312 Base::TestSetContents();
2313}
2314
deadbeef953c2ce2017-01-09 22:53:412315TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:362316 Base::TestSetContentsNullOffer();
2317}
2318
deadbeef953c2ce2017-01-09 22:53:412319TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:362320 Base::TestSetContentsRtcpMux();
2321}
2322
deadbeef953c2ce2017-01-09 22:53:412323TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:362324 Base::TestChangeStreamParamsInContent();
2325}
2326
deadbeef953c2ce2017-01-09 22:53:412327TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:362328 Base::TestPlayoutAndSendingStates();
2329}
2330
deadbeef953c2ce2017-01-09 22:53:412331TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:362332 Base::TestMediaContentDirection();
2333}
2334
deadbeef953c2ce2017-01-09 22:53:412335TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:362336 Base::TestCallSetup();
2337}
2338
deadbeef953c2ce2017-01-09 22:53:412339TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:362340 Base::TestCallTeardownRtcpMux();
2341}
2342
zstein56162b92017-04-24 23:54:352343TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2344 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:362345}
2346
deadbeef953c2ce2017-01-09 22:53:412347TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:362348 Base::SendRtpToRtp();
2349}
2350
deadbeef953c2ce2017-01-09 22:53:412351TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:362352 Base::SendRtpToRtpOnThread();
2353}
2354
deadbeef953c2ce2017-01-09 22:53:412355TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:362356 Base::SendWithWritabilityLoss();
2357}
2358
Steve Anton8a63f782017-10-23 20:08:532359TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2360 Base::SocketOptionsMergedOnSetTransport();
2361}
2362
deadbeef953c2ce2017-01-09 22:53:412363TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 17:55:272364 CreateChannels(0, 0);
2365 EXPECT_TRUE(SendInitiate());
2366 EXPECT_TRUE(SendAccept());
2367
2368 cricket::SendDataParams params;
2369 params.ssrc = 42;
2370 unsigned char data[] = {'f', 'o', 'o'};
2371 rtc::CopyOnWriteBuffer payload(data, 3);
2372 cricket::SendDataResult result;
2373 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2374 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2375 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2376}
2377
deadbeef953c2ce2017-01-09 22:53:412378TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 17:55:272379 Base::TestInit();
2380 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2381}
2382
deadbeef953c2ce2017-01-09 22:53:412383TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-13 23:43:502384 Base::TestDeinit();
2385}
2386
deadbeef953c2ce2017-01-09 22:53:412387TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 17:55:272388 Base::TestSetContents();
2389}
2390
deadbeef953c2ce2017-01-09 22:53:412391TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 17:55:272392 Base::TestSetContentsNullOffer();
2393}
2394
deadbeef953c2ce2017-01-09 22:53:412395TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 17:55:272396 Base::TestSetContentsRtcpMux();
2397}
2398
deadbeef953c2ce2017-01-09 22:53:412399TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 17:55:272400 Base::TestChangeStreamParamsInContent();
2401}
2402
deadbeef953c2ce2017-01-09 22:53:412403TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 17:55:272404 Base::TestPlayoutAndSendingStates();
2405}
2406
deadbeef953c2ce2017-01-09 22:53:412407TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 17:55:272408 Base::TestMediaContentDirection();
2409}
2410
deadbeef953c2ce2017-01-09 22:53:412411TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 17:55:272412 Base::TestCallSetup();
2413}
2414
deadbeef953c2ce2017-01-09 22:53:412415TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 17:55:272416 Base::TestCallTeardownRtcpMux();
2417}
2418
zstein56162b92017-04-24 23:54:352419TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2420 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 17:55:272421}
2422
deadbeef953c2ce2017-01-09 22:53:412423TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 17:55:272424 Base::SendRtpToRtp();
2425}
2426
deadbeef953c2ce2017-01-09 22:53:412427TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 17:55:272428 Base::SendRtpToRtpOnThread();
2429}
2430
deadbeef953c2ce2017-01-09 22:53:412431TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 17:55:272432 Base::SendWithWritabilityLoss();
2433}
2434
Steve Anton8a63f782017-10-23 20:08:532435TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2436 Base::SocketOptionsMergedOnSetTransport();
2437}
2438
deadbeef953c2ce2017-01-09 22:53:412439TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:362440 CreateChannels(0, 0);
2441 EXPECT_TRUE(SendInitiate());
2442 EXPECT_TRUE(SendAccept());
2443
2444 cricket::SendDataParams params;
2445 params.ssrc = 42;
Yves Gerey665174f2018-06-19 13:03:052446 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 13:15:432447 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:362448 cricket::SendDataResult result;
2449 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 13:03:052450 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:362451 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2452}
2453
henrike@webrtc.org28e20752013-07-10 00:45:362454// TODO(pthatcher): TestSetReceiver?