blob: 8ce3729f45f7da46b12f4e067c066a7ed4e8b9be [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) {
182 auto cert1 =
183 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
184 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
185 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
188 }
189 }
190 }
191 // Based on flags, create fake DTLS or raw packet transports.
192 if (flags2 & RAW_PACKET_TRANSPORT) {
193 fake_rtp_packet_transport2_.reset(
194 new rtc::FakePacketTransport("channel2_rtp"));
195 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700196 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800197 fake_rtcp_packet_transport2_.reset(
198 new rtc::FakePacketTransport("channel2_rtcp"));
199 rtcp2 = fake_rtcp_packet_transport2_.get();
200 }
201 } else {
202 // Confirmed to work with KT_RSA and KT_ECDSA.
203 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
204 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
205 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700206 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800207 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
208 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
209 rtcp2 = fake_rtcp_dtls_transport2_.get();
210 }
211 if (flags2 & DTLS) {
212 auto cert2 =
213 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
214 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
215 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
216 if (fake_rtcp_dtls_transport2_) {
217 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
218 }
219 }
220 }
Zhi Huange830e682018-03-30 10:48:35 -0700221 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
222 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
223 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
224 flags1);
225 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
226 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
227 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
228 flags2);
229
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800230 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
231 rtp_transport1_.get(), flags1);
232 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
233 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800234 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800235 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800236 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800237 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200238 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
239 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240 CopyContent(local_media_content1_, &remote_media_content1_);
241 CopyContent(local_media_content2_, &remote_media_content2_);
242
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 // Add stream information (SSRC) to the local content but not to the remote
244 // content. This means that we per default know the SSRC of what we send but
245 // not what we receive.
246 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
247 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
248
249 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
250 if (flags1 & SSRC_MUX) {
251 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
252 }
253 if (flags2 & SSRC_MUX) {
254 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
255 }
256 }
Steve Anton8699a322017-11-06 15:53:33 -0800257 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200258 rtc::Thread* worker_thread,
259 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800260 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700261 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200262 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263
Zhi Huange830e682018-03-30 10:48:35 -0700264 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
265 rtc::PacketTransportInternal* rtp_packet_transport,
266 rtc::PacketTransportInternal* rtcp_packet_transport,
267 DtlsTransportInternal* rtp_dtls_transport,
268 DtlsTransportInternal* rtcp_dtls_transport,
269 int flags) {
270 if (flags & RTCP_MUX) {
271 rtcp_packet_transport = nullptr;
272 rtcp_dtls_transport = nullptr;
273 }
274
275 if (flags & DTLS) {
276 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
277 } else {
278 if (flags & RAW_PACKET_TRANSPORT) {
279 return CreateUnencryptedTransport(rtp_packet_transport,
280 rtcp_packet_transport);
281 } else {
282 return CreateUnencryptedTransport(rtp_dtls_transport,
283 rtcp_dtls_transport);
284 }
285 }
286 }
287
288 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
289 rtc::PacketTransportInternal* rtp_packet_transport,
290 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200291 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200292 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700293
294 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
295 if (rtcp_packet_transport) {
296 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
297 }
298 return rtp_transport;
299 }
300
301 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
302 cricket::DtlsTransportInternal* rtp_dtls_transport,
303 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200304 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700305 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700306
307 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
308 rtcp_dtls_transport);
309 return dtls_srtp_transport;
310 }
311
deadbeeff5346592017-01-24 21:51:21 -0800312 void ConnectFakeTransports() {
313 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
314 bool asymmetric = false;
315 // Depending on test flags, could be using DTLS or raw packet transport.
316 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
317 fake_rtp_dtls_transport1_->SetDestination(
318 fake_rtp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
321 fake_rtcp_dtls_transport1_->SetDestination(
322 fake_rtcp_dtls_transport2_.get(), asymmetric);
323 }
324 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
325 fake_rtp_packet_transport1_->SetDestination(
326 fake_rtp_packet_transport2_.get(), asymmetric);
327 }
328 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
329 fake_rtcp_packet_transport1_->SetDestination(
330 fake_rtcp_packet_transport2_.get(), asymmetric);
331 }
332 });
333 }
334
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800337 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
339 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800341 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800343 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347 }
348 return result;
349 }
350
351 bool SendAccept() {
352 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356
357 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
361 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 return result;
366 }
367
368 bool SendProvisionalAnswer() {
369 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800370 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel2_->Enable(true);
373 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800374 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000384 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800385 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 return result;
387 }
388
deadbeeff5346592017-01-24 21:51:21 -0800389 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 channel1_.reset();
391 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800392 fake_rtp_dtls_transport1_.reset();
393 fake_rtcp_dtls_transport1_.reset();
394 fake_rtp_dtls_transport2_.reset();
395 fake_rtcp_dtls_transport2_.reset();
396 fake_rtp_packet_transport1_.reset();
397 fake_rtcp_packet_transport1_.reset();
398 fake_rtp_packet_transport2_.reset();
399 fake_rtcp_packet_transport2_.reset();
400 if (network_thread_keeper_) {
401 network_thread_keeper_.reset();
402 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 return true;
404 }
405
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200406 void SendRtp1() {
407 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
408 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp2() {
411 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
416 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
417 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
427 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200431 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
433 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200435 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
437 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
440 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::SetBE32(data.data() + 8, ssrc);
443 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000444 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000446 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 return data;
448 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
Yves Gerey665174f2018-06-19 15:03:05 +0200450 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
451 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452
453 void CreateContent(int flags,
454 const cricket::AudioCodec& audio_codec,
455 const cricket::VideoCodec& video_codec,
456 typename T::Content* content) {
457 // overridden in specialized classes
458 }
459 void CopyContent(const typename T::Content& source,
460 typename T::Content* content) {
461 // overridden in specialized classes
462 }
463
Steve Anton18ee1d52017-09-11 11:32:35 -0700464 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700466 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
467 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700468 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700469 AddLegacyStreamInContent(ssrc, 0, content);
470 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
472
ossu292d6582016-03-17 02:31:13 -0700473 // Will manage the lifetime of a CallThread, making sure it's
474 // destroyed before this object goes out of scope.
475 class ScopedCallThread {
476 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100478 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100479 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700480 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100481 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700482 }
483
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700485
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700487
488 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700490 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
493 return false; // overridden in specialized classes
494 }
495
deadbeeff5346592017-01-24 21:51:21 -0800496 void OnRtcpMuxFullyActive1(const std::string&) {
497 rtcp_mux_activated_callbacks1_++;
498 }
499 void OnRtcpMuxFullyActive2(const std::string&) {
500 rtcp_mux_activated_callbacks2_++;
501 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502
Honghai Zhangcc411c02016-03-29 17:27:21 -0700503 cricket::CandidatePairInterface* last_selected_candidate_pair() {
504 return last_selected_candidate_pair_;
505 }
506
Peter Boström0c4e06b2015-10-07 12:23:21 +0200507 void AddLegacyStreamInContent(uint32_t ssrc,
508 int flags,
509 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 // Base implementation.
511 }
512
513 // Tests that can be used by derived classes.
514
515 // Basic sanity check.
516 void TestInit() {
517 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700518 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200520 if (verify_playout_) {
521 EXPECT_FALSE(media_channel1_->playout());
522 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523 EXPECT_TRUE(media_channel1_->codecs().empty());
524 EXPECT_TRUE(media_channel1_->recv_streams().empty());
525 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 }
527
528 // Test that SetLocalContent and SetRemoteContent properly configure
529 // the codecs.
530 void TestSetContents() {
531 CreateChannels(0, 0);
532 typename T::Content content;
533 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800534 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800536 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200538 EXPECT_TRUE(
539 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 }
541
Johannes Kron9190b822018-10-29 11:22:05 +0100542 // Test that SetLocalContent and SetRemoteContent properly configure
543 // extmap-allow-mixed.
544 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
545 // For a caller, SetLocalContent() is called first with an offer and next
546 // SetRemoteContent() is called with the answer.
547 CreateChannels(0, 0);
548 typename T::Content content;
549 CreateContent(0, kPcmuCodec, kH264Codec, &content);
550 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
551 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
552 content.set_extmap_allow_mixed_enum(offer_enum);
553 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
554 content.set_extmap_allow_mixed_enum(answer_enum);
555 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
556 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
557 }
558 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
559 // For a callee, SetRemoteContent() is called first with an offer and next
560 // SetLocalContent() is called with the answer.
561 CreateChannels(0, 0);
562 typename T::Content content;
563 CreateContent(0, kPcmuCodec, kH264Codec, &content);
564 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
565 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
566 content.set_extmap_allow_mixed_enum(offer_enum);
567 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
568 content.set_extmap_allow_mixed_enum(answer_enum);
569 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
570 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
571 }
572
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 // Test that SetLocalContent and SetRemoteContent properly deals
574 // with an empty offer.
575 void TestSetContentsNullOffer() {
576 CreateChannels(0, 0);
577 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800578 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 CreateContent(0, kPcmuCodec, kH264Codec, &content);
580 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800581 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200583 EXPECT_TRUE(
584 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly set RTCP
588 // mux.
589 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800590 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
593 // Both sides agree on mux. Should no longer be a separate RTCP channel.
594 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800595 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
596 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800598 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800600 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 }
602
603 // Test that SetLocalContent and SetRemoteContent properly set RTCP
604 // mux when a provisional answer is received.
605 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800606 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 typename T::Content content;
608 CreateContent(0, kPcmuCodec, kH264Codec, &content);
609 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800610 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
611 EXPECT_TRUE(
612 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800613 // Both sides agree on mux. Should signal RTCP mux as fully activated.
614 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800615 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800616 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800620 EXPECT_TRUE(
621 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
622 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800623 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 }
625
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 // Test that SetLocalContent and SetRemoteContent properly
627 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800628 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 void TestChangeStreamParamsInContent() {
630 cricket::StreamParams stream1;
631 stream1.groupid = "group1";
632 stream1.id = "stream1";
633 stream1.ssrcs.push_back(kSsrc1);
634 stream1.cname = "stream1_cname";
635
636 cricket::StreamParams stream2;
637 stream2.groupid = "group1";
638 stream2.id = "stream2";
639 stream2.ssrcs.push_back(kSsrc2);
640 stream2.cname = "stream2_cname";
641
642 // Setup a call where channel 1 send |stream1| to channel 2.
643 CreateChannels(0, 0);
644 typename T::Content content1;
645 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
646 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_TRUE(channel1_->Enable(true));
649 EXPECT_EQ(1u, media_channel1_->send_streams().size());
650
Steve Anton3828c062017-12-06 10:34:51 -0800651 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800653 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654
655 // Channel 2 do not send anything.
656 typename T::Content content2;
657 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800658 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800660 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 EXPECT_TRUE(channel2_->Enable(true));
662 EXPECT_EQ(0u, media_channel2_->send_streams().size());
663
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200664 SendCustomRtp1(kSsrc1, 0);
665 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
667
668 // Let channel 2 update the content by sending |stream2| and enable SRTP.
669 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700670 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800672 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 ASSERT_EQ(1u, media_channel2_->send_streams().size());
674 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
675
Steve Anton3828c062017-12-06 10:34:51 -0800676 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
678 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
679
680 // Channel 1 replies but stop sending stream1.
681 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700682 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800683 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_EQ(0u, media_channel1_->send_streams().size());
685
Steve Anton3828c062017-12-06 10:34:51 -0800686 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
688
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200689 SendCustomRtp2(kSsrc2, 0);
690 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
692 }
693
694 // Test that we only start playout and sending at the right times.
695 void TestPlayoutAndSendingStates() {
696 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200697 if (verify_playout_) {
698 EXPECT_FALSE(media_channel1_->playout());
699 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200701 if (verify_playout_) {
702 EXPECT_FALSE(media_channel2_->playout());
703 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_FALSE(media_channel2_->sending());
705 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200706 if (verify_playout_) {
707 EXPECT_FALSE(media_channel1_->playout());
708 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800711 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200712 if (verify_playout_) {
713 EXPECT_TRUE(media_channel1_->playout());
714 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000716 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800717 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200718 if (verify_playout_) {
719 EXPECT_FALSE(media_channel2_->playout());
720 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000722 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800723 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 if (verify_playout_) {
725 EXPECT_FALSE(media_channel2_->playout());
726 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800728 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200729 if (verify_playout_) {
730 EXPECT_TRUE(media_channel1_->playout());
731 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200733 if (verify_playout_) {
734 EXPECT_FALSE(media_channel2_->playout());
735 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736 EXPECT_FALSE(media_channel2_->sending());
737 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200738 if (verify_playout_) {
739 EXPECT_TRUE(media_channel2_->playout());
740 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000742 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800743 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 if (verify_playout_) {
745 EXPECT_TRUE(media_channel1_->playout());
746 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_TRUE(media_channel1_->sending());
748 }
749
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 // Test that changing the MediaContentDirection in the local and remote
751 // session description start playout and sending at the right time.
752 void TestMediaContentDirection() {
753 CreateChannels(0, 0);
754 typename T::Content content1;
755 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
756 typename T::Content content2;
757 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
758 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800759 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760
761 EXPECT_TRUE(channel1_->Enable(true));
762 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
764 EXPECT_FALSE(media_channel1_->playout());
765 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
768 EXPECT_FALSE(media_channel2_->playout());
769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_FALSE(media_channel2_->sending());
771
Steve Anton3828c062017-12-06 10:34:51 -0800772 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
773 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
774 EXPECT_TRUE(
775 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
776 EXPECT_TRUE(
777 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800778 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779
Peter Boström34fbfff2015-09-24 19:20:30 +0200780 if (verify_playout_) {
781 EXPECT_TRUE(media_channel1_->playout());
782 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_FALSE(media_channel2_->playout()); // local InActive
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_FALSE(media_channel2_->sending()); // local InActive
788
789 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800790 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800791 EXPECT_TRUE(
792 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
793 EXPECT_TRUE(
794 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795
Peter Boström34fbfff2015-09-24 19:20:30 +0200796 if (verify_playout_) {
797 EXPECT_TRUE(media_channel1_->playout());
798 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200800 if (verify_playout_) {
801 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
802 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
804
805 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800806 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800807 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
808 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
Peter Boström34fbfff2015-09-24 19:20:30 +0200810 if (verify_playout_) {
811 EXPECT_TRUE(media_channel1_->playout());
812 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200814 if (verify_playout_) {
815 EXPECT_TRUE(media_channel2_->playout());
816 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817 EXPECT_TRUE(media_channel2_->sending());
818 }
819
Honghai Zhangcc411c02016-03-29 17:27:21 -0700820 // Tests that when the transport channel signals a candidate pair change
821 // event, the media channel will receive a call on the network route change.
822 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700823 static constexpr uint16_t kLocalNetId = 1;
824 static constexpr uint16_t kRemoteNetId = 2;
825 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800826 // Ipv4(20) + UDP(8).
827 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800828 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200829
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800830 CreateChannels(DTLS, DTLS);
831 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700832
Honghai Zhangcc411c02016-03-29 17:27:21 -0700833 typename T::MediaChannel* media_channel1 =
834 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200835 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700836
Zhi Huang942bc2e2017-11-13 13:26:07 -0800837 // Need to wait for the threads before calling
838 // |set_num_network_route_changes| because the network route would be set
839 // when creating the channel.
840 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200841 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800842 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800843 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200844 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800845 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
846
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200847 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200848 });
849 WaitForThreads();
850 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700851 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200852 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700853
eladalon05b07bb2017-08-24 07:40:16 -0700854 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800855 rtc::NetworkRoute network_route;
856 network_route.connected = true;
857 network_route.local_network_id = kLocalNetId;
858 network_route.remote_network_id = kRemoteNetId;
859 network_route.last_sent_packet_id = kLastPacketId;
860 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200861 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800862 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
863
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200864 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200865 });
866 WaitForThreads();
867 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100868 EXPECT_TRUE(media_channel1->last_network_route().connected);
869 EXPECT_EQ(kLocalNetId,
870 media_channel1->last_network_route().local_network_id);
871 EXPECT_EQ(kRemoteNetId,
872 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200873 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700874 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800875 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800876 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700877 }
878
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 // Test setting up a call.
880 void TestCallSetup() {
881 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700882 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200884 if (verify_playout_) {
885 EXPECT_TRUE(media_channel1_->playout());
886 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 EXPECT_FALSE(media_channel1_->sending());
888 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700889 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 EXPECT_TRUE(media_channel1_->sending());
891 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200892 if (verify_playout_) {
893 EXPECT_TRUE(media_channel2_->playout());
894 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895 EXPECT_TRUE(media_channel2_->sending());
896 EXPECT_EQ(1U, media_channel2_->codecs().size());
897 }
898
899 // Test that we don't crash if packets are sent during call teardown
900 // when RTCP mux is enabled. This is a regression test against a specific
901 // race condition that would only occur when a RTCP packet was sent during
902 // teardown of a channel on which RTCP mux was enabled.
903 void TestCallTeardownRtcpMux() {
904 class LastWordMediaChannel : public T::MediaChannel {
905 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200906 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700908 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
909 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
911 }
912 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200913 CreateChannels(std::make_unique<LastWordMediaChannel>(),
914 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200915 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 EXPECT_TRUE(SendInitiate());
917 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800918 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 }
920
921 // Send voice RTP data to the other side and ensure it gets there.
922 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700923 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000924 EXPECT_TRUE(SendInitiate());
925 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700926 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
927 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200928 SendRtp1();
929 SendRtp2();
930 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931 EXPECT_TRUE(CheckRtp1());
932 EXPECT_TRUE(CheckRtp2());
933 EXPECT_TRUE(CheckNoRtp1());
934 EXPECT_TRUE(CheckNoRtp2());
935 }
936
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200937 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800938 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200939 EXPECT_TRUE(SendInitiate());
940 EXPECT_TRUE(SendAccept());
941 SendRtp1();
942 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200943 // Do not wait, destroy channels.
944 channel1_.reset(nullptr);
945 channel2_.reset(nullptr);
946 }
947
Zhi Huange830e682018-03-30 10:48:35 -0700948 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
949 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700950 EXPECT_FALSE(channel1_->srtp_active());
951 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200953 WaitForThreads();
954 EXPECT_TRUE(channel1_->writable());
955 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700957 EXPECT_TRUE(channel1_->srtp_active());
958 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200959 SendRtp1();
960 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200961 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962 EXPECT_TRUE(CheckRtp1());
963 EXPECT_TRUE(CheckRtp2());
964 EXPECT_TRUE(CheckNoRtp1());
965 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 }
967
968 // Test that we can send and receive early media when a provisional answer is
969 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
970 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200971 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972
Yves Gerey665174f2018-06-19 15:03:05 +0200973 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
974 EXPECT_TRUE(SendOffer());
975 EXPECT_TRUE(SendProvisionalAnswer());
976 EXPECT_TRUE(channel1_->srtp_active());
977 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700978 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
979 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +0200980 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200981 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
982 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200983 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984
Yves Gerey665174f2018-06-19 15:03:05 +0200985 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200986 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
987 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200988 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989
Yves Gerey665174f2018-06-19 15:03:05 +0200990 // Complete call setup and ensure everything is still OK.
991 EXPECT_TRUE(SendFinalAnswer());
992 EXPECT_TRUE(channel1_->srtp_active());
993 EXPECT_TRUE(channel2_->srtp_active());
Yves Gerey665174f2018-06-19 15:03:05 +0200994 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200995 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
996 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200997 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200998 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 }
1000
1001 // Test that we properly send RTP without SRTP from a thread.
1002 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001003 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 EXPECT_TRUE(SendInitiate());
1005 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001006 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1007 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001008 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001009 WaitForThreads(involved_threads);
1010 EXPECT_TRUE(CheckRtp1());
1011 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001012 EXPECT_TRUE(CheckNoRtp1());
1013 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 }
1015
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 // Test that the mediachannel retains its sending state after the transport
1017 // becomes non-writable.
1018 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001019 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_TRUE(SendInitiate());
1021 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001022 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1023 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001024 SendRtp1();
1025 SendRtp2();
1026 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 EXPECT_TRUE(CheckRtp1());
1028 EXPECT_TRUE(CheckRtp2());
1029 EXPECT_TRUE(CheckNoRtp1());
1030 EXPECT_TRUE(CheckNoRtp2());
1031
wu@webrtc.org97077a32013-10-25 21:18:33 +00001032 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001033 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1034 fake_rtp_dtls_transport1_->SetWritable(false);
1035 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001036 SendRtp1();
1037 SendRtp2();
1038 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039 EXPECT_TRUE(CheckRtp1());
1040 EXPECT_TRUE(CheckNoRtp2());
1041
1042 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001043 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1044 fake_rtp_dtls_transport1_->SetWritable(true);
1045 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001047 SendRtp1();
1048 SendRtp2();
1049 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 EXPECT_TRUE(CheckRtp1());
1051 EXPECT_TRUE(CheckRtp2());
1052 EXPECT_TRUE(CheckNoRtp1());
1053 EXPECT_TRUE(CheckNoRtp2());
1054
1055 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001056 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1057 bool asymmetric = true;
1058 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1059 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 EXPECT_TRUE(media_channel1_->sending());
1061
wu@webrtc.org97077a32013-10-25 21:18:33 +00001062 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001063 SendRtp1();
1064 SendRtp2();
1065 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066 EXPECT_TRUE(CheckRtp1());
1067 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001068 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069
1070 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001071 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001072 bool asymmetric = true;
1073 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1074 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001075 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001077 SendRtp1();
1078 SendRtp2();
1079 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(CheckRtp1());
1081 EXPECT_TRUE(CheckRtp2());
1082 EXPECT_TRUE(CheckNoRtp1());
1083 EXPECT_TRUE(CheckNoRtp2());
1084 }
1085
Yves Gerey665174f2018-06-19 15:03:05 +02001086 void SendBundleToBundle(const int* pl_types,
1087 int len,
1088 bool rtcp_mux,
1089 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001090 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001092 // Only pl_type1 was added to the bundle filter for both |channel1_|
1093 // and |channel2_|.
1094 int pl_type1 = pl_types[0];
1095 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001096 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001097 if (secure)
1098 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001099 if (rtcp_mux) {
1100 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001101 }
1102 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001103 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001105
1106 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001107 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1108 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1109 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001110 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001111 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1112 EXPECT_TRUE(CheckNoRtp1());
1113 EXPECT_TRUE(CheckNoRtp2());
1114
Zhi Huang365381f2018-04-13 16:44:34 -07001115 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1116 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001117 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001118 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1119 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 }
1121
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122 void TestSetContentFailure() {
1123 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124
Peter Thatchera6d24442015-07-09 21:26:36 -07001125 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001126 std::unique_ptr<typename T::Content> content(
1127 CreateMediaContentWithStream(1));
1128
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001130 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001131 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001132 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001133 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001136 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001137 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001138
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001140 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001141 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 }
1143
1144 void TestSendTwoOffers() {
1145 CreateChannels(0, 0);
1146
Peter Thatchera6d24442015-07-09 21:26:36 -07001147 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001148 std::unique_ptr<typename T::Content> content1(
1149 CreateMediaContentWithStream(1));
1150 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001151 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1153
Steve Anton18ee1d52017-09-11 11:32:35 -07001154 std::unique_ptr<typename T::Content> content2(
1155 CreateMediaContentWithStream(2));
1156 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001157 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1159 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1160 }
1161
1162 void TestReceiveTwoOffers() {
1163 CreateChannels(0, 0);
1164
Peter Thatchera6d24442015-07-09 21:26:36 -07001165 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001166 std::unique_ptr<typename T::Content> content1(
1167 CreateMediaContentWithStream(1));
1168 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001169 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1171
Steve Anton18ee1d52017-09-11 11:32:35 -07001172 std::unique_ptr<typename T::Content> content2(
1173 CreateMediaContentWithStream(2));
1174 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001175 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1177 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1178 }
1179
1180 void TestSendPrAnswer() {
1181 CreateChannels(0, 0);
1182
Peter Thatchera6d24442015-07-09 21:26:36 -07001183 std::string err;
1184 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001185 std::unique_ptr<typename T::Content> content1(
1186 CreateMediaContentWithStream(1));
1187 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001188 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1190
Peter Thatchera6d24442015-07-09 21:26:36 -07001191 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001192 std::unique_ptr<typename T::Content> content2(
1193 CreateMediaContentWithStream(2));
1194 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001195 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1197 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1198
Peter Thatchera6d24442015-07-09 21:26:36 -07001199 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001200 std::unique_ptr<typename T::Content> content3(
1201 CreateMediaContentWithStream(3));
1202 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001203 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1205 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1206 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1207 }
1208
1209 void TestReceivePrAnswer() {
1210 CreateChannels(0, 0);
1211
Peter Thatchera6d24442015-07-09 21:26:36 -07001212 std::string err;
1213 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001214 std::unique_ptr<typename T::Content> content1(
1215 CreateMediaContentWithStream(1));
1216 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001217 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1219
Peter Thatchera6d24442015-07-09 21:26:36 -07001220 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001221 std::unique_ptr<typename T::Content> content2(
1222 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001223 EXPECT_TRUE(
1224 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1226 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1227
Peter Thatchera6d24442015-07-09 21:26:36 -07001228 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001229 std::unique_ptr<typename T::Content> content3(
1230 CreateMediaContentWithStream(3));
1231 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001232 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1234 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1235 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1236 }
1237
zstein56162b92017-04-24 16:54:35 -07001238 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001239 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001241
zstein56162b92017-04-24 16:54:35 -07001242 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001243 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244 EXPECT_TRUE(media_channel1_->ready_to_send());
1245
zstein56162b92017-04-24 16:54:35 -07001246 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001247 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249 }
1250
skvladdc1c62c2016-03-16 19:07:43 -07001251 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1252 typename T::Content content;
1253 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1254 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001255 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001256 }
1257
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001258 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001259 webrtc::RtpParameters parameters;
1260 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001261 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001262 parameters.encodings.push_back(encoding);
1263 return parameters;
1264 }
1265
1266 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001267 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001268 EXPECT_EQ(1UL, parameters.encodings.size());
1269 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1270 }
1271
1272 void DefaultMaxBitrateIsUnlimited() {
1273 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001274 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1275 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001276 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001277 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001278 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001279 }
1280
Zhi Huange830e682018-03-30 10:48:35 -07001281 // Test that when a channel gets new RtpTransport with a call to
1282 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1283 // with the options on the new one.
1284
Steve Anton8a63f782017-10-23 13:08:53 -07001285 // For example, audio and video may use separate socket options, but initially
1286 // be unbundled, then later become bundled. When this happens, their preferred
1287 // socket options should be merged to the underlying transport they share.
1288 void SocketOptionsMergedOnSetTransport() {
1289 constexpr int kSndBufSize = 4000;
1290 constexpr int kRcvBufSize = 8000;
1291
Zhi Huange830e682018-03-30 10:48:35 -07001292 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001293
1294 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1295 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1296 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1297 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1298
Zhi Huange830e682018-03-30 10:48:35 -07001299 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001300 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001301 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001302
1303 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001304 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1305 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001306 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001307 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1308 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001309 EXPECT_EQ(kRcvBufSize, option_val);
1310 }
1311
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001312 void CreateSimulcastContent(const std::vector<std::string>& rids,
1313 typename T::Content* content) {
1314 std::vector<RidDescription> rid_descriptions;
1315 for (const std::string name : rids) {
1316 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1317 }
1318
1319 StreamParams stream;
1320 stream.set_rids(rid_descriptions);
1321 CreateContent(0, kPcmuCodec, kH264Codec, content);
1322 // This is for unified plan, so there can be only one StreamParams.
1323 content->mutable_streams().clear();
1324 content->AddStream(stream);
1325 }
1326
1327 void VerifySimulcastStreamParams(const StreamParams& expected,
1328 const typename T::Channel* channel) {
1329 const std::vector<StreamParams>& streams = channel->local_streams();
1330 ASSERT_EQ(1u, streams.size());
1331 const StreamParams& result = streams[0];
1332 EXPECT_EQ(expected.rids(), result.rids());
1333 EXPECT_TRUE(result.has_ssrcs());
1334 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1335 std::vector<uint32_t> primary_ssrcs;
1336 result.GetPrimarySsrcs(&primary_ssrcs);
1337 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1338 }
1339
1340 void TestUpdateLocalStreamsWithSimulcast() {
1341 CreateChannels(0, 0);
1342 typename T::Content content1, content2, content3;
1343 CreateSimulcastContent({"f", "h", "q"}, &content1);
1344 EXPECT_TRUE(
1345 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1346 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1347 StreamParams stream1 = channel1_->local_streams()[0];
1348
1349 // Create a similar offer. SetLocalContent should not remove and add.
1350 CreateSimulcastContent({"f", "h", "q"}, &content2);
1351 EXPECT_TRUE(
1352 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1353 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1354 StreamParams stream2 = channel1_->local_streams()[0];
1355 // Check that the streams are identical (SSRCs didn't change).
1356 EXPECT_EQ(stream1, stream2);
1357
1358 // Create third offer that has same RIDs in different order.
1359 CreateSimulcastContent({"f", "q", "h"}, &content3);
1360 EXPECT_TRUE(
1361 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1362 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1363 }
1364
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001366 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1367 static void ProcessThreadQueue(rtc::Thread* thread) {
1368 RTC_DCHECK(thread->IsCurrent());
1369 while (!thread->empty()) {
1370 thread->ProcessMessages(0);
1371 }
1372 }
1373 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1374 // |threads| and current thread post packets to network thread.
1375 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001376 thread->Invoke<void>(RTC_FROM_HERE,
1377 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001378 }
1379 ProcessThreadQueue(rtc::Thread::Current());
1380 // Network thread move them around and post back to worker = current thread.
1381 if (!network_thread_->IsCurrent()) {
1382 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001383 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001384 }
1385 // Worker thread = current Thread process received messages.
1386 ProcessThreadQueue(rtc::Thread::Current());
1387 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001388 // TODO(pbos): Remove playout from all media channels and let renderers mute
1389 // themselves.
1390 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001391 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1392 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001393 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1394 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1395 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1396 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1397 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1398 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1399 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1400 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001401 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1402 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1403 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 cricket::FakeMediaEngine media_engine_;
1405 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001406 typename T::MediaChannel* media_channel1_ = nullptr;
1407 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001408 std::unique_ptr<typename T::Channel> channel1_;
1409 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001410 typename T::Content local_media_content1_;
1411 typename T::Content local_media_content2_;
1412 typename T::Content remote_media_content1_;
1413 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001415 rtc::Buffer rtp_packet_;
1416 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001417 int rtcp_mux_activated_callbacks1_ = 0;
1418 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001419 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001420 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421};
1422
Yves Gerey665174f2018-06-19 15:03:05 +02001423template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001424std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1425 rtc::Thread* worker_thread,
1426 rtc::Thread* network_thread,
1427 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1428 webrtc::RtpTransportInternal* rtp_transport,
1429 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001430 rtc::Thread* signaling_thread = rtc::Thread::Current();
1431 auto channel = std::make_unique<cricket::VoiceChannel>(
1432 worker_thread, network_thread, signaling_thread, std::move(ch),
1433 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1434 &ssrc_generator_);
1435 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
1436 return channel;
1437}
1438
1439template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440void ChannelTest<VoiceTraits>::CreateContent(
1441 int flags,
1442 const cricket::AudioCodec& audio_codec,
1443 const cricket::VideoCodec& video_codec,
1444 cricket::AudioContentDescription* audio) {
1445 audio->AddCodec(audio_codec);
1446 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447}
1448
Yves Gerey665174f2018-06-19 15:03:05 +02001449template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450void ChannelTest<VoiceTraits>::CopyContent(
1451 const cricket::AudioContentDescription& source,
1452 cricket::AudioContentDescription* audio) {
1453 *audio = source;
1454}
1455
Yves Gerey665174f2018-06-19 15:03:05 +02001456template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1458 const cricket::AudioCodec& c2) {
1459 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001460 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461}
1462
Peter Boström0c4e06b2015-10-07 12:23:21 +02001463template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001465 uint32_t ssrc,
1466 int flags,
1467 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001468 audio->AddLegacyStream(ssrc);
1469}
1470
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001471class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001472 public:
solenberg1dd98f32015-09-10 01:57:14 -07001473 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001474 VoiceChannelSingleThreadTest()
1475 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1476};
1477
1478class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1479 public:
1480 typedef ChannelTest<VoiceTraits> Base;
1481 VoiceChannelDoubleThreadTest()
1482 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483};
1484
jbauch5869f502017-06-29 12:31:36 -07001485class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001486 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001487 public:
1488 typedef ChannelTest<VoiceTraits> Base;
1489 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001490 : Base(true,
1491 kPcmuFrameWithExtensions,
1492 kRtcpReport,
1493 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001494};
1495
1496class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001497 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001498 public:
1499 typedef ChannelTest<VoiceTraits> Base;
1500 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001501 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1502 }
jbauch5869f502017-06-29 12:31:36 -07001503};
1504
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001506template <>
Steve Anton8699a322017-11-06 15:53:33 -08001507std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001508 rtc::Thread* worker_thread,
1509 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001510 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001511 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001512 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001513 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001514 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001515 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001516 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1517 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001518 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519 return channel;
1520}
1521
Yves Gerey665174f2018-06-19 15:03:05 +02001522template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523void ChannelTest<VideoTraits>::CreateContent(
1524 int flags,
1525 const cricket::AudioCodec& audio_codec,
1526 const cricket::VideoCodec& video_codec,
1527 cricket::VideoContentDescription* video) {
1528 video->AddCodec(video_codec);
1529 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530}
1531
Yves Gerey665174f2018-06-19 15:03:05 +02001532template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533void ChannelTest<VideoTraits>::CopyContent(
1534 const cricket::VideoContentDescription& source,
1535 cricket::VideoContentDescription* video) {
1536 *video = source;
1537}
1538
Yves Gerey665174f2018-06-19 15:03:05 +02001539template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1541 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001542 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543}
1544
Peter Boström0c4e06b2015-10-07 12:23:21 +02001545template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001547 uint32_t ssrc,
1548 int flags,
1549 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 video->AddLegacyStream(ssrc);
1551}
1552
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001553class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 public:
solenberg1dd98f32015-09-10 01:57:14 -07001555 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001556 VideoChannelSingleThreadTest()
1557 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558};
1559
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001560class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1561 public:
1562 typedef ChannelTest<VideoTraits> Base;
1563 VideoChannelDoubleThreadTest()
1564 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1565};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001567TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 Base::TestInit();
1569 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1570 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1571}
1572
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001573TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1574 Base::TestDeinit();
1575}
1576
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001577TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 Base::TestSetContents();
1579}
1580
Johannes Kron9190b822018-10-29 11:22:05 +01001581TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1582 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1583}
1584
1585TEST_F(VoiceChannelSingleThreadTest,
1586 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1587 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1588}
1589
1590TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1591 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1592}
1593
1594TEST_F(VoiceChannelSingleThreadTest,
1595 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1596 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1597}
1598
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001599TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 Base::TestSetContentsNullOffer();
1601}
1602
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001603TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 Base::TestSetContentsRtcpMux();
1605}
1606
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001607TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 Base::TestSetContentsRtcpMux();
1609}
1610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 Base::TestChangeStreamParamsInContent();
1613}
1614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001615TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001616 Base::TestPlayoutAndSendingStates();
1617}
1618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001619TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620 Base::TestMediaContentDirection();
1621}
1622
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001623TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001624 Base::TestNetworkRouteChanges();
1625}
1626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 Base::TestCallSetup();
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 Base::TestCallTeardownRtcpMux();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::SendRtpToRtp();
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001640 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641}
1642
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001644 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 Base::SendRtpToRtpOnThread();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::SendWithWritabilityLoss();
1657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 Base::TestSetContentFailure();
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 Base::TestSendTwoOffers();
1665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 Base::TestReceiveTwoOffers();
1669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 Base::TestSendPrAnswer();
1673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 Base::TestReceivePrAnswer();
1677}
1678
zstein56162b92017-04-24 16:54:35 -07001679TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1680 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681}
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001684 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001688 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001692 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001696 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001697}
1698
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001699TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001700 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001701}
1702
Steve Anton8a63f782017-10-23 13:08:53 -07001703TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1704 Base::SocketOptionsMergedOnSetTransport();
1705}
1706
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001707// VoiceChannelDoubleThreadTest
1708TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1711 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712}
1713
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001714TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1715 Base::TestDeinit();
1716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 Base::TestSetContents();
1720}
1721
Johannes Kron9190b822018-10-29 11:22:05 +01001722TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1723 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1724}
1725
1726TEST_F(VoiceChannelDoubleThreadTest,
1727 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1728 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1729}
1730
1731TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1732 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1733}
1734
1735TEST_F(VoiceChannelDoubleThreadTest,
1736 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1737 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1738}
1739
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 Base::TestSetContentsNullOffer();
1742}
1743
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 Base::TestSetContentsRtcpMux();
1746}
1747
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001748TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 Base::TestSetContentsRtcpMux();
1750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753 Base::TestChangeStreamParamsInContent();
1754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 Base::TestPlayoutAndSendingStates();
1758}
1759
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001760TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1761 Base::TestMediaContentDirection();
1762}
1763
1764TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1765 Base::TestNetworkRouteChanges();
1766}
1767
1768TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1769 Base::TestCallSetup();
1770}
1771
1772TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1773 Base::TestCallTeardownRtcpMux();
1774}
1775
1776TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1777 Base::SendRtpToRtp();
1778}
1779
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001781 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782}
1783
1784TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001785 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1789 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1790}
1791
1792TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1793 Base::SendRtpToRtpOnThread();
1794}
1795
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1797 Base::SendWithWritabilityLoss();
1798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1801 Base::TestSetContentFailure();
1802}
1803
1804TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1805 Base::TestSendTwoOffers();
1806}
1807
1808TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1809 Base::TestReceiveTwoOffers();
1810}
1811
1812TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1813 Base::TestSendPrAnswer();
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1817 Base::TestReceivePrAnswer();
1818}
1819
zstein56162b92017-04-24 16:54:35 -07001820TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1821 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001822}
1823
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001824TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1825 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1826}
1827
1828TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1829 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1830}
1831
1832TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1833 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1834}
1835
1836TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1837 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1838}
1839
1840TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1841 Base::DefaultMaxBitrateIsUnlimited();
1842}
1843
Steve Anton8a63f782017-10-23 13:08:53 -07001844TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1845 Base::SocketOptionsMergedOnSetTransport();
1846}
1847
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001848// VideoChannelSingleThreadTest
1849TEST_F(VideoChannelSingleThreadTest, TestInit) {
1850 Base::TestInit();
1851}
1852
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001853TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1854 Base::TestDeinit();
1855}
1856
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001857TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1858 Base::TestSetContents();
1859}
1860
Johannes Kron9190b822018-10-29 11:22:05 +01001861TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1862 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1863}
1864
1865TEST_F(VideoChannelSingleThreadTest,
1866 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1867 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1868}
1869
1870TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1871 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1872}
1873
1874TEST_F(VideoChannelSingleThreadTest,
1875 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1876 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1877}
1878
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1880 Base::TestSetContentsNullOffer();
1881}
1882
1883TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1884 Base::TestSetContentsRtcpMux();
1885}
1886
1887TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1888 Base::TestSetContentsRtcpMux();
1889}
1890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001891TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1892 Base::TestChangeStreamParamsInContent();
1893}
1894
1895TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1896 Base::TestPlayoutAndSendingStates();
1897}
1898
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001899TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 Base::TestMediaContentDirection();
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001904 Base::TestNetworkRouteChanges();
1905}
1906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001907TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 Base::TestCallSetup();
1909}
1910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 Base::TestCallTeardownRtcpMux();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 Base::SendRtpToRtp();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001920 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001924 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 Base::SendRtpToRtpOnThread();
1933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 Base::SendWithWritabilityLoss();
1937}
1938
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001939TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940 Base::TestSetContentFailure();
1941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944 Base::TestSendTwoOffers();
1945}
1946
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 Base::TestReceiveTwoOffers();
1949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 Base::TestSendPrAnswer();
1953}
1954
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001955TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 Base::TestReceivePrAnswer();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001960 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961}
1962
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001963TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001964 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001965}
1966
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001967TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001968 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001969}
1970
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001971TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001972 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973}
1974
zstein56162b92017-04-24 16:54:35 -07001975TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1976 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977}
1978
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001979TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001980 Base::DefaultMaxBitrateIsUnlimited();
1981}
1982
Steve Anton8a63f782017-10-23 13:08:53 -07001983TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1984 Base::SocketOptionsMergedOnSetTransport();
1985}
1986
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001987TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1988 Base::TestUpdateLocalStreamsWithSimulcast();
1989}
1990
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001991TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1992 const cricket::VideoCodec kVp8Codec(97, "VP8");
1993 cricket::VideoCodec vp9_codec(98, "VP9");
1994 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1995 cricket::VideoContentDescription video;
1996 video.set_codecs({kVp8Codec, vp9_codec});
1997
1998 CreateChannels(0, 0);
1999
2000 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2001 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2002 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2003 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2004 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2005 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2006 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2007 cricket::kPacketizationParamRaw);
2008}
2009
2010TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2011 const cricket::VideoCodec kVp8Codec(97, "VP8");
2012 cricket::VideoCodec vp9_codec(98, "VP9");
2013 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2014 cricket::VideoContentDescription video;
2015 video.set_codecs({kVp8Codec, vp9_codec});
2016
2017 CreateChannels(0, 0);
2018
2019 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2020 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2021 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2022 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2023 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2024 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2025 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2026 cricket::kPacketizationParamRaw);
2027}
2028
2029TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2030 const cricket::VideoCodec kVp8Codec(97, "VP8");
2031 cricket::VideoCodec vp9_codec(98, "VP9");
2032 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2033 cricket::VideoContentDescription video;
2034 video.set_codecs({kVp8Codec, vp9_codec});
2035
2036 CreateChannels(0, 0);
2037
2038 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2039 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2040 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2041 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2042 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2043 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2044 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2045 cricket::kPacketizationParamRaw);
2046 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2047 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2048 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2049 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2050 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2051 cricket::kPacketizationParamRaw);
2052}
2053
2054TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2055 const cricket::VideoCodec kLocalCodec(98, "VP8");
2056 cricket::VideoCodec remote_codec(99, "VP8");
2057 remote_codec.packetization = cricket::kPacketizationParamRaw;
2058 cricket::VideoContentDescription local_video;
2059 local_video.set_codecs({kLocalCodec});
2060 cricket::VideoContentDescription remote_video;
2061 remote_video.set_codecs({remote_codec});
2062
2063 CreateChannels(0, 0);
2064
2065 EXPECT_TRUE(
2066 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2067 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2068 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2069 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2070 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2071 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2072}
2073
2074TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2075 cricket::VideoCodec local_codec(98, "VP8");
2076 local_codec.packetization = cricket::kPacketizationParamRaw;
2077 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2078 cricket::VideoContentDescription local_video;
2079 local_video.set_codecs({local_codec});
2080 cricket::VideoContentDescription remote_video;
2081 remote_video.set_codecs({kRemoteCodec});
2082
2083 CreateChannels(0, 0);
2084
2085 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2086 EXPECT_TRUE(
2087 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2088 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2089 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2090 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2091 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2092}
2093
2094TEST_F(VideoChannelSingleThreadTest,
2095 TestSetRemoteAnswerWithInvalidPacketization) {
2096 cricket::VideoCodec local_codec(98, "VP8");
2097 local_codec.packetization = cricket::kPacketizationParamRaw;
2098 cricket::VideoCodec remote_codec(99, "VP8");
2099 remote_codec.packetization = "unknownpacketizationattributevalue";
2100 cricket::VideoContentDescription local_video;
2101 local_video.set_codecs({local_codec});
2102 cricket::VideoContentDescription remote_video;
2103 remote_video.set_codecs({remote_codec});
2104
2105 CreateChannels(0, 0);
2106
2107 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2108 EXPECT_FALSE(
2109 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2110 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2111 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2112 cricket::kPacketizationParamRaw);
2113 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2114}
2115
2116TEST_F(VideoChannelSingleThreadTest,
2117 TestSetLocalAnswerWithInvalidPacketization) {
2118 cricket::VideoCodec local_codec(98, "VP8");
2119 local_codec.packetization = cricket::kPacketizationParamRaw;
2120 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2121 cricket::VideoContentDescription local_video;
2122 local_video.set_codecs({local_codec});
2123 cricket::VideoContentDescription remote_video;
2124 remote_video.set_codecs({kRemoteCodec});
2125
2126 CreateChannels(0, 0);
2127
2128 EXPECT_TRUE(
2129 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2130 EXPECT_FALSE(
2131 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2132 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2133 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2134 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2135}
2136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002137// VideoChannelDoubleThreadTest
2138TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2139 Base::TestInit();
2140}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002142TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2143 Base::TestDeinit();
2144}
2145
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002146TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2147 Base::TestSetContents();
2148}
2149
Johannes Kron9190b822018-10-29 11:22:05 +01002150TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2151 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2152}
2153
2154TEST_F(VideoChannelDoubleThreadTest,
2155 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2156 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2157}
2158
2159TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2160 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2161}
2162
2163TEST_F(VideoChannelDoubleThreadTest,
2164 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2165 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2166}
2167
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002168TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2169 Base::TestSetContentsNullOffer();
2170}
2171
2172TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2173 Base::TestSetContentsRtcpMux();
2174}
2175
2176TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2177 Base::TestSetContentsRtcpMux();
2178}
2179
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002180TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2181 Base::TestChangeStreamParamsInContent();
2182}
2183
2184TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2185 Base::TestPlayoutAndSendingStates();
2186}
2187
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002188TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2189 Base::TestMediaContentDirection();
2190}
2191
2192TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2193 Base::TestNetworkRouteChanges();
2194}
2195
2196TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2197 Base::TestCallSetup();
2198}
2199
2200TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2201 Base::TestCallTeardownRtcpMux();
2202}
2203
2204TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2205 Base::SendRtpToRtp();
2206}
2207
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002208TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002209 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002210}
2211
2212TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002213 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002214}
2215
2216TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2217 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2218}
2219
2220TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2221 Base::SendRtpToRtpOnThread();
2222}
2223
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002224TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2225 Base::SendWithWritabilityLoss();
2226}
2227
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002228TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2229 Base::TestSetContentFailure();
2230}
2231
2232TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2233 Base::TestSendTwoOffers();
2234}
2235
2236TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2237 Base::TestReceiveTwoOffers();
2238}
2239
2240TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2241 Base::TestSendPrAnswer();
2242}
2243
2244TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2245 Base::TestReceivePrAnswer();
2246}
2247
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2249 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2250}
2251
2252TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2253 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2254}
2255
2256TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2257 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2258}
2259
2260TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2261 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2262}
2263
zstein56162b92017-04-24 16:54:35 -07002264TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2265 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002266}
2267
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2269 Base::DefaultMaxBitrateIsUnlimited();
2270}
2271
Steve Anton8a63f782017-10-23 13:08:53 -07002272TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2273 Base::SocketOptionsMergedOnSetTransport();
2274}
2275
deadbeef953c2ce2017-01-09 14:53:41 -08002276// RtpDataChannelSingleThreadTest
2277class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002279 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002280 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002281 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2282};
2283
deadbeef953c2ce2017-01-09 14:53:41 -08002284// RtpDataChannelDoubleThreadTest
2285class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002286 public:
2287 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002288 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290};
2291
2292// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002293template <>
Steve Anton8699a322017-11-06 15:53:33 -08002294std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295 rtc::Thread* worker_thread,
2296 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002297 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002298 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002299 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002300 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002301 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002302 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002303 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2304 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002305 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306 return channel;
2307}
2308
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002309template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310void ChannelTest<DataTraits>::CreateContent(
2311 int flags,
2312 const cricket::AudioCodec& audio_codec,
2313 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002314 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315 data->AddCodec(kGoogleDataCodec);
2316 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317}
2318
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002319template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002321 const cricket::RtpDataContentDescription& source,
2322 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 *data = source;
2324}
2325
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002326template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2328 const cricket::DataCodec& c2) {
2329 return c1.name == c2.name;
2330}
2331
Peter Boström0c4e06b2015-10-07 12:23:21 +02002332template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002334 uint32_t ssrc,
2335 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002336 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337 data->AddLegacyStream(ssrc);
2338}
2339
deadbeef953c2ce2017-01-09 14:53:41 -08002340TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 Base::TestInit();
2342 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2343}
2344
deadbeef953c2ce2017-01-09 14:53:41 -08002345TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002346 Base::TestDeinit();
2347}
2348
deadbeef953c2ce2017-01-09 14:53:41 -08002349TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 Base::TestSetContents();
2351}
2352
deadbeef953c2ce2017-01-09 14:53:41 -08002353TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 Base::TestSetContentsNullOffer();
2355}
2356
deadbeef953c2ce2017-01-09 14:53:41 -08002357TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 Base::TestSetContentsRtcpMux();
2359}
2360
deadbeef953c2ce2017-01-09 14:53:41 -08002361TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 Base::TestChangeStreamParamsInContent();
2363}
2364
deadbeef953c2ce2017-01-09 14:53:41 -08002365TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 Base::TestPlayoutAndSendingStates();
2367}
2368
deadbeef953c2ce2017-01-09 14:53:41 -08002369TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 Base::TestMediaContentDirection();
2371}
2372
deadbeef953c2ce2017-01-09 14:53:41 -08002373TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 Base::TestCallSetup();
2375}
2376
deadbeef953c2ce2017-01-09 14:53:41 -08002377TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 Base::TestCallTeardownRtcpMux();
2379}
2380
zstein56162b92017-04-24 16:54:35 -07002381TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2382 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383}
2384
deadbeef953c2ce2017-01-09 14:53:41 -08002385TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386 Base::SendRtpToRtp();
2387}
2388
deadbeef953c2ce2017-01-09 14:53:41 -08002389TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 Base::SendRtpToRtpOnThread();
2391}
2392
deadbeef953c2ce2017-01-09 14:53:41 -08002393TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394 Base::SendWithWritabilityLoss();
2395}
2396
Steve Anton8a63f782017-10-23 13:08:53 -07002397TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2398 Base::SocketOptionsMergedOnSetTransport();
2399}
2400
deadbeef953c2ce2017-01-09 14:53:41 -08002401TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002402 CreateChannels(0, 0);
2403 EXPECT_TRUE(SendInitiate());
2404 EXPECT_TRUE(SendAccept());
2405
2406 cricket::SendDataParams params;
2407 params.ssrc = 42;
2408 unsigned char data[] = {'f', 'o', 'o'};
2409 rtc::CopyOnWriteBuffer payload(data, 3);
2410 cricket::SendDataResult result;
2411 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2412 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2413 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2414}
2415
deadbeef953c2ce2017-01-09 14:53:41 -08002416TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002417 Base::TestInit();
2418 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2419}
2420
deadbeef953c2ce2017-01-09 14:53:41 -08002421TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002422 Base::TestDeinit();
2423}
2424
deadbeef953c2ce2017-01-09 14:53:41 -08002425TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002426 Base::TestSetContents();
2427}
2428
deadbeef953c2ce2017-01-09 14:53:41 -08002429TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002430 Base::TestSetContentsNullOffer();
2431}
2432
deadbeef953c2ce2017-01-09 14:53:41 -08002433TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002434 Base::TestSetContentsRtcpMux();
2435}
2436
deadbeef953c2ce2017-01-09 14:53:41 -08002437TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002438 Base::TestChangeStreamParamsInContent();
2439}
2440
deadbeef953c2ce2017-01-09 14:53:41 -08002441TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002442 Base::TestPlayoutAndSendingStates();
2443}
2444
deadbeef953c2ce2017-01-09 14:53:41 -08002445TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002446 Base::TestMediaContentDirection();
2447}
2448
deadbeef953c2ce2017-01-09 14:53:41 -08002449TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002450 Base::TestCallSetup();
2451}
2452
deadbeef953c2ce2017-01-09 14:53:41 -08002453TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002454 Base::TestCallTeardownRtcpMux();
2455}
2456
zstein56162b92017-04-24 16:54:35 -07002457TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2458 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002459}
2460
deadbeef953c2ce2017-01-09 14:53:41 -08002461TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002462 Base::SendRtpToRtp();
2463}
2464
deadbeef953c2ce2017-01-09 14:53:41 -08002465TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002466 Base::SendRtpToRtpOnThread();
2467}
2468
deadbeef953c2ce2017-01-09 14:53:41 -08002469TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002470 Base::SendWithWritabilityLoss();
2471}
2472
Steve Anton8a63f782017-10-23 13:08:53 -07002473TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2474 Base::SocketOptionsMergedOnSetTransport();
2475}
2476
deadbeef953c2ce2017-01-09 14:53:41 -08002477TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 CreateChannels(0, 0);
2479 EXPECT_TRUE(SendInitiate());
2480 EXPECT_TRUE(SendAccept());
2481
2482 cricket::SendDataParams params;
2483 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002484 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002485 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486 cricket::SendDataResult result;
2487 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002488 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2490}
2491
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492// TODO(pthatcher): TestSetReceiver?