blob: a3fe3f68de434a8e2c20a9838b2ab3927bb90fa8 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080014#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010015#include <utility>
kwiberg31022942016-03-11 14:18:21 -080016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_parameters.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020020#include "api/transport/media/media_transport_config.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "media/base/fake_media_engine.h"
23#include "media/base/fake_rtp.h"
24#include "media/base/media_channel.h"
25#include "p2p/base/candidate_pair_interface.h"
26#include "p2p/base/fake_dtls_transport.h"
27#include "p2p/base/fake_packet_transport.h"
28#include "p2p/base/ice_transport_internal.h"
29#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "pc/dtls_srtp_transport.h"
31#include "pc/jsep_transport.h"
32#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020036#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "rtc_base/rtc_certificate.h"
38#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020039#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041
zhihuangb2cdd932017-01-19 16:54:25 -080042using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080044using cricket::RidDescription;
45using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080047using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080048using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050namespace {
51const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
52const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
53const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070054const cricket::VideoCodec kH264Codec(97, "H264");
55const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020056const cricket::DataCodec kGoogleDataCodec(101, "google-data");
57const uint32_t kSsrc1 = 0x1111;
58const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070059const uint32_t kSsrc3 = 0x3333;
60const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020061const int kAudioPts[] = {0, 8};
62const int kVideoPts[] = {97, 99};
63enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010064
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
deadbeefcbecd352015-09-23 11:50:27 -070067template <class ChannelT,
68 class MediaChannelT,
69 class ContentT,
70 class CodecT,
71 class MediaInfoT,
72 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073class Traits {
74 public:
75 typedef ChannelT Channel;
76 typedef MediaChannelT MediaChannel;
77 typedef ContentT Content;
78 typedef CodecT Codec;
79 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081};
82
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083class VoiceTraits : public Traits<cricket::VoiceChannel,
84 cricket::FakeVoiceMediaChannel,
85 cricket::AudioContentDescription,
86 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
90class VideoTraits : public Traits<cricket::VideoChannel,
91 cricket::FakeVideoMediaChannel,
92 cricket::VideoContentDescription,
93 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020094 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070095 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096
deadbeef953c2ce2017-01-09 14:53:41 -080097class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020099 cricket::RtpDataContentDescription,
100 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200101 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700102 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
deadbeef953c2ce2017-01-09 14:53:41 -0800104// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200105template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200106class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107 public:
deadbeefac22f702017-01-12 21:59:29 -0800108 enum Flags {
109 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800110 SSRC_MUX = 0x8,
111 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800112 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800113 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700114 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800115 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116
Peter Boström34fbfff2015-09-24 19:20:30 +0200117 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200118 rtc::ArrayView<const uint8_t> rtp_data,
119 rtc::ArrayView<const uint8_t> rtcp_data,
120 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200121 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800123 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 if (network_is_worker == NetworkIsWorker::Yes) {
125 network_thread_ = rtc::Thread::Current();
126 } else {
127 network_thread_keeper_ = rtc::Thread::Create();
128 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200129 network_thread_ = network_thread_keeper_.get();
130 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200134 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800135 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200136 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800137 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Steve Anton8699a322017-11-06 15:53:33 -0800140 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
141 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200142 int flags1,
143 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800144 // Network thread is started in CreateChannels, to allow the test to
145 // configure a fake clock before any threads are spawned and attempt to
146 // access the time.
147 if (network_thread_keeper_) {
148 network_thread_keeper_->Start();
149 }
Zhi Huange830e682018-03-30 10:48:35 -0700150
deadbeeff5346592017-01-24 21:51:21 -0800151 // Make sure if using raw packet transports, they're used for both
152 // channels.
153 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200154 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800155 media_channel1_ = ch1.get();
156 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800157 rtc::PacketTransportInternal* rtp1 = nullptr;
158 rtc::PacketTransportInternal* rtcp1 = nullptr;
159 rtc::PacketTransportInternal* rtp2 = nullptr;
160 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800161 // Based on flags, create fake DTLS or raw packet transports.
162 if (flags1 & RAW_PACKET_TRANSPORT) {
163 fake_rtp_packet_transport1_.reset(
164 new rtc::FakePacketTransport("channel1_rtp"));
165 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700166 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800167 fake_rtcp_packet_transport1_.reset(
168 new rtc::FakePacketTransport("channel1_rtcp"));
169 rtcp1 = fake_rtcp_packet_transport1_.get();
170 }
171 } else {
172 // Confirmed to work with KT_RSA and KT_ECDSA.
173 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
174 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
175 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700176 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800177 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
178 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
179 rtcp1 = fake_rtcp_dtls_transport1_.get();
180 }
181 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100182 auto cert1 = rtc::RTCCertificate::Create(
183 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800184 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
185 if (fake_rtcp_dtls_transport1_) {
186 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
187 }
188 }
189 }
190 // Based on flags, create fake DTLS or raw packet transports.
191 if (flags2 & RAW_PACKET_TRANSPORT) {
192 fake_rtp_packet_transport2_.reset(
193 new rtc::FakePacketTransport("channel2_rtp"));
194 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700195 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800196 fake_rtcp_packet_transport2_.reset(
197 new rtc::FakePacketTransport("channel2_rtcp"));
198 rtcp2 = fake_rtcp_packet_transport2_.get();
199 }
200 } else {
201 // Confirmed to work with KT_RSA and KT_ECDSA.
202 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
203 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
204 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700205 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800206 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
207 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
208 rtcp2 = fake_rtcp_dtls_transport2_.get();
209 }
210 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100211 auto cert2 = rtc::RTCCertificate::Create(
212 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800213 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
214 if (fake_rtcp_dtls_transport2_) {
215 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
216 }
217 }
218 }
Zhi Huange830e682018-03-30 10:48:35 -0700219 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
220 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
221 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
222 flags1);
223 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
224 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
225 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
226 flags2);
227
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800228 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
229 rtp_transport1_.get(), flags1);
230 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
231 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800232 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800233 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800234 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800235 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200236 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
237 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 CopyContent(local_media_content1_, &remote_media_content1_);
239 CopyContent(local_media_content2_, &remote_media_content2_);
240
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 // Add stream information (SSRC) to the local content but not to the remote
242 // content. This means that we per default know the SSRC of what we send but
243 // not what we receive.
244 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
245 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
246
247 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
248 if (flags1 & SSRC_MUX) {
249 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
250 }
251 if (flags2 & SSRC_MUX) {
252 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
253 }
254 }
Steve Anton8699a322017-11-06 15:53:33 -0800255 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200256 rtc::Thread* worker_thread,
257 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800258 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700259 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200260 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261
Zhi Huange830e682018-03-30 10:48:35 -0700262 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
263 rtc::PacketTransportInternal* rtp_packet_transport,
264 rtc::PacketTransportInternal* rtcp_packet_transport,
265 DtlsTransportInternal* rtp_dtls_transport,
266 DtlsTransportInternal* rtcp_dtls_transport,
267 int flags) {
268 if (flags & RTCP_MUX) {
269 rtcp_packet_transport = nullptr;
270 rtcp_dtls_transport = nullptr;
271 }
272
273 if (flags & DTLS) {
274 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
275 } else {
276 if (flags & RAW_PACKET_TRANSPORT) {
277 return CreateUnencryptedTransport(rtp_packet_transport,
278 rtcp_packet_transport);
279 } else {
280 return CreateUnencryptedTransport(rtp_dtls_transport,
281 rtcp_dtls_transport);
282 }
283 }
284 }
285
286 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
287 rtc::PacketTransportInternal* rtp_packet_transport,
288 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200289 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200290 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700291
292 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
293 if (rtcp_packet_transport) {
294 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
295 }
296 return rtp_transport;
297 }
298
299 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
300 cricket::DtlsTransportInternal* rtp_dtls_transport,
301 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200302 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700303 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700304
305 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
306 rtcp_dtls_transport);
307 return dtls_srtp_transport;
308 }
309
deadbeeff5346592017-01-24 21:51:21 -0800310 void ConnectFakeTransports() {
311 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
312 bool asymmetric = false;
313 // Depending on test flags, could be using DTLS or raw packet transport.
314 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
315 fake_rtp_dtls_transport1_->SetDestination(
316 fake_rtp_dtls_transport2_.get(), asymmetric);
317 }
318 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
319 fake_rtcp_dtls_transport1_->SetDestination(
320 fake_rtcp_dtls_transport2_.get(), asymmetric);
321 }
322 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
323 fake_rtp_packet_transport1_->SetDestination(
324 fake_rtp_packet_transport2_.get(), asymmetric);
325 }
326 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
327 fake_rtcp_packet_transport1_->SetDestination(
328 fake_rtcp_packet_transport2_.get(), asymmetric);
329 }
330 });
331 }
332
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000334 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800335 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336 if (result) {
337 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000338 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800339 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000340 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800341 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000342 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800343 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000344 }
345 }
346 return result;
347 }
348
349 bool SendAccept() {
350 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800352 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 }
354
355 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000356 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800357 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 if (result) {
359 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000360 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800361 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 }
363 return result;
364 }
365
366 bool SendProvisionalAnswer() {
367 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800368 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 if (result) {
370 channel2_->Enable(true);
371 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800372 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800373 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000374 }
375 return result;
376 }
377
378 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000379 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800380 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000382 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800383 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384 return result;
385 }
386
deadbeeff5346592017-01-24 21:51:21 -0800387 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000388 channel1_.reset();
389 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800390 fake_rtp_dtls_transport1_.reset();
391 fake_rtcp_dtls_transport1_.reset();
392 fake_rtp_dtls_transport2_.reset();
393 fake_rtcp_dtls_transport2_.reset();
394 fake_rtp_packet_transport1_.reset();
395 fake_rtcp_packet_transport1_.reset();
396 fake_rtp_packet_transport2_.reset();
397 fake_rtcp_packet_transport2_.reset();
398 if (network_thread_keeper_) {
399 network_thread_keeper_.reset();
400 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 return true;
402 }
403
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200404 void SendRtp1() {
405 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
406 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp2() {
409 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
410 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
414 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
415 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
418 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
419 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 }
425 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200429 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200433 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200434 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
435 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
438 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440 rtc::SetBE32(data.data() + 8, ssrc);
441 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000442 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000444 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 return data;
446 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447
Yves Gerey665174f2018-06-19 15:03:05 +0200448 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
449 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450
451 void CreateContent(int flags,
452 const cricket::AudioCodec& audio_codec,
453 const cricket::VideoCodec& video_codec,
454 typename T::Content* content) {
455 // overridden in specialized classes
456 }
457 void CopyContent(const typename T::Content& source,
458 typename T::Content* content) {
459 // overridden in specialized classes
460 }
461
Steve Anton18ee1d52017-09-11 11:32:35 -0700462 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700464 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
465 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700466 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700467 AddLegacyStreamInContent(ssrc, 0, content);
468 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 }
470
ossu292d6582016-03-17 02:31:13 -0700471 // Will manage the lifetime of a CallThread, making sure it's
472 // destroyed before this object goes out of scope.
473 class ScopedCallThread {
474 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100476 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100477 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700478 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100479 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700480 }
481
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700483
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700485
486 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200487 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700488 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
491 return false; // overridden in specialized classes
492 }
493
deadbeeff5346592017-01-24 21:51:21 -0800494 void OnRtcpMuxFullyActive1(const std::string&) {
495 rtcp_mux_activated_callbacks1_++;
496 }
497 void OnRtcpMuxFullyActive2(const std::string&) {
498 rtcp_mux_activated_callbacks2_++;
499 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500
Honghai Zhangcc411c02016-03-29 17:27:21 -0700501 cricket::CandidatePairInterface* last_selected_candidate_pair() {
502 return last_selected_candidate_pair_;
503 }
504
Peter Boström0c4e06b2015-10-07 12:23:21 +0200505 void AddLegacyStreamInContent(uint32_t ssrc,
506 int flags,
507 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 // Base implementation.
509 }
510
511 // Tests that can be used by derived classes.
512
513 // Basic sanity check.
514 void TestInit() {
515 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700516 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200518 if (verify_playout_) {
519 EXPECT_FALSE(media_channel1_->playout());
520 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521 EXPECT_TRUE(media_channel1_->codecs().empty());
522 EXPECT_TRUE(media_channel1_->recv_streams().empty());
523 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524 }
525
526 // Test that SetLocalContent and SetRemoteContent properly configure
527 // the codecs.
528 void TestSetContents() {
529 CreateChannels(0, 0);
530 typename T::Content content;
531 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800532 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800534 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200536 EXPECT_TRUE(
537 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 }
539
Johannes Kron9190b822018-10-29 11:22:05 +0100540 // Test that SetLocalContent and SetRemoteContent properly configure
541 // extmap-allow-mixed.
542 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
543 // For a caller, SetLocalContent() is called first with an offer and next
544 // SetRemoteContent() is called with the answer.
545 CreateChannels(0, 0);
546 typename T::Content content;
547 CreateContent(0, kPcmuCodec, kH264Codec, &content);
548 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
549 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
550 content.set_extmap_allow_mixed_enum(offer_enum);
551 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
552 content.set_extmap_allow_mixed_enum(answer_enum);
553 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
554 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
555 }
556 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
557 // For a callee, SetRemoteContent() is called first with an offer and next
558 // SetLocalContent() is called with the answer.
559 CreateChannels(0, 0);
560 typename T::Content content;
561 CreateContent(0, kPcmuCodec, kH264Codec, &content);
562 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
563 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
564 content.set_extmap_allow_mixed_enum(offer_enum);
565 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
566 content.set_extmap_allow_mixed_enum(answer_enum);
567 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
568 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
569 }
570
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 // Test that SetLocalContent and SetRemoteContent properly deals
572 // with an empty offer.
573 void TestSetContentsNullOffer() {
574 CreateChannels(0, 0);
575 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800576 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 CreateContent(0, kPcmuCodec, kH264Codec, &content);
578 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800579 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200581 EXPECT_TRUE(
582 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 }
584
585 // Test that SetLocalContent and SetRemoteContent properly set RTCP
586 // mux.
587 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800588 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 typename T::Content content;
590 CreateContent(0, kPcmuCodec, kH264Codec, &content);
591 // Both sides agree on mux. Should no longer be a separate RTCP channel.
592 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800593 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
594 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800596 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800598 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 }
600
601 // Test that SetLocalContent and SetRemoteContent properly set RTCP
602 // mux when a provisional answer is received.
603 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800604 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 typename T::Content content;
606 CreateContent(0, kPcmuCodec, kH264Codec, &content);
607 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800608 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
609 EXPECT_TRUE(
610 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800611 // Both sides agree on mux. Should signal RTCP mux as fully activated.
612 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800613 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800614 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800616 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(
619 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
620 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800621 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 }
623
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 // Test that SetLocalContent and SetRemoteContent properly
625 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800626 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 void TestChangeStreamParamsInContent() {
628 cricket::StreamParams stream1;
629 stream1.groupid = "group1";
630 stream1.id = "stream1";
631 stream1.ssrcs.push_back(kSsrc1);
632 stream1.cname = "stream1_cname";
633
634 cricket::StreamParams stream2;
635 stream2.groupid = "group1";
636 stream2.id = "stream2";
637 stream2.ssrcs.push_back(kSsrc2);
638 stream2.cname = "stream2_cname";
639
640 // Setup a call where channel 1 send |stream1| to channel 2.
641 CreateChannels(0, 0);
642 typename T::Content content1;
643 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
644 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800645 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 EXPECT_TRUE(channel1_->Enable(true));
647 EXPECT_EQ(1u, media_channel1_->send_streams().size());
648
Steve Anton3828c062017-12-06 10:34:51 -0800649 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800651 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652
653 // Channel 2 do not send anything.
654 typename T::Content content2;
655 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800656 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800658 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_TRUE(channel2_->Enable(true));
660 EXPECT_EQ(0u, media_channel2_->send_streams().size());
661
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200662 SendCustomRtp1(kSsrc1, 0);
663 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
665
666 // Let channel 2 update the content by sending |stream2| and enable SRTP.
667 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700668 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800670 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 ASSERT_EQ(1u, media_channel2_->send_streams().size());
672 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
673
Steve Anton3828c062017-12-06 10:34:51 -0800674 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
676 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
677
678 // Channel 1 replies but stop sending stream1.
679 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700680 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800681 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 EXPECT_EQ(0u, media_channel1_->send_streams().size());
683
Steve Anton3828c062017-12-06 10:34:51 -0800684 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
686
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200687 SendCustomRtp2(kSsrc2, 0);
688 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
690 }
691
692 // Test that we only start playout and sending at the right times.
693 void TestPlayoutAndSendingStates() {
694 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200695 if (verify_playout_) {
696 EXPECT_FALSE(media_channel1_->playout());
697 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200699 if (verify_playout_) {
700 EXPECT_FALSE(media_channel2_->playout());
701 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 EXPECT_FALSE(media_channel2_->sending());
703 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200704 if (verify_playout_) {
705 EXPECT_FALSE(media_channel1_->playout());
706 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000708 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800709 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200710 if (verify_playout_) {
711 EXPECT_TRUE(media_channel1_->playout());
712 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000714 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800715 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200716 if (verify_playout_) {
717 EXPECT_FALSE(media_channel2_->playout());
718 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000720 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800721 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200722 if (verify_playout_) {
723 EXPECT_FALSE(media_channel2_->playout());
724 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800726 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200727 if (verify_playout_) {
728 EXPECT_TRUE(media_channel1_->playout());
729 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200731 if (verify_playout_) {
732 EXPECT_FALSE(media_channel2_->playout());
733 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 EXPECT_FALSE(media_channel2_->sending());
735 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
737 EXPECT_TRUE(media_channel2_->playout());
738 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800741 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 if (verify_playout_) {
743 EXPECT_TRUE(media_channel1_->playout());
744 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_TRUE(media_channel1_->sending());
746 }
747
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 // Test that changing the MediaContentDirection in the local and remote
749 // session description start playout and sending at the right time.
750 void TestMediaContentDirection() {
751 CreateChannels(0, 0);
752 typename T::Content content1;
753 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
754 typename T::Content content2;
755 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
756 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800757 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758
759 EXPECT_TRUE(channel1_->Enable(true));
760 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
762 EXPECT_FALSE(media_channel1_->playout());
763 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200765 if (verify_playout_) {
766 EXPECT_FALSE(media_channel2_->playout());
767 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 EXPECT_FALSE(media_channel2_->sending());
769
Steve Anton3828c062017-12-06 10:34:51 -0800770 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
771 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
772 EXPECT_TRUE(
773 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
774 EXPECT_TRUE(
775 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800776 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_TRUE(media_channel1_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
783 EXPECT_FALSE(media_channel2_->playout()); // local InActive
784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_FALSE(media_channel2_->sending()); // local InActive
786
787 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800788 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800789 EXPECT_TRUE(
790 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
791 EXPECT_TRUE(
792 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
Peter Boström34fbfff2015-09-24 19:20:30 +0200794 if (verify_playout_) {
795 EXPECT_TRUE(media_channel1_->playout());
796 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
799 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
802
803 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800804 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800805 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
806 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807
Peter Boström34fbfff2015-09-24 19:20:30 +0200808 if (verify_playout_) {
809 EXPECT_TRUE(media_channel1_->playout());
810 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200812 if (verify_playout_) {
813 EXPECT_TRUE(media_channel2_->playout());
814 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 EXPECT_TRUE(media_channel2_->sending());
816 }
817
Honghai Zhangcc411c02016-03-29 17:27:21 -0700818 // Tests that when the transport channel signals a candidate pair change
819 // event, the media channel will receive a call on the network route change.
820 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700821 static constexpr uint16_t kLocalNetId = 1;
822 static constexpr uint16_t kRemoteNetId = 2;
823 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800824 // Ipv4(20) + UDP(8).
825 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800826 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200827
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800828 CreateChannels(DTLS, DTLS);
829 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700830
Honghai Zhangcc411c02016-03-29 17:27:21 -0700831 typename T::MediaChannel* media_channel1 =
832 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200833 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700834
Zhi Huang942bc2e2017-11-13 13:26:07 -0800835 // Need to wait for the threads before calling
836 // |set_num_network_route_changes| because the network route would be set
837 // when creating the channel.
838 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200839 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800840 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800841 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200842 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800843 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200844 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200845 });
846 WaitForThreads();
847 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700848 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200849 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700850
eladalon05b07bb2017-08-24 07:40:16 -0700851 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800852 rtc::NetworkRoute network_route;
853 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100854 network_route.local =
855 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
856 network_route.remote =
857 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800858 network_route.last_sent_packet_id = kLastPacketId;
859 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200860 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800861 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
862
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200863 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200864 });
865 WaitForThreads();
866 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100867 EXPECT_TRUE(media_channel1->last_network_route().connected);
868 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100869 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100870 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100871 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200872 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700873 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800874 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800875 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700876 }
877
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 // Test setting up a call.
879 void TestCallSetup() {
880 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700881 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200883 if (verify_playout_) {
884 EXPECT_TRUE(media_channel1_->playout());
885 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000886 EXPECT_FALSE(media_channel1_->sending());
887 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700888 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889 EXPECT_TRUE(media_channel1_->sending());
890 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200891 if (verify_playout_) {
892 EXPECT_TRUE(media_channel2_->playout());
893 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000894 EXPECT_TRUE(media_channel2_->sending());
895 EXPECT_EQ(1U, media_channel2_->codecs().size());
896 }
897
898 // Test that we don't crash if packets are sent during call teardown
899 // when RTCP mux is enabled. This is a regression test against a specific
900 // race condition that would only occur when a RTCP packet was sent during
901 // teardown of a channel on which RTCP mux was enabled.
902 void TestCallTeardownRtcpMux() {
903 class LastWordMediaChannel : public T::MediaChannel {
904 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700907 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
908 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
910 }
911 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200912 CreateChannels(std::make_unique<LastWordMediaChannel>(),
913 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200914 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 EXPECT_TRUE(SendInitiate());
916 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800917 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918 }
919
920 // Send voice RTP data to the other side and ensure it gets there.
921 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700922 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 EXPECT_TRUE(SendInitiate());
924 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700925 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
926 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200927 SendRtp1();
928 SendRtp2();
929 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 EXPECT_TRUE(CheckRtp1());
931 EXPECT_TRUE(CheckRtp2());
932 EXPECT_TRUE(CheckNoRtp1());
933 EXPECT_TRUE(CheckNoRtp2());
934 }
935
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200936 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800937 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200938 EXPECT_TRUE(SendInitiate());
939 EXPECT_TRUE(SendAccept());
940 SendRtp1();
941 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200942 // Do not wait, destroy channels.
943 channel1_.reset(nullptr);
944 channel2_.reset(nullptr);
945 }
946
Zhi Huange830e682018-03-30 10:48:35 -0700947 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
948 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700949 EXPECT_FALSE(channel1_->srtp_active());
950 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200952 WaitForThreads();
953 EXPECT_TRUE(channel1_->writable());
954 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700956 EXPECT_TRUE(channel1_->srtp_active());
957 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200958 SendRtp1();
959 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200960 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 EXPECT_TRUE(CheckRtp1());
962 EXPECT_TRUE(CheckRtp2());
963 EXPECT_TRUE(CheckNoRtp1());
964 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 }
966
967 // Test that we can send and receive early media when a provisional answer is
968 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
969 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200970 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971
Yves Gerey665174f2018-06-19 15:03:05 +0200972 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
973 EXPECT_TRUE(SendOffer());
974 EXPECT_TRUE(SendProvisionalAnswer());
975 EXPECT_TRUE(channel1_->srtp_active());
976 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700977 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
978 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +0200979 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200980 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
981 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200982 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983
Yves Gerey665174f2018-06-19 15:03:05 +0200984 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200985 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
986 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200987 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988
Yves Gerey665174f2018-06-19 15:03:05 +0200989 // Complete call setup and ensure everything is still OK.
990 EXPECT_TRUE(SendFinalAnswer());
991 EXPECT_TRUE(channel1_->srtp_active());
992 EXPECT_TRUE(channel2_->srtp_active());
Yves Gerey665174f2018-06-19 15:03:05 +0200993 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200994 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
995 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200996 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200997 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998 }
999
1000 // Test that we properly send RTP without SRTP from a thread.
1001 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001002 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 EXPECT_TRUE(SendInitiate());
1004 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001005 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1006 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001007 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001008 WaitForThreads(involved_threads);
1009 EXPECT_TRUE(CheckRtp1());
1010 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011 EXPECT_TRUE(CheckNoRtp1());
1012 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 }
1014
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 // Test that the mediachannel retains its sending state after the transport
1016 // becomes non-writable.
1017 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001018 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 EXPECT_TRUE(SendInitiate());
1020 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001021 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1022 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 SendRtp1();
1024 SendRtp2();
1025 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(CheckRtp1());
1027 EXPECT_TRUE(CheckRtp2());
1028 EXPECT_TRUE(CheckNoRtp1());
1029 EXPECT_TRUE(CheckNoRtp2());
1030
wu@webrtc.org97077a32013-10-25 21:18:33 +00001031 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001032 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1033 fake_rtp_dtls_transport1_->SetWritable(false);
1034 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001035 SendRtp1();
1036 SendRtp2();
1037 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038 EXPECT_TRUE(CheckRtp1());
1039 EXPECT_TRUE(CheckNoRtp2());
1040
1041 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001042 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1043 fake_rtp_dtls_transport1_->SetWritable(true);
1044 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001046 SendRtp1();
1047 SendRtp2();
1048 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 EXPECT_TRUE(CheckRtp1());
1050 EXPECT_TRUE(CheckRtp2());
1051 EXPECT_TRUE(CheckNoRtp1());
1052 EXPECT_TRUE(CheckNoRtp2());
1053
1054 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001055 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1056 bool asymmetric = true;
1057 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1058 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059 EXPECT_TRUE(media_channel1_->sending());
1060
wu@webrtc.org97077a32013-10-25 21:18:33 +00001061 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001062 SendRtp1();
1063 SendRtp2();
1064 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065 EXPECT_TRUE(CheckRtp1());
1066 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001067 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068
1069 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001070 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001071 bool asymmetric = true;
1072 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1073 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001074 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001076 SendRtp1();
1077 SendRtp2();
1078 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_TRUE(CheckRtp1());
1080 EXPECT_TRUE(CheckRtp2());
1081 EXPECT_TRUE(CheckNoRtp1());
1082 EXPECT_TRUE(CheckNoRtp2());
1083 }
1084
Yves Gerey665174f2018-06-19 15:03:05 +02001085 void SendBundleToBundle(const int* pl_types,
1086 int len,
1087 bool rtcp_mux,
1088 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001089 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001091 // Only pl_type1 was added to the bundle filter for both |channel1_|
1092 // and |channel2_|.
1093 int pl_type1 = pl_types[0];
1094 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001095 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001096 if (secure)
1097 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001098 if (rtcp_mux) {
1099 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001100 }
1101 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001103 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001104
1105 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001106 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1107 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1108 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001109 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001110 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1111 EXPECT_TRUE(CheckNoRtp1());
1112 EXPECT_TRUE(CheckNoRtp2());
1113
Zhi Huang365381f2018-04-13 16:44:34 -07001114 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1115 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001116 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001117 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1118 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 }
1120
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 void TestSetContentFailure() {
1122 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123
Peter Thatchera6d24442015-07-09 21:26:36 -07001124 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001125 std::unique_ptr<typename T::Content> content(
1126 CreateMediaContentWithStream(1));
1127
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001129 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001130 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001131 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001132 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001135 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001136 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001137
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001139 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001140 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141 }
1142
1143 void TestSendTwoOffers() {
1144 CreateChannels(0, 0);
1145
Peter Thatchera6d24442015-07-09 21:26:36 -07001146 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001147 std::unique_ptr<typename T::Content> content1(
1148 CreateMediaContentWithStream(1));
1149 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001150 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1152
Steve Anton18ee1d52017-09-11 11:32:35 -07001153 std::unique_ptr<typename T::Content> content2(
1154 CreateMediaContentWithStream(2));
1155 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001156 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1158 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1159 }
1160
1161 void TestReceiveTwoOffers() {
1162 CreateChannels(0, 0);
1163
Peter Thatchera6d24442015-07-09 21:26:36 -07001164 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001165 std::unique_ptr<typename T::Content> content1(
1166 CreateMediaContentWithStream(1));
1167 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001168 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1170
Steve Anton18ee1d52017-09-11 11:32:35 -07001171 std::unique_ptr<typename T::Content> content2(
1172 CreateMediaContentWithStream(2));
1173 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001174 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1176 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1177 }
1178
1179 void TestSendPrAnswer() {
1180 CreateChannels(0, 0);
1181
Peter Thatchera6d24442015-07-09 21:26:36 -07001182 std::string err;
1183 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001184 std::unique_ptr<typename T::Content> content1(
1185 CreateMediaContentWithStream(1));
1186 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001187 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1189
Peter Thatchera6d24442015-07-09 21:26:36 -07001190 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001191 std::unique_ptr<typename T::Content> content2(
1192 CreateMediaContentWithStream(2));
1193 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001194 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1196 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1197
Peter Thatchera6d24442015-07-09 21:26:36 -07001198 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001199 std::unique_ptr<typename T::Content> content3(
1200 CreateMediaContentWithStream(3));
1201 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001202 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1204 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1205 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1206 }
1207
1208 void TestReceivePrAnswer() {
1209 CreateChannels(0, 0);
1210
Peter Thatchera6d24442015-07-09 21:26:36 -07001211 std::string err;
1212 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001213 std::unique_ptr<typename T::Content> content1(
1214 CreateMediaContentWithStream(1));
1215 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001216 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1218
Peter Thatchera6d24442015-07-09 21:26:36 -07001219 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001220 std::unique_ptr<typename T::Content> content2(
1221 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001222 EXPECT_TRUE(
1223 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1225 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1226
Peter Thatchera6d24442015-07-09 21:26:36 -07001227 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001228 std::unique_ptr<typename T::Content> content3(
1229 CreateMediaContentWithStream(3));
1230 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001231 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1233 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1234 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1235 }
1236
zstein56162b92017-04-24 16:54:35 -07001237 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001238 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001240
zstein56162b92017-04-24 16:54:35 -07001241 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001242 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001243 EXPECT_TRUE(media_channel1_->ready_to_send());
1244
zstein56162b92017-04-24 16:54:35 -07001245 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 }
1249
skvladdc1c62c2016-03-16 19:07:43 -07001250 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1251 typename T::Content content;
1252 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1253 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001254 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001255 }
1256
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001257 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001258 webrtc::RtpParameters parameters;
1259 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001260 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001261 parameters.encodings.push_back(encoding);
1262 return parameters;
1263 }
1264
1265 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001266 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001267 EXPECT_EQ(1UL, parameters.encodings.size());
1268 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1269 }
1270
1271 void DefaultMaxBitrateIsUnlimited() {
1272 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001273 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1274 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001275 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001276 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001277 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001278 }
1279
Zhi Huange830e682018-03-30 10:48:35 -07001280 // Test that when a channel gets new RtpTransport with a call to
1281 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1282 // with the options on the new one.
1283
Steve Anton8a63f782017-10-23 13:08:53 -07001284 // For example, audio and video may use separate socket options, but initially
1285 // be unbundled, then later become bundled. When this happens, their preferred
1286 // socket options should be merged to the underlying transport they share.
1287 void SocketOptionsMergedOnSetTransport() {
1288 constexpr int kSndBufSize = 4000;
1289 constexpr int kRcvBufSize = 8000;
1290
Zhi Huange830e682018-03-30 10:48:35 -07001291 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001292
1293 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1294 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1295 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1296 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1297
Zhi Huange830e682018-03-30 10:48:35 -07001298 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001299 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001300 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001301
1302 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001303 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1304 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001305 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001306 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1307 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001308 EXPECT_EQ(kRcvBufSize, option_val);
1309 }
1310
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001311 void CreateSimulcastContent(const std::vector<std::string>& rids,
1312 typename T::Content* content) {
1313 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001314 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001315 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1316 }
1317
1318 StreamParams stream;
1319 stream.set_rids(rid_descriptions);
1320 CreateContent(0, kPcmuCodec, kH264Codec, content);
1321 // This is for unified plan, so there can be only one StreamParams.
1322 content->mutable_streams().clear();
1323 content->AddStream(stream);
1324 }
1325
1326 void VerifySimulcastStreamParams(const StreamParams& expected,
1327 const typename T::Channel* channel) {
1328 const std::vector<StreamParams>& streams = channel->local_streams();
1329 ASSERT_EQ(1u, streams.size());
1330 const StreamParams& result = streams[0];
1331 EXPECT_EQ(expected.rids(), result.rids());
1332 EXPECT_TRUE(result.has_ssrcs());
1333 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1334 std::vector<uint32_t> primary_ssrcs;
1335 result.GetPrimarySsrcs(&primary_ssrcs);
1336 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1337 }
1338
1339 void TestUpdateLocalStreamsWithSimulcast() {
1340 CreateChannels(0, 0);
1341 typename T::Content content1, content2, content3;
1342 CreateSimulcastContent({"f", "h", "q"}, &content1);
1343 EXPECT_TRUE(
1344 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1345 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1346 StreamParams stream1 = channel1_->local_streams()[0];
1347
1348 // Create a similar offer. SetLocalContent should not remove and add.
1349 CreateSimulcastContent({"f", "h", "q"}, &content2);
1350 EXPECT_TRUE(
1351 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1352 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1353 StreamParams stream2 = channel1_->local_streams()[0];
1354 // Check that the streams are identical (SSRCs didn't change).
1355 EXPECT_EQ(stream1, stream2);
1356
1357 // Create third offer that has same RIDs in different order.
1358 CreateSimulcastContent({"f", "q", "h"}, &content3);
1359 EXPECT_TRUE(
1360 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1361 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1362 }
1363
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001365 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1366 static void ProcessThreadQueue(rtc::Thread* thread) {
1367 RTC_DCHECK(thread->IsCurrent());
1368 while (!thread->empty()) {
1369 thread->ProcessMessages(0);
1370 }
1371 }
1372 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1373 // |threads| and current thread post packets to network thread.
1374 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001375 thread->Invoke<void>(RTC_FROM_HERE,
1376 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001377 }
1378 ProcessThreadQueue(rtc::Thread::Current());
1379 // Network thread move them around and post back to worker = current thread.
1380 if (!network_thread_->IsCurrent()) {
1381 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001382 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001383 }
1384 // Worker thread = current Thread process received messages.
1385 ProcessThreadQueue(rtc::Thread::Current());
1386 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001387 // TODO(pbos): Remove playout from all media channels and let renderers mute
1388 // themselves.
1389 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001390 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1391 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001392 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1393 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1394 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1395 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1396 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1397 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1398 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1399 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001400 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1401 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1402 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403 cricket::FakeMediaEngine media_engine_;
1404 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001405 typename T::MediaChannel* media_channel1_ = nullptr;
1406 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001407 std::unique_ptr<typename T::Channel> channel1_;
1408 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409 typename T::Content local_media_content1_;
1410 typename T::Content local_media_content2_;
1411 typename T::Content remote_media_content1_;
1412 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001414 rtc::Buffer rtp_packet_;
1415 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001416 int rtcp_mux_activated_callbacks1_ = 0;
1417 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001418 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001419 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001420};
1421
Yves Gerey665174f2018-06-19 15:03:05 +02001422template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001423std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1424 rtc::Thread* worker_thread,
1425 rtc::Thread* network_thread,
1426 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1427 webrtc::RtpTransportInternal* rtp_transport,
1428 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001429 rtc::Thread* signaling_thread = rtc::Thread::Current();
1430 auto channel = std::make_unique<cricket::VoiceChannel>(
1431 worker_thread, network_thread, signaling_thread, std::move(ch),
1432 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1433 &ssrc_generator_);
1434 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
1435 return channel;
1436}
1437
1438template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439void ChannelTest<VoiceTraits>::CreateContent(
1440 int flags,
1441 const cricket::AudioCodec& audio_codec,
1442 const cricket::VideoCodec& video_codec,
1443 cricket::AudioContentDescription* audio) {
1444 audio->AddCodec(audio_codec);
1445 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446}
1447
Yves Gerey665174f2018-06-19 15:03:05 +02001448template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001449void ChannelTest<VoiceTraits>::CopyContent(
1450 const cricket::AudioContentDescription& source,
1451 cricket::AudioContentDescription* audio) {
1452 *audio = source;
1453}
1454
Yves Gerey665174f2018-06-19 15:03:05 +02001455template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1457 const cricket::AudioCodec& c2) {
1458 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001459 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460}
1461
Peter Boström0c4e06b2015-10-07 12:23:21 +02001462template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001464 uint32_t ssrc,
1465 int flags,
1466 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467 audio->AddLegacyStream(ssrc);
1468}
1469
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001470class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471 public:
solenberg1dd98f32015-09-10 01:57:14 -07001472 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001473 VoiceChannelSingleThreadTest()
1474 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1475};
1476
1477class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1478 public:
1479 typedef ChannelTest<VoiceTraits> Base;
1480 VoiceChannelDoubleThreadTest()
1481 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482};
1483
jbauch5869f502017-06-29 12:31:36 -07001484class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001485 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001486 public:
1487 typedef ChannelTest<VoiceTraits> Base;
1488 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001489 : Base(true,
1490 kPcmuFrameWithExtensions,
1491 kRtcpReport,
1492 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001493};
1494
1495class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001496 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001497 public:
1498 typedef ChannelTest<VoiceTraits> Base;
1499 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001500 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1501 }
jbauch5869f502017-06-29 12:31:36 -07001502};
1503
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001505template <>
Steve Anton8699a322017-11-06 15:53:33 -08001506std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001507 rtc::Thread* worker_thread,
1508 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001509 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001510 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001511 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001512 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001513 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001514 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001515 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1516 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001517 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 return channel;
1519}
1520
Yves Gerey665174f2018-06-19 15:03:05 +02001521template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522void ChannelTest<VideoTraits>::CreateContent(
1523 int flags,
1524 const cricket::AudioCodec& audio_codec,
1525 const cricket::VideoCodec& video_codec,
1526 cricket::VideoContentDescription* video) {
1527 video->AddCodec(video_codec);
1528 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529}
1530
Yves Gerey665174f2018-06-19 15:03:05 +02001531template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532void ChannelTest<VideoTraits>::CopyContent(
1533 const cricket::VideoContentDescription& source,
1534 cricket::VideoContentDescription* video) {
1535 *video = source;
1536}
1537
Yves Gerey665174f2018-06-19 15:03:05 +02001538template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1540 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001541 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542}
1543
Peter Boström0c4e06b2015-10-07 12:23:21 +02001544template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001546 uint32_t ssrc,
1547 int flags,
1548 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549 video->AddLegacyStream(ssrc);
1550}
1551
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001552class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001553 public:
solenberg1dd98f32015-09-10 01:57:14 -07001554 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001555 VideoChannelSingleThreadTest()
1556 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557};
1558
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001559class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1560 public:
1561 typedef ChannelTest<VideoTraits> Base;
1562 VideoChannelDoubleThreadTest()
1563 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1564};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001565
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001566TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567 Base::TestInit();
1568 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1569 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1570}
1571
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001572TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1573 Base::TestDeinit();
1574}
1575
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001576TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577 Base::TestSetContents();
1578}
1579
Johannes Kron9190b822018-10-29 11:22:05 +01001580TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1581 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1582}
1583
1584TEST_F(VoiceChannelSingleThreadTest,
1585 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1586 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1587}
1588
1589TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1590 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1591}
1592
1593TEST_F(VoiceChannelSingleThreadTest,
1594 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1595 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1596}
1597
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001598TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599 Base::TestSetContentsNullOffer();
1600}
1601
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001602TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603 Base::TestSetContentsRtcpMux();
1604}
1605
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001606TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 Base::TestSetContentsRtcpMux();
1608}
1609
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001610TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611 Base::TestChangeStreamParamsInContent();
1612}
1613
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 Base::TestPlayoutAndSendingStates();
1616}
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 Base::TestMediaContentDirection();
1620}
1621
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001623 Base::TestNetworkRouteChanges();
1624}
1625
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 Base::TestCallSetup();
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 Base::TestCallTeardownRtcpMux();
1632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::SendRtpToRtp();
1636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001639 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001643 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 Base::SendRtpToRtpOnThread();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::SendWithWritabilityLoss();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::TestSetContentFailure();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::TestSendTwoOffers();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::TestReceiveTwoOffers();
1668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 Base::TestSendPrAnswer();
1672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::TestReceivePrAnswer();
1676}
1677
zstein56162b92017-04-24 16:54:35 -07001678TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1679 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001683 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001687 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001691 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001695 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001699 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001700}
1701
Steve Anton8a63f782017-10-23 13:08:53 -07001702TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1703 Base::SocketOptionsMergedOnSetTransport();
1704}
1705
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001706// VoiceChannelDoubleThreadTest
1707TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1710 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711}
1712
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001713TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1714 Base::TestDeinit();
1715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 Base::TestSetContents();
1719}
1720
Johannes Kron9190b822018-10-29 11:22:05 +01001721TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1722 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1723}
1724
1725TEST_F(VoiceChannelDoubleThreadTest,
1726 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1727 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1728}
1729
1730TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1731 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1732}
1733
1734TEST_F(VoiceChannelDoubleThreadTest,
1735 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1736 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1737}
1738
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001739TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 Base::TestSetContentsNullOffer();
1741}
1742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 Base::TestSetContentsRtcpMux();
1745}
1746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001747TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 Base::TestSetContentsRtcpMux();
1749}
1750
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001751TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752 Base::TestChangeStreamParamsInContent();
1753}
1754
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001755TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756 Base::TestPlayoutAndSendingStates();
1757}
1758
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001759TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1760 Base::TestMediaContentDirection();
1761}
1762
1763TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1764 Base::TestNetworkRouteChanges();
1765}
1766
1767TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1768 Base::TestCallSetup();
1769}
1770
1771TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1772 Base::TestCallTeardownRtcpMux();
1773}
1774
1775TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1776 Base::SendRtpToRtp();
1777}
1778
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001779TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001780 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781}
1782
1783TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001784 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001785}
1786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1788 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1789}
1790
1791TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1792 Base::SendRtpToRtpOnThread();
1793}
1794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001795TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1796 Base::SendWithWritabilityLoss();
1797}
1798
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001799TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1800 Base::TestSetContentFailure();
1801}
1802
1803TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1804 Base::TestSendTwoOffers();
1805}
1806
1807TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1808 Base::TestReceiveTwoOffers();
1809}
1810
1811TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1812 Base::TestSendPrAnswer();
1813}
1814
1815TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1816 Base::TestReceivePrAnswer();
1817}
1818
zstein56162b92017-04-24 16:54:35 -07001819TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1820 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821}
1822
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1824 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1825}
1826
1827TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1828 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1829}
1830
1831TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1832 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1833}
1834
1835TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1836 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1837}
1838
1839TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1840 Base::DefaultMaxBitrateIsUnlimited();
1841}
1842
Steve Anton8a63f782017-10-23 13:08:53 -07001843TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1844 Base::SocketOptionsMergedOnSetTransport();
1845}
1846
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847// VideoChannelSingleThreadTest
1848TEST_F(VideoChannelSingleThreadTest, TestInit) {
1849 Base::TestInit();
1850}
1851
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001852TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1853 Base::TestDeinit();
1854}
1855
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001856TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1857 Base::TestSetContents();
1858}
1859
Johannes Kron9190b822018-10-29 11:22:05 +01001860TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1861 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1862}
1863
1864TEST_F(VideoChannelSingleThreadTest,
1865 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1866 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1867}
1868
1869TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1870 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1871}
1872
1873TEST_F(VideoChannelSingleThreadTest,
1874 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1875 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1876}
1877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1879 Base::TestSetContentsNullOffer();
1880}
1881
1882TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1883 Base::TestSetContentsRtcpMux();
1884}
1885
1886TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1887 Base::TestSetContentsRtcpMux();
1888}
1889
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001890TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1891 Base::TestChangeStreamParamsInContent();
1892}
1893
1894TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1895 Base::TestPlayoutAndSendingStates();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 Base::TestMediaContentDirection();
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001903 Base::TestNetworkRouteChanges();
1904}
1905
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001906TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 Base::TestCallSetup();
1908}
1909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001910TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 Base::TestCallTeardownRtcpMux();
1912}
1913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001914TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 Base::SendRtpToRtp();
1916}
1917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001919 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001923 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1928}
1929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 Base::SendRtpToRtpOnThread();
1932}
1933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 Base::SendWithWritabilityLoss();
1936}
1937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001938TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 Base::TestSetContentFailure();
1940}
1941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 Base::TestSendTwoOffers();
1944}
1945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 Base::TestReceiveTwoOffers();
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 Base::TestSendPrAnswer();
1952}
1953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 Base::TestReceivePrAnswer();
1956}
1957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001959 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001963 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001964}
1965
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001966TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001967 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001971 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972}
1973
zstein56162b92017-04-24 16:54:35 -07001974TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1975 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976}
1977
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001978TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001979 Base::DefaultMaxBitrateIsUnlimited();
1980}
1981
Steve Anton8a63f782017-10-23 13:08:53 -07001982TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1983 Base::SocketOptionsMergedOnSetTransport();
1984}
1985
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001986TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1987 Base::TestUpdateLocalStreamsWithSimulcast();
1988}
1989
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001990TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1991 const cricket::VideoCodec kVp8Codec(97, "VP8");
1992 cricket::VideoCodec vp9_codec(98, "VP9");
1993 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1994 cricket::VideoContentDescription video;
1995 video.set_codecs({kVp8Codec, vp9_codec});
1996
1997 CreateChannels(0, 0);
1998
1999 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2000 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2001 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2002 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2003 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2004 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2005 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2006 cricket::kPacketizationParamRaw);
2007}
2008
2009TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2010 const cricket::VideoCodec kVp8Codec(97, "VP8");
2011 cricket::VideoCodec vp9_codec(98, "VP9");
2012 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2013 cricket::VideoContentDescription video;
2014 video.set_codecs({kVp8Codec, vp9_codec});
2015
2016 CreateChannels(0, 0);
2017
2018 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2019 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2020 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2021 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2022 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2023 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2024 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2025 cricket::kPacketizationParamRaw);
2026}
2027
2028TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2029 const cricket::VideoCodec kVp8Codec(97, "VP8");
2030 cricket::VideoCodec vp9_codec(98, "VP9");
2031 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2032 cricket::VideoContentDescription video;
2033 video.set_codecs({kVp8Codec, vp9_codec});
2034
2035 CreateChannels(0, 0);
2036
2037 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2038 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2039 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2040 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2041 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2042 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2043 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2044 cricket::kPacketizationParamRaw);
2045 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2046 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2047 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2048 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2049 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2050 cricket::kPacketizationParamRaw);
2051}
2052
2053TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2054 const cricket::VideoCodec kLocalCodec(98, "VP8");
2055 cricket::VideoCodec remote_codec(99, "VP8");
2056 remote_codec.packetization = cricket::kPacketizationParamRaw;
2057 cricket::VideoContentDescription local_video;
2058 local_video.set_codecs({kLocalCodec});
2059 cricket::VideoContentDescription remote_video;
2060 remote_video.set_codecs({remote_codec});
2061
2062 CreateChannels(0, 0);
2063
2064 EXPECT_TRUE(
2065 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2066 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2067 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2068 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2069 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2070 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2071}
2072
2073TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2074 cricket::VideoCodec local_codec(98, "VP8");
2075 local_codec.packetization = cricket::kPacketizationParamRaw;
2076 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2077 cricket::VideoContentDescription local_video;
2078 local_video.set_codecs({local_codec});
2079 cricket::VideoContentDescription remote_video;
2080 remote_video.set_codecs({kRemoteCodec});
2081
2082 CreateChannels(0, 0);
2083
2084 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2085 EXPECT_TRUE(
2086 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2087 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2088 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2089 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2090 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2091}
2092
2093TEST_F(VideoChannelSingleThreadTest,
2094 TestSetRemoteAnswerWithInvalidPacketization) {
2095 cricket::VideoCodec local_codec(98, "VP8");
2096 local_codec.packetization = cricket::kPacketizationParamRaw;
2097 cricket::VideoCodec remote_codec(99, "VP8");
2098 remote_codec.packetization = "unknownpacketizationattributevalue";
2099 cricket::VideoContentDescription local_video;
2100 local_video.set_codecs({local_codec});
2101 cricket::VideoContentDescription remote_video;
2102 remote_video.set_codecs({remote_codec});
2103
2104 CreateChannels(0, 0);
2105
2106 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2107 EXPECT_FALSE(
2108 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2109 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2110 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2111 cricket::kPacketizationParamRaw);
2112 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2113}
2114
2115TEST_F(VideoChannelSingleThreadTest,
2116 TestSetLocalAnswerWithInvalidPacketization) {
2117 cricket::VideoCodec local_codec(98, "VP8");
2118 local_codec.packetization = cricket::kPacketizationParamRaw;
2119 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2120 cricket::VideoContentDescription local_video;
2121 local_video.set_codecs({local_codec});
2122 cricket::VideoContentDescription remote_video;
2123 remote_video.set_codecs({kRemoteCodec});
2124
2125 CreateChannels(0, 0);
2126
2127 EXPECT_TRUE(
2128 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2129 EXPECT_FALSE(
2130 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2131 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2132 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2133 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2134}
2135
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002136// VideoChannelDoubleThreadTest
2137TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2138 Base::TestInit();
2139}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002140
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002141TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2142 Base::TestDeinit();
2143}
2144
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002145TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2146 Base::TestSetContents();
2147}
2148
Johannes Kron9190b822018-10-29 11:22:05 +01002149TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2150 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2151}
2152
2153TEST_F(VideoChannelDoubleThreadTest,
2154 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2155 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2156}
2157
2158TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2159 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2160}
2161
2162TEST_F(VideoChannelDoubleThreadTest,
2163 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2164 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2165}
2166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002167TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2168 Base::TestSetContentsNullOffer();
2169}
2170
2171TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2172 Base::TestSetContentsRtcpMux();
2173}
2174
2175TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2176 Base::TestSetContentsRtcpMux();
2177}
2178
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002179TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2180 Base::TestChangeStreamParamsInContent();
2181}
2182
2183TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2184 Base::TestPlayoutAndSendingStates();
2185}
2186
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002187TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2188 Base::TestMediaContentDirection();
2189}
2190
2191TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2192 Base::TestNetworkRouteChanges();
2193}
2194
2195TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2196 Base::TestCallSetup();
2197}
2198
2199TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2200 Base::TestCallTeardownRtcpMux();
2201}
2202
2203TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2204 Base::SendRtpToRtp();
2205}
2206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002208 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209}
2210
2211TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002212 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002213}
2214
2215TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2216 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2217}
2218
2219TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2220 Base::SendRtpToRtpOnThread();
2221}
2222
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002223TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2224 Base::SendWithWritabilityLoss();
2225}
2226
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002227TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2228 Base::TestSetContentFailure();
2229}
2230
2231TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2232 Base::TestSendTwoOffers();
2233}
2234
2235TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2236 Base::TestReceiveTwoOffers();
2237}
2238
2239TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2240 Base::TestSendPrAnswer();
2241}
2242
2243TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2244 Base::TestReceivePrAnswer();
2245}
2246
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002247TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2248 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2249}
2250
2251TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2252 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2253}
2254
2255TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2256 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2257}
2258
2259TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2260 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2261}
2262
zstein56162b92017-04-24 16:54:35 -07002263TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2264 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265}
2266
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002267TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2268 Base::DefaultMaxBitrateIsUnlimited();
2269}
2270
Steve Anton8a63f782017-10-23 13:08:53 -07002271TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2272 Base::SocketOptionsMergedOnSetTransport();
2273}
2274
deadbeef953c2ce2017-01-09 14:53:41 -08002275// RtpDataChannelSingleThreadTest
2276class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002278 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002279 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2281};
2282
deadbeef953c2ce2017-01-09 14:53:41 -08002283// RtpDataChannelDoubleThreadTest
2284class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285 public:
2286 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002287 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002288 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289};
2290
2291// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002292template <>
Steve Anton8699a322017-11-06 15:53:33 -08002293std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002294 rtc::Thread* worker_thread,
2295 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002296 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002297 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002298 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002299 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002300 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002301 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002302 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2303 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002304 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 return channel;
2306}
2307
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309void ChannelTest<DataTraits>::CreateContent(
2310 int flags,
2311 const cricket::AudioCodec& audio_codec,
2312 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002313 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 data->AddCodec(kGoogleDataCodec);
2315 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316}
2317
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002318template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002320 const cricket::RtpDataContentDescription& source,
2321 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 *data = source;
2323}
2324
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002325template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2327 const cricket::DataCodec& c2) {
2328 return c1.name == c2.name;
2329}
2330
Peter Boström0c4e06b2015-10-07 12:23:21 +02002331template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002333 uint32_t ssrc,
2334 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002335 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 data->AddLegacyStream(ssrc);
2337}
2338
deadbeef953c2ce2017-01-09 14:53:41 -08002339TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 Base::TestInit();
2341 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2342}
2343
deadbeef953c2ce2017-01-09 14:53:41 -08002344TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002345 Base::TestDeinit();
2346}
2347
deadbeef953c2ce2017-01-09 14:53:41 -08002348TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 Base::TestSetContents();
2350}
2351
deadbeef953c2ce2017-01-09 14:53:41 -08002352TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353 Base::TestSetContentsNullOffer();
2354}
2355
deadbeef953c2ce2017-01-09 14:53:41 -08002356TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 Base::TestSetContentsRtcpMux();
2358}
2359
deadbeef953c2ce2017-01-09 14:53:41 -08002360TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361 Base::TestChangeStreamParamsInContent();
2362}
2363
deadbeef953c2ce2017-01-09 14:53:41 -08002364TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::TestPlayoutAndSendingStates();
2366}
2367
deadbeef953c2ce2017-01-09 14:53:41 -08002368TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::TestMediaContentDirection();
2370}
2371
deadbeef953c2ce2017-01-09 14:53:41 -08002372TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::TestCallSetup();
2374}
2375
deadbeef953c2ce2017-01-09 14:53:41 -08002376TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 Base::TestCallTeardownRtcpMux();
2378}
2379
zstein56162b92017-04-24 16:54:35 -07002380TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2381 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382}
2383
deadbeef953c2ce2017-01-09 14:53:41 -08002384TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385 Base::SendRtpToRtp();
2386}
2387
deadbeef953c2ce2017-01-09 14:53:41 -08002388TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 Base::SendRtpToRtpOnThread();
2390}
2391
deadbeef953c2ce2017-01-09 14:53:41 -08002392TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002393 Base::SendWithWritabilityLoss();
2394}
2395
Steve Anton8a63f782017-10-23 13:08:53 -07002396TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2397 Base::SocketOptionsMergedOnSetTransport();
2398}
2399
deadbeef953c2ce2017-01-09 14:53:41 -08002400TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002401 CreateChannels(0, 0);
2402 EXPECT_TRUE(SendInitiate());
2403 EXPECT_TRUE(SendAccept());
2404
2405 cricket::SendDataParams params;
2406 params.ssrc = 42;
2407 unsigned char data[] = {'f', 'o', 'o'};
2408 rtc::CopyOnWriteBuffer payload(data, 3);
2409 cricket::SendDataResult result;
2410 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2411 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2412 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2413}
2414
deadbeef953c2ce2017-01-09 14:53:41 -08002415TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002416 Base::TestInit();
2417 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2418}
2419
deadbeef953c2ce2017-01-09 14:53:41 -08002420TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002421 Base::TestDeinit();
2422}
2423
deadbeef953c2ce2017-01-09 14:53:41 -08002424TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425 Base::TestSetContents();
2426}
2427
deadbeef953c2ce2017-01-09 14:53:41 -08002428TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429 Base::TestSetContentsNullOffer();
2430}
2431
deadbeef953c2ce2017-01-09 14:53:41 -08002432TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433 Base::TestSetContentsRtcpMux();
2434}
2435
deadbeef953c2ce2017-01-09 14:53:41 -08002436TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437 Base::TestChangeStreamParamsInContent();
2438}
2439
deadbeef953c2ce2017-01-09 14:53:41 -08002440TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441 Base::TestPlayoutAndSendingStates();
2442}
2443
deadbeef953c2ce2017-01-09 14:53:41 -08002444TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445 Base::TestMediaContentDirection();
2446}
2447
deadbeef953c2ce2017-01-09 14:53:41 -08002448TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449 Base::TestCallSetup();
2450}
2451
deadbeef953c2ce2017-01-09 14:53:41 -08002452TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453 Base::TestCallTeardownRtcpMux();
2454}
2455
zstein56162b92017-04-24 16:54:35 -07002456TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2457 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002458}
2459
deadbeef953c2ce2017-01-09 14:53:41 -08002460TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461 Base::SendRtpToRtp();
2462}
2463
deadbeef953c2ce2017-01-09 14:53:41 -08002464TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465 Base::SendRtpToRtpOnThread();
2466}
2467
deadbeef953c2ce2017-01-09 14:53:41 -08002468TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469 Base::SendWithWritabilityLoss();
2470}
2471
Steve Anton8a63f782017-10-23 13:08:53 -07002472TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2473 Base::SocketOptionsMergedOnSetTransport();
2474}
2475
deadbeef953c2ce2017-01-09 14:53:41 -08002476TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 CreateChannels(0, 0);
2478 EXPECT_TRUE(SendInitiate());
2479 EXPECT_TRUE(SendAccept());
2480
2481 cricket::SendDataParams params;
2482 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002483 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002484 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485 cricket::SendDataResult result;
2486 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002487 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2489}
2490
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491// TODO(pthatcher): TestSetReceiver?