blob: e4252b2e8bee5ccad76fb6ca674c6bce416fa164 [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
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "api/audio_options.h"
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070020#include "api/media_transport_config.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "media/base/fake_media_engine.h"
24#include "media/base/fake_rtp.h"
25#include "media/base/media_channel.h"
26#include "p2p/base/candidate_pair_interface.h"
27#include "p2p/base/fake_dtls_transport.h"
28#include "p2p/base/fake_packet_transport.h"
29#include "p2p/base/ice_transport_internal.h"
30#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "pc/dtls_srtp_transport.h"
32#include "pc/jsep_transport.h"
33#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020037#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080038#include "rtc_base/rtc_certificate.h"
39#include "rtc_base/ssl_identity.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) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200134 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800135 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200136 absl::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,
jbauchcb560652016-08-04 05:20:32 -0700262 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800263 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200264 auto channel = absl::make_unique<typename T::Channel>(
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800265 worker_thread, network_thread, signaling_thread, std::move(ch),
266 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
267 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700268 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000269 return channel;
270 }
271
Zhi Huange830e682018-03-30 10:48:35 -0700272 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
273 rtc::PacketTransportInternal* rtp_packet_transport,
274 rtc::PacketTransportInternal* rtcp_packet_transport,
275 DtlsTransportInternal* rtp_dtls_transport,
276 DtlsTransportInternal* rtcp_dtls_transport,
277 int flags) {
278 if (flags & RTCP_MUX) {
279 rtcp_packet_transport = nullptr;
280 rtcp_dtls_transport = nullptr;
281 }
282
283 if (flags & DTLS) {
284 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
285 } else {
286 if (flags & RAW_PACKET_TRANSPORT) {
287 return CreateUnencryptedTransport(rtp_packet_transport,
288 rtcp_packet_transport);
289 } else {
290 return CreateUnencryptedTransport(rtp_dtls_transport,
291 rtcp_dtls_transport);
292 }
293 }
294 }
295
296 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
297 rtc::PacketTransportInternal* rtp_packet_transport,
298 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200299 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
300 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700301
302 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
303 if (rtcp_packet_transport) {
304 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
305 }
306 return rtp_transport;
307 }
308
309 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
310 cricket::DtlsTransportInternal* rtp_dtls_transport,
311 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200312 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700313 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700314
315 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
316 rtcp_dtls_transport);
317 return dtls_srtp_transport;
318 }
319
deadbeeff5346592017-01-24 21:51:21 -0800320 void ConnectFakeTransports() {
321 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
322 bool asymmetric = false;
323 // Depending on test flags, could be using DTLS or raw packet transport.
324 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
325 fake_rtp_dtls_transport1_->SetDestination(
326 fake_rtp_dtls_transport2_.get(), asymmetric);
327 }
328 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
329 fake_rtcp_dtls_transport1_->SetDestination(
330 fake_rtcp_dtls_transport2_.get(), asymmetric);
331 }
332 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
333 fake_rtp_packet_transport1_->SetDestination(
334 fake_rtp_packet_transport2_.get(), asymmetric);
335 }
336 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
337 fake_rtcp_packet_transport1_->SetDestination(
338 fake_rtcp_packet_transport2_.get(), asymmetric);
339 }
340 });
341 }
342
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 if (result) {
347 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000348 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800349 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800351 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000352 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800353 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 }
355 }
356 return result;
357 }
358
359 bool SendAccept() {
360 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000361 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800362 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000363 }
364
365 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000366 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800367 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
369 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000370 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800371 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372 }
373 return result;
374 }
375
376 bool SendProvisionalAnswer() {
377 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800378 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 if (result) {
380 channel2_->Enable(true);
381 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800382 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800383 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384 }
385 return result;
386 }
387
388 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000389 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800390 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000392 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800393 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 return result;
395 }
396
deadbeeff5346592017-01-24 21:51:21 -0800397 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 channel1_.reset();
399 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800400 fake_rtp_dtls_transport1_.reset();
401 fake_rtcp_dtls_transport1_.reset();
402 fake_rtp_dtls_transport2_.reset();
403 fake_rtcp_dtls_transport2_.reset();
404 fake_rtp_packet_transport1_.reset();
405 fake_rtcp_packet_transport1_.reset();
406 fake_rtp_packet_transport2_.reset();
407 fake_rtcp_packet_transport2_.reset();
408 if (network_thread_keeper_) {
409 network_thread_keeper_.reset();
410 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 return true;
412 }
413
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtp1() {
415 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
416 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtp2() {
419 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
420 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422 void SendRtcp1() {
423 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendRtcp2() {
426 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
428 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
434 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
435 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtcp1(uint32_t ssrc) {
438 rtc::Buffer data = CreateRtcpData(ssrc);
439 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 void SendCustomRtcp2(uint32_t ssrc) {
442 rtc::Buffer data = CreateRtcpData(ssrc);
443 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200447 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
449 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 }
452 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200453 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 }
455 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 }
458 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
461 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
465 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtcpData(ssrc);
469 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200471 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200472 rtc::Buffer data = CreateRtcpData(ssrc);
473 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
476 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200478 rtc::SetBE32(data.data() + 8, ssrc);
479 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000480 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000482 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 return data;
484 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200485 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
486 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200488 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 return data;
490 }
491
Yves Gerey665174f2018-06-19 15:03:05 +0200492 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
493 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
494 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
495 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496
497 void CreateContent(int flags,
498 const cricket::AudioCodec& audio_codec,
499 const cricket::VideoCodec& video_codec,
500 typename T::Content* content) {
501 // overridden in specialized classes
502 }
503 void CopyContent(const typename T::Content& source,
504 typename T::Content* content) {
505 // overridden in specialized classes
506 }
507
Steve Anton18ee1d52017-09-11 11:32:35 -0700508 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700510 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
511 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700512 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700513 AddLegacyStreamInContent(ssrc, 0, content);
514 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000515 }
516
ossu292d6582016-03-17 02:31:13 -0700517 // Will manage the lifetime of a CallThread, making sure it's
518 // destroyed before this object goes out of scope.
519 class ScopedCallThread {
520 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200521 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100522 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200523 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100524 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
525 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700526 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700527 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700528 }
529
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200530 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700531
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200532 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700533
534 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 std::unique_ptr<rtc::Thread> thread_;
536 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700537 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
540 return false; // overridden in specialized classes
541 }
542
deadbeeff5346592017-01-24 21:51:21 -0800543 void OnRtcpMuxFullyActive1(const std::string&) {
544 rtcp_mux_activated_callbacks1_++;
545 }
546 void OnRtcpMuxFullyActive2(const std::string&) {
547 rtcp_mux_activated_callbacks2_++;
548 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549
Honghai Zhangcc411c02016-03-29 17:27:21 -0700550 cricket::CandidatePairInterface* last_selected_candidate_pair() {
551 return last_selected_candidate_pair_;
552 }
553
Peter Boström0c4e06b2015-10-07 12:23:21 +0200554 void AddLegacyStreamInContent(uint32_t ssrc,
555 int flags,
556 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 // Base implementation.
558 }
559
560 // Tests that can be used by derived classes.
561
562 // Basic sanity check.
563 void TestInit() {
564 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700565 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200567 if (verify_playout_) {
568 EXPECT_FALSE(media_channel1_->playout());
569 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 EXPECT_TRUE(media_channel1_->codecs().empty());
571 EXPECT_TRUE(media_channel1_->recv_streams().empty());
572 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
573 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
574 }
575
576 // Test that SetLocalContent and SetRemoteContent properly configure
577 // the codecs.
578 void TestSetContents() {
579 CreateChannels(0, 0);
580 typename T::Content content;
581 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800582 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800584 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200586 EXPECT_TRUE(
587 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588 }
589
Johannes Kron9190b822018-10-29 11:22:05 +0100590 // Test that SetLocalContent and SetRemoteContent properly configure
591 // extmap-allow-mixed.
592 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
593 // For a caller, SetLocalContent() is called first with an offer and next
594 // SetRemoteContent() is called with the answer.
595 CreateChannels(0, 0);
596 typename T::Content content;
597 CreateContent(0, kPcmuCodec, kH264Codec, &content);
598 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
599 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
600 content.set_extmap_allow_mixed_enum(offer_enum);
601 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
602 content.set_extmap_allow_mixed_enum(answer_enum);
603 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
604 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
605 }
606 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
607 // For a callee, SetRemoteContent() is called first with an offer and next
608 // SetLocalContent() is called with the answer.
609 CreateChannels(0, 0);
610 typename T::Content content;
611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
613 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
614 content.set_extmap_allow_mixed_enum(offer_enum);
615 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
616 content.set_extmap_allow_mixed_enum(answer_enum);
617 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
618 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
619 }
620
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 // Test that SetLocalContent and SetRemoteContent properly deals
622 // with an empty offer.
623 void TestSetContentsNullOffer() {
624 CreateChannels(0, 0);
625 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800626 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 CreateContent(0, kPcmuCodec, kH264Codec, &content);
628 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800629 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200631 EXPECT_TRUE(
632 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 }
634
635 // Test that SetLocalContent and SetRemoteContent properly set RTCP
636 // mux.
637 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800638 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 typename T::Content content;
640 CreateContent(0, kPcmuCodec, kH264Codec, &content);
641 // Both sides agree on mux. Should no longer be a separate RTCP channel.
642 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
644 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800648 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 }
650
651 // Test that SetLocalContent and SetRemoteContent properly set RTCP
652 // mux when a provisional answer is received.
653 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800654 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 typename T::Content content;
656 CreateContent(0, kPcmuCodec, kH264Codec, &content);
657 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800658 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
659 EXPECT_TRUE(
660 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800661 // Both sides agree on mux. Should signal RTCP mux as fully activated.
662 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800663 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800664 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800666 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800668 EXPECT_TRUE(
669 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
670 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800671 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 }
673
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 // Test that SetLocalContent and SetRemoteContent properly
675 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800676 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 void TestChangeStreamParamsInContent() {
678 cricket::StreamParams stream1;
679 stream1.groupid = "group1";
680 stream1.id = "stream1";
681 stream1.ssrcs.push_back(kSsrc1);
682 stream1.cname = "stream1_cname";
683
684 cricket::StreamParams stream2;
685 stream2.groupid = "group1";
686 stream2.id = "stream2";
687 stream2.ssrcs.push_back(kSsrc2);
688 stream2.cname = "stream2_cname";
689
690 // Setup a call where channel 1 send |stream1| to channel 2.
691 CreateChannels(0, 0);
692 typename T::Content content1;
693 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
694 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800695 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 EXPECT_TRUE(channel1_->Enable(true));
697 EXPECT_EQ(1u, media_channel1_->send_streams().size());
698
Steve Anton3828c062017-12-06 10:34:51 -0800699 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800701 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
703 // Channel 2 do not send anything.
704 typename T::Content content2;
705 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800706 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800708 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel2_->Enable(true));
710 EXPECT_EQ(0u, media_channel2_->send_streams().size());
711
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200712 SendCustomRtp1(kSsrc1, 0);
713 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
715
716 // Let channel 2 update the content by sending |stream2| and enable SRTP.
717 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700718 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800720 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 ASSERT_EQ(1u, media_channel2_->send_streams().size());
722 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
723
Steve Anton3828c062017-12-06 10:34:51 -0800724 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
726 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
727
728 // Channel 1 replies but stop sending stream1.
729 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700730 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800731 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 EXPECT_EQ(0u, media_channel1_->send_streams().size());
733
Steve Anton3828c062017-12-06 10:34:51 -0800734 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
736
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200737 SendCustomRtp2(kSsrc2, 0);
738 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
740 }
741
742 // Test that we only start playout and sending at the right times.
743 void TestPlayoutAndSendingStates() {
744 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200745 if (verify_playout_) {
746 EXPECT_FALSE(media_channel1_->playout());
747 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200749 if (verify_playout_) {
750 EXPECT_FALSE(media_channel2_->playout());
751 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 EXPECT_FALSE(media_channel2_->sending());
753 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200754 if (verify_playout_) {
755 EXPECT_FALSE(media_channel1_->playout());
756 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000758 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800759 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200760 if (verify_playout_) {
761 EXPECT_TRUE(media_channel1_->playout());
762 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000764 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800765 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200766 if (verify_playout_) {
767 EXPECT_FALSE(media_channel2_->playout());
768 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800771 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 if (verify_playout_) {
773 EXPECT_FALSE(media_channel2_->playout());
774 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800776 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200777 if (verify_playout_) {
778 EXPECT_TRUE(media_channel1_->playout());
779 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200781 if (verify_playout_) {
782 EXPECT_FALSE(media_channel2_->playout());
783 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_FALSE(media_channel2_->sending());
785 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200786 if (verify_playout_) {
787 EXPECT_TRUE(media_channel2_->playout());
788 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000790 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800791 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200792 if (verify_playout_) {
793 EXPECT_TRUE(media_channel1_->playout());
794 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 EXPECT_TRUE(media_channel1_->sending());
796 }
797
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798 // Test that changing the MediaContentDirection in the local and remote
799 // session description start playout and sending at the right time.
800 void TestMediaContentDirection() {
801 CreateChannels(0, 0);
802 typename T::Content content1;
803 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
804 typename T::Content content2;
805 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
806 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800807 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808
809 EXPECT_TRUE(channel1_->Enable(true));
810 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200811 if (verify_playout_) {
812 EXPECT_FALSE(media_channel1_->playout());
813 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200815 if (verify_playout_) {
816 EXPECT_FALSE(media_channel2_->playout());
817 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818 EXPECT_FALSE(media_channel2_->sending());
819
Steve Anton3828c062017-12-06 10:34:51 -0800820 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
821 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
822 EXPECT_TRUE(
823 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
824 EXPECT_TRUE(
825 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800826 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827
Peter Boström34fbfff2015-09-24 19:20:30 +0200828 if (verify_playout_) {
829 EXPECT_TRUE(media_channel1_->playout());
830 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200832 if (verify_playout_) {
833 EXPECT_FALSE(media_channel2_->playout()); // local InActive
834 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 EXPECT_FALSE(media_channel2_->sending()); // local InActive
836
837 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800838 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800839 EXPECT_TRUE(
840 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
841 EXPECT_TRUE(
842 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843
Peter Boström34fbfff2015-09-24 19:20:30 +0200844 if (verify_playout_) {
845 EXPECT_TRUE(media_channel1_->playout());
846 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200848 if (verify_playout_) {
849 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
850 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000851 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
852
853 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800854 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800855 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
856 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857
Peter Boström34fbfff2015-09-24 19:20:30 +0200858 if (verify_playout_) {
859 EXPECT_TRUE(media_channel1_->playout());
860 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200862 if (verify_playout_) {
863 EXPECT_TRUE(media_channel2_->playout());
864 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_TRUE(media_channel2_->sending());
866 }
867
Honghai Zhangcc411c02016-03-29 17:27:21 -0700868 // Tests that when the transport channel signals a candidate pair change
869 // event, the media channel will receive a call on the network route change.
870 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700871 static constexpr uint16_t kLocalNetId = 1;
872 static constexpr uint16_t kRemoteNetId = 2;
873 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800874 // Ipv4(20) + UDP(8).
875 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800876 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200877
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800878 CreateChannels(DTLS, DTLS);
879 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700880
Honghai Zhangcc411c02016-03-29 17:27:21 -0700881 typename T::MediaChannel* media_channel1 =
882 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200883 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700884
Zhi Huang942bc2e2017-11-13 13:26:07 -0800885 // Need to wait for the threads before calling
886 // |set_num_network_route_changes| because the network route would be set
887 // when creating the channel.
888 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200889 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800890 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800891 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800893 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
894
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200895 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200896 });
897 WaitForThreads();
898 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700899 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200900 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700901
eladalon05b07bb2017-08-24 07:40:16 -0700902 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800903 rtc::NetworkRoute network_route;
904 network_route.connected = true;
905 network_route.local_network_id = kLocalNetId;
906 network_route.remote_network_id = kRemoteNetId;
907 network_route.last_sent_packet_id = kLastPacketId;
908 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200909 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800910 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
911
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200912 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200913 });
914 WaitForThreads();
915 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100916 EXPECT_TRUE(media_channel1->last_network_route().connected);
917 EXPECT_EQ(kLocalNetId,
918 media_channel1->last_network_route().local_network_id);
919 EXPECT_EQ(kRemoteNetId,
920 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200921 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700922 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800923 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800924 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700925 }
926
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 // Test setting up a call.
928 void TestCallSetup() {
929 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700930 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200932 if (verify_playout_) {
933 EXPECT_TRUE(media_channel1_->playout());
934 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935 EXPECT_FALSE(media_channel1_->sending());
936 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700937 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 EXPECT_TRUE(media_channel1_->sending());
939 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200940 if (verify_playout_) {
941 EXPECT_TRUE(media_channel2_->playout());
942 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 EXPECT_TRUE(media_channel2_->sending());
944 EXPECT_EQ(1U, media_channel2_->codecs().size());
945 }
946
947 // Test that we don't crash if packets are sent during call teardown
948 // when RTCP mux is enabled. This is a regression test against a specific
949 // race condition that would only occur when a RTCP packet was sent during
950 // teardown of a channel on which RTCP mux was enabled.
951 void TestCallTeardownRtcpMux() {
952 class LastWordMediaChannel : public T::MediaChannel {
953 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700956 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
957 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
959 }
960 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200961 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
962 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
963 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964 EXPECT_TRUE(SendInitiate());
965 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800966 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000967 }
968
969 // Send voice RTP data to the other side and ensure it gets there.
970 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700971 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972 EXPECT_TRUE(SendInitiate());
973 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700974 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
975 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200976 SendRtp1();
977 SendRtp2();
978 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 EXPECT_TRUE(CheckRtp1());
980 EXPECT_TRUE(CheckRtp2());
981 EXPECT_TRUE(CheckNoRtp1());
982 EXPECT_TRUE(CheckNoRtp2());
983 }
984
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200985 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800986 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200987 EXPECT_TRUE(SendInitiate());
988 EXPECT_TRUE(SendAccept());
989 SendRtp1();
990 SendRtp2();
991 SendRtcp1();
992 SendRtcp2();
993 // Do not wait, destroy channels.
994 channel1_.reset(nullptr);
995 channel2_.reset(nullptr);
996 }
997
deadbeefac22f702017-01-12 21:59:29 -0800998 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001000 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 EXPECT_TRUE(SendInitiate());
1002 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001003 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
1004 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001005 SendRtcp1();
1006 SendRtcp2();
1007 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 EXPECT_TRUE(CheckRtcp1());
1009 EXPECT_TRUE(CheckRtcp2());
1010 EXPECT_TRUE(CheckNoRtcp1());
1011 EXPECT_TRUE(CheckNoRtcp2());
1012 }
1013
Zhi Huange830e682018-03-30 10:48:35 -07001014 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1015 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001016 EXPECT_FALSE(channel1_->srtp_active());
1017 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001019 WaitForThreads();
1020 EXPECT_TRUE(channel1_->writable());
1021 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001023 EXPECT_TRUE(channel1_->srtp_active());
1024 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001025 SendRtp1();
1026 SendRtp2();
1027 SendRtcp1();
1028 SendRtcp2();
1029 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_TRUE(CheckRtp1());
1031 EXPECT_TRUE(CheckRtp2());
1032 EXPECT_TRUE(CheckNoRtp1());
1033 EXPECT_TRUE(CheckNoRtp2());
1034 EXPECT_TRUE(CheckRtcp1());
1035 EXPECT_TRUE(CheckRtcp2());
1036 EXPECT_TRUE(CheckNoRtcp1());
1037 EXPECT_TRUE(CheckNoRtcp2());
1038 }
1039
1040 // Test that we can send and receive early media when a provisional answer is
1041 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1042 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001043 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044
Yves Gerey665174f2018-06-19 15:03:05 +02001045 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1046 EXPECT_TRUE(SendOffer());
1047 EXPECT_TRUE(SendProvisionalAnswer());
1048 EXPECT_TRUE(channel1_->srtp_active());
1049 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001050 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1051 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +02001052 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1053 SendCustomRtcp1(kSsrc1);
1054 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1055 WaitForThreads();
1056 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1057 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058
Yves Gerey665174f2018-06-19 15:03:05 +02001059 // Send packets from callee and verify that it is received.
1060 SendCustomRtcp2(kSsrc2);
1061 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1062 WaitForThreads();
1063 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1064 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065
Yves Gerey665174f2018-06-19 15:03:05 +02001066 // Complete call setup and ensure everything is still OK.
1067 EXPECT_TRUE(SendFinalAnswer());
1068 EXPECT_TRUE(channel1_->srtp_active());
1069 EXPECT_TRUE(channel2_->srtp_active());
1070 SendCustomRtcp1(kSsrc1);
1071 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1072 SendCustomRtcp2(kSsrc2);
1073 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1074 WaitForThreads();
1075 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1076 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1077 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1078 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 }
1080
1081 // Test that we properly send RTP without SRTP from a thread.
1082 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001083 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 EXPECT_TRUE(SendInitiate());
1085 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001086 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1087 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1088 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1089 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1090 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1091 send_rtcp1.thread(),
1092 send_rtcp2.thread()};
1093 WaitForThreads(involved_threads);
1094 EXPECT_TRUE(CheckRtp1());
1095 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(CheckNoRtp1());
1097 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001098 EXPECT_TRUE(CheckRtcp1());
1099 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(CheckNoRtcp1());
1101 EXPECT_TRUE(CheckNoRtcp2());
1102 }
1103
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 // Test that the mediachannel retains its sending state after the transport
1105 // becomes non-writable.
1106 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001107 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 EXPECT_TRUE(SendInitiate());
1109 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001110 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1111 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001112 SendRtp1();
1113 SendRtp2();
1114 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 EXPECT_TRUE(CheckRtp1());
1116 EXPECT_TRUE(CheckRtp2());
1117 EXPECT_TRUE(CheckNoRtp1());
1118 EXPECT_TRUE(CheckNoRtp2());
1119
wu@webrtc.org97077a32013-10-25 21:18:33 +00001120 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001121 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1122 fake_rtp_dtls_transport1_->SetWritable(false);
1123 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001124 SendRtp1();
1125 SendRtp2();
1126 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 EXPECT_TRUE(CheckRtp1());
1128 EXPECT_TRUE(CheckNoRtp2());
1129
1130 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001131 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1132 fake_rtp_dtls_transport1_->SetWritable(true);
1133 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001135 SendRtp1();
1136 SendRtp2();
1137 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 EXPECT_TRUE(CheckRtp1());
1139 EXPECT_TRUE(CheckRtp2());
1140 EXPECT_TRUE(CheckNoRtp1());
1141 EXPECT_TRUE(CheckNoRtp2());
1142
1143 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001144 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1145 bool asymmetric = true;
1146 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1147 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_TRUE(media_channel1_->sending());
1149
wu@webrtc.org97077a32013-10-25 21:18:33 +00001150 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001151 SendRtp1();
1152 SendRtp2();
1153 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 EXPECT_TRUE(CheckRtp1());
1155 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001156 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157
1158 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001159 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001160 bool asymmetric = true;
1161 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1162 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001163 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001165 SendRtp1();
1166 SendRtp2();
1167 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_TRUE(CheckRtp1());
1169 EXPECT_TRUE(CheckRtp2());
1170 EXPECT_TRUE(CheckNoRtp1());
1171 EXPECT_TRUE(CheckNoRtp2());
1172 }
1173
Yves Gerey665174f2018-06-19 15:03:05 +02001174 void SendBundleToBundle(const int* pl_types,
1175 int len,
1176 bool rtcp_mux,
1177 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001178 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001180 // Only pl_type1 was added to the bundle filter for both |channel1_|
1181 // and |channel2_|.
1182 int pl_type1 = pl_types[0];
1183 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001184 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001185 if (secure)
1186 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001187 if (rtcp_mux) {
1188 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001189 }
1190 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001193
1194 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001195 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1196 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1197 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001198 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001199 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1200 EXPECT_TRUE(CheckNoRtp1());
1201 EXPECT_TRUE(CheckNoRtp2());
1202
Zhi Huang365381f2018-04-13 16:44:34 -07001203 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1204 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001205 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001206 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1207 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001208
Zhi Huange830e682018-03-30 10:48:35 -07001209 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001210 SendCustomRtcp1(kSsrc1);
1211 SendCustomRtcp2(kSsrc2);
1212 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1214 EXPECT_TRUE(CheckNoRtcp1());
1215 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1216 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001218 SendCustomRtcp1(kSsrc2);
1219 SendCustomRtcp2(kSsrc1);
1220 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001221 // Bundle filter shouldn't filter out any RTCP.
1222 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1223 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 }
1225
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 void TestSetContentFailure() {
1227 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228
Peter Thatchera6d24442015-07-09 21:26:36 -07001229 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001230 std::unique_ptr<typename T::Content> content(
1231 CreateMediaContentWithStream(1));
1232
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001234 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001235 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001237 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001240 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001241 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001242
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001243 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001244 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001245 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001246 }
1247
1248 void TestSendTwoOffers() {
1249 CreateChannels(0, 0);
1250
Peter Thatchera6d24442015-07-09 21:26:36 -07001251 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001252 std::unique_ptr<typename T::Content> content1(
1253 CreateMediaContentWithStream(1));
1254 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001255 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1257
Steve Anton18ee1d52017-09-11 11:32:35 -07001258 std::unique_ptr<typename T::Content> content2(
1259 CreateMediaContentWithStream(2));
1260 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001261 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001262 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1263 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1264 }
1265
1266 void TestReceiveTwoOffers() {
1267 CreateChannels(0, 0);
1268
Peter Thatchera6d24442015-07-09 21:26:36 -07001269 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001270 std::unique_ptr<typename T::Content> content1(
1271 CreateMediaContentWithStream(1));
1272 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001273 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1275
Steve Anton18ee1d52017-09-11 11:32:35 -07001276 std::unique_ptr<typename T::Content> content2(
1277 CreateMediaContentWithStream(2));
1278 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001279 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1281 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1282 }
1283
1284 void TestSendPrAnswer() {
1285 CreateChannels(0, 0);
1286
Peter Thatchera6d24442015-07-09 21:26:36 -07001287 std::string err;
1288 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001289 std::unique_ptr<typename T::Content> content1(
1290 CreateMediaContentWithStream(1));
1291 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001292 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1294
Peter Thatchera6d24442015-07-09 21:26:36 -07001295 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001296 std::unique_ptr<typename T::Content> content2(
1297 CreateMediaContentWithStream(2));
1298 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001299 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1301 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1302
Peter Thatchera6d24442015-07-09 21:26:36 -07001303 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001304 std::unique_ptr<typename T::Content> content3(
1305 CreateMediaContentWithStream(3));
1306 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001307 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001308 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1309 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1310 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1311 }
1312
1313 void TestReceivePrAnswer() {
1314 CreateChannels(0, 0);
1315
Peter Thatchera6d24442015-07-09 21:26:36 -07001316 std::string err;
1317 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001318 std::unique_ptr<typename T::Content> content1(
1319 CreateMediaContentWithStream(1));
1320 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001321 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1323
Peter Thatchera6d24442015-07-09 21:26:36 -07001324 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001325 std::unique_ptr<typename T::Content> content2(
1326 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001327 EXPECT_TRUE(
1328 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1330 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1331
Peter Thatchera6d24442015-07-09 21:26:36 -07001332 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001333 std::unique_ptr<typename T::Content> content3(
1334 CreateMediaContentWithStream(3));
1335 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001336 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1338 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1339 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1340 }
1341
1342 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001343 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344 EXPECT_TRUE(SendInitiate());
1345 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001346 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
1347 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001348
1349 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001350 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 // The sending message is only posted. channel2_ should be empty.
1352 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001353 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1354 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001355
1356 // When channel1_ is deleted, the RTCP packet should be sent out to
1357 // channel2_.
1358 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001359 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(CheckRtcp2());
1361 }
1362
zstein56162b92017-04-24 16:54:35 -07001363 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001364 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001366
zstein56162b92017-04-24 16:54:35 -07001367 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001368 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(media_channel1_->ready_to_send());
1370
zstein56162b92017-04-24 16:54:35 -07001371 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001372 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001374 }
1375
skvladdc1c62c2016-03-16 19:07:43 -07001376 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1377 typename T::Content content;
1378 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1379 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001380 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001381 }
1382
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001383 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001384 webrtc::RtpParameters parameters;
1385 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001386 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001387 parameters.encodings.push_back(encoding);
1388 return parameters;
1389 }
1390
1391 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001392 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001393 EXPECT_EQ(1UL, parameters.encodings.size());
1394 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1395 }
1396
1397 void DefaultMaxBitrateIsUnlimited() {
1398 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001399 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1400 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001401 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001402 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001403 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001404 }
1405
Zhi Huange830e682018-03-30 10:48:35 -07001406 // Test that when a channel gets new RtpTransport with a call to
1407 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1408 // with the options on the new one.
1409
Steve Anton8a63f782017-10-23 13:08:53 -07001410 // For example, audio and video may use separate socket options, but initially
1411 // be unbundled, then later become bundled. When this happens, their preferred
1412 // socket options should be merged to the underlying transport they share.
1413 void SocketOptionsMergedOnSetTransport() {
1414 constexpr int kSndBufSize = 4000;
1415 constexpr int kRcvBufSize = 8000;
1416
Zhi Huange830e682018-03-30 10:48:35 -07001417 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001418
1419 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1420 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1421 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1422 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1423
Zhi Huange830e682018-03-30 10:48:35 -07001424 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001425 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001426 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001427
1428 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001429 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1430 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001431 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001432 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1433 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001434 EXPECT_EQ(kRcvBufSize, option_val);
1435 }
1436
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001437 void CreateSimulcastContent(const std::vector<std::string>& rids,
1438 typename T::Content* content) {
1439 std::vector<RidDescription> rid_descriptions;
1440 for (const std::string name : rids) {
1441 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1442 }
1443
1444 StreamParams stream;
1445 stream.set_rids(rid_descriptions);
1446 CreateContent(0, kPcmuCodec, kH264Codec, content);
1447 // This is for unified plan, so there can be only one StreamParams.
1448 content->mutable_streams().clear();
1449 content->AddStream(stream);
1450 }
1451
1452 void VerifySimulcastStreamParams(const StreamParams& expected,
1453 const typename T::Channel* channel) {
1454 const std::vector<StreamParams>& streams = channel->local_streams();
1455 ASSERT_EQ(1u, streams.size());
1456 const StreamParams& result = streams[0];
1457 EXPECT_EQ(expected.rids(), result.rids());
1458 EXPECT_TRUE(result.has_ssrcs());
1459 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1460 std::vector<uint32_t> primary_ssrcs;
1461 result.GetPrimarySsrcs(&primary_ssrcs);
1462 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1463 }
1464
1465 void TestUpdateLocalStreamsWithSimulcast() {
1466 CreateChannels(0, 0);
1467 typename T::Content content1, content2, content3;
1468 CreateSimulcastContent({"f", "h", "q"}, &content1);
1469 EXPECT_TRUE(
1470 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1471 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1472 StreamParams stream1 = channel1_->local_streams()[0];
1473
1474 // Create a similar offer. SetLocalContent should not remove and add.
1475 CreateSimulcastContent({"f", "h", "q"}, &content2);
1476 EXPECT_TRUE(
1477 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1478 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1479 StreamParams stream2 = channel1_->local_streams()[0];
1480 // Check that the streams are identical (SSRCs didn't change).
1481 EXPECT_EQ(stream1, stream2);
1482
1483 // Create third offer that has same RIDs in different order.
1484 CreateSimulcastContent({"f", "q", "h"}, &content3);
1485 EXPECT_TRUE(
1486 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1487 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1488 }
1489
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001491 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1492 static void ProcessThreadQueue(rtc::Thread* thread) {
1493 RTC_DCHECK(thread->IsCurrent());
1494 while (!thread->empty()) {
1495 thread->ProcessMessages(0);
1496 }
1497 }
1498 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1499 // |threads| and current thread post packets to network thread.
1500 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001501 thread->Invoke<void>(RTC_FROM_HERE,
1502 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001503 }
1504 ProcessThreadQueue(rtc::Thread::Current());
1505 // Network thread move them around and post back to worker = current thread.
1506 if (!network_thread_->IsCurrent()) {
1507 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001508 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001509 }
1510 // Worker thread = current Thread process received messages.
1511 ProcessThreadQueue(rtc::Thread::Current());
1512 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001513 // TODO(pbos): Remove playout from all media channels and let renderers mute
1514 // themselves.
1515 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001516 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1517 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001518 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1519 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1520 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1521 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1522 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1523 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1524 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1525 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001526 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1527 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1528 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 cricket::FakeMediaEngine media_engine_;
1530 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001531 typename T::MediaChannel* media_channel1_ = nullptr;
1532 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001533 std::unique_ptr<typename T::Channel> channel1_;
1534 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535 typename T::Content local_media_content1_;
1536 typename T::Content local_media_content2_;
1537 typename T::Content remote_media_content1_;
1538 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001540 rtc::Buffer rtp_packet_;
1541 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001542 int rtcp_mux_activated_callbacks1_ = 0;
1543 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001544 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001545 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546};
1547
Yves Gerey665174f2018-06-19 15:03:05 +02001548template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549void ChannelTest<VoiceTraits>::CreateContent(
1550 int flags,
1551 const cricket::AudioCodec& audio_codec,
1552 const cricket::VideoCodec& video_codec,
1553 cricket::AudioContentDescription* audio) {
1554 audio->AddCodec(audio_codec);
1555 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556}
1557
Yves Gerey665174f2018-06-19 15:03:05 +02001558template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559void ChannelTest<VoiceTraits>::CopyContent(
1560 const cricket::AudioContentDescription& source,
1561 cricket::AudioContentDescription* audio) {
1562 *audio = source;
1563}
1564
Yves Gerey665174f2018-06-19 15:03:05 +02001565template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1567 const cricket::AudioCodec& c2) {
1568 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001569 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570}
1571
Peter Boström0c4e06b2015-10-07 12:23:21 +02001572template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001574 uint32_t ssrc,
1575 int flags,
1576 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577 audio->AddLegacyStream(ssrc);
1578}
1579
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001580class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 public:
solenberg1dd98f32015-09-10 01:57:14 -07001582 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001583 VoiceChannelSingleThreadTest()
1584 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1585};
1586
1587class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1588 public:
1589 typedef ChannelTest<VoiceTraits> Base;
1590 VoiceChannelDoubleThreadTest()
1591 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001592};
1593
jbauch5869f502017-06-29 12:31:36 -07001594class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001595 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001596 public:
1597 typedef ChannelTest<VoiceTraits> Base;
1598 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001599 : Base(true,
1600 kPcmuFrameWithExtensions,
1601 kRtcpReport,
1602 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001603};
1604
1605class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001606 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001607 public:
1608 typedef ChannelTest<VoiceTraits> Base;
1609 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001610 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1611 }
jbauch5869f502017-06-29 12:31:36 -07001612};
1613
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001615template <>
Steve Anton8699a322017-11-06 15:53:33 -08001616std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001617 rtc::Thread* worker_thread,
1618 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001619 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001620 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001621 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001622 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001623 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001624 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001625 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1626 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001627 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 return channel;
1629}
1630
Yves Gerey665174f2018-06-19 15:03:05 +02001631template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632void ChannelTest<VideoTraits>::CreateContent(
1633 int flags,
1634 const cricket::AudioCodec& audio_codec,
1635 const cricket::VideoCodec& video_codec,
1636 cricket::VideoContentDescription* video) {
1637 video->AddCodec(video_codec);
1638 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639}
1640
Yves Gerey665174f2018-06-19 15:03:05 +02001641template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642void ChannelTest<VideoTraits>::CopyContent(
1643 const cricket::VideoContentDescription& source,
1644 cricket::VideoContentDescription* video) {
1645 *video = source;
1646}
1647
Yves Gerey665174f2018-06-19 15:03:05 +02001648template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1650 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001651 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652}
1653
Peter Boström0c4e06b2015-10-07 12:23:21 +02001654template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001656 uint32_t ssrc,
1657 int flags,
1658 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 video->AddLegacyStream(ssrc);
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 public:
solenberg1dd98f32015-09-10 01:57:14 -07001664 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665 VideoChannelSingleThreadTest()
1666 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667};
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1670 public:
1671 typedef ChannelTest<VideoTraits> Base;
1672 VideoChannelDoubleThreadTest()
1673 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1674};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001676TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 Base::TestInit();
1678 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1679 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1680}
1681
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001682TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1683 Base::TestDeinit();
1684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 Base::TestSetContents();
1688}
1689
Johannes Kron9190b822018-10-29 11:22:05 +01001690TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1691 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1692}
1693
1694TEST_F(VoiceChannelSingleThreadTest,
1695 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1696 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1697}
1698
1699TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1700 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1701}
1702
1703TEST_F(VoiceChannelSingleThreadTest,
1704 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1705 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1706}
1707
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001708TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 Base::TestSetContentsNullOffer();
1710}
1711
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001712TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 Base::TestSetContentsRtcpMux();
1714}
1715
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001716TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 Base::TestSetContentsRtcpMux();
1718}
1719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001720TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 Base::TestChangeStreamParamsInContent();
1722}
1723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001724TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725 Base::TestPlayoutAndSendingStates();
1726}
1727
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001728TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 Base::TestMediaContentDirection();
1730}
1731
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001732TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001733 Base::TestNetworkRouteChanges();
1734}
1735
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001736TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 Base::TestCallSetup();
1738}
1739
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 Base::TestCallTeardownRtcpMux();
1742}
1743
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 Base::SendRtpToRtp();
1746}
1747
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001748TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 Base::SendRtcpToRtcp();
1750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001753 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001757 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001758}
1759
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001760TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1762}
1763
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 Base::SendRtpToRtpOnThread();
1766}
1767
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001768TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 Base::SendWithWritabilityLoss();
1770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001773 Base::TestSetContentFailure();
1774}
1775
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 Base::TestSendTwoOffers();
1778}
1779
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 Base::TestReceiveTwoOffers();
1782}
1783
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001784TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 Base::TestSendPrAnswer();
1786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 Base::TestReceivePrAnswer();
1790}
1791
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001792TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793 Base::TestFlushRtcp();
1794}
1795
zstein56162b92017-04-24 16:54:35 -07001796TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1797 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001801 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802}
1803
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001804TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001805 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001806}
1807
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001809 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001810}
1811
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001812TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001813 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814}
1815
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001816TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001817 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001818}
1819
Steve Anton8a63f782017-10-23 13:08:53 -07001820TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1821 Base::SocketOptionsMergedOnSetTransport();
1822}
1823
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001824// VoiceChannelDoubleThreadTest
1825TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1828 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829}
1830
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001831TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1832 Base::TestDeinit();
1833}
1834
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001835TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 Base::TestSetContents();
1837}
1838
Johannes Kron9190b822018-10-29 11:22:05 +01001839TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1840 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1841}
1842
1843TEST_F(VoiceChannelDoubleThreadTest,
1844 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1845 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1846}
1847
1848TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1849 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1850}
1851
1852TEST_F(VoiceChannelDoubleThreadTest,
1853 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1854 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1855}
1856
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001857TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 Base::TestSetContentsNullOffer();
1859}
1860
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001861TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 Base::TestSetContentsRtcpMux();
1863}
1864
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001865TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001866 Base::TestSetContentsRtcpMux();
1867}
1868
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001869TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001870 Base::TestChangeStreamParamsInContent();
1871}
1872
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001873TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874 Base::TestPlayoutAndSendingStates();
1875}
1876
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001877TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1878 Base::TestMediaContentDirection();
1879}
1880
1881TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1882 Base::TestNetworkRouteChanges();
1883}
1884
1885TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1886 Base::TestCallSetup();
1887}
1888
1889TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1890 Base::TestCallTeardownRtcpMux();
1891}
1892
1893TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1894 Base::SendRtpToRtp();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1898 Base::SendRtcpToRtcp();
1899}
1900
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001901TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001902 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903}
1904
1905TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001906 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001907}
1908
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001909TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1910 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1911}
1912
1913TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1914 Base::SendRtpToRtpOnThread();
1915}
1916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1918 Base::SendWithWritabilityLoss();
1919}
1920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1922 Base::TestSetContentFailure();
1923}
1924
1925TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1926 Base::TestSendTwoOffers();
1927}
1928
1929TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1930 Base::TestReceiveTwoOffers();
1931}
1932
1933TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1934 Base::TestSendPrAnswer();
1935}
1936
1937TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1938 Base::TestReceivePrAnswer();
1939}
1940
1941TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1942 Base::TestFlushRtcp();
1943}
1944
zstein56162b92017-04-24 16:54:35 -07001945TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1946 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1950 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1951}
1952
1953TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1954 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1955}
1956
1957TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1958 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1959}
1960
1961TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1962 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1963}
1964
1965TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1966 Base::DefaultMaxBitrateIsUnlimited();
1967}
1968
Steve Anton8a63f782017-10-23 13:08:53 -07001969TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1970 Base::SocketOptionsMergedOnSetTransport();
1971}
1972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973// VideoChannelSingleThreadTest
1974TEST_F(VideoChannelSingleThreadTest, TestInit) {
1975 Base::TestInit();
1976}
1977
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001978TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1979 Base::TestDeinit();
1980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1983 Base::TestSetContents();
1984}
1985
Johannes Kron9190b822018-10-29 11:22:05 +01001986TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1987 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1988}
1989
1990TEST_F(VideoChannelSingleThreadTest,
1991 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1992 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1993}
1994
1995TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1996 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1997}
1998
1999TEST_F(VideoChannelSingleThreadTest,
2000 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2001 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2002}
2003
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002004TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2005 Base::TestSetContentsNullOffer();
2006}
2007
2008TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2009 Base::TestSetContentsRtcpMux();
2010}
2011
2012TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2013 Base::TestSetContentsRtcpMux();
2014}
2015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002016TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2017 Base::TestChangeStreamParamsInContent();
2018}
2019
2020TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2021 Base::TestPlayoutAndSendingStates();
2022}
2023
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002024TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002025 Base::TestMediaContentDirection();
2026}
2027
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002028TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002029 Base::TestNetworkRouteChanges();
2030}
2031
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002032TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002033 Base::TestCallSetup();
2034}
2035
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002036TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 Base::TestCallTeardownRtcpMux();
2038}
2039
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002040TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 Base::SendRtpToRtp();
2042}
2043
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002044TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 Base::SendRtcpToRtcp();
2046}
2047
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002048TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002049 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002050}
2051
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002052TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002053 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054}
2055
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002056TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2058}
2059
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002060TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002061 Base::SendRtpToRtpOnThread();
2062}
2063
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002064TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002065 Base::SendWithWritabilityLoss();
2066}
2067
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002068TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002069 Base::TestSetContentFailure();
2070}
2071
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002072TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073 Base::TestSendTwoOffers();
2074}
2075
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002076TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002077 Base::TestReceiveTwoOffers();
2078}
2079
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002080TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 Base::TestSendPrAnswer();
2082}
2083
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002084TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002085 Base::TestReceivePrAnswer();
2086}
2087
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002088TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002089 Base::TestFlushRtcp();
2090}
2091
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002092TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002093 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002094}
2095
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002096TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002097 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002098}
2099
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002100TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002101 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002102}
2103
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002104TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002105 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106}
2107
zstein56162b92017-04-24 16:54:35 -07002108TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2109 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110}
2111
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002112TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002113 Base::DefaultMaxBitrateIsUnlimited();
2114}
2115
Steve Anton8a63f782017-10-23 13:08:53 -07002116TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2117 Base::SocketOptionsMergedOnSetTransport();
2118}
2119
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002120TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2121 Base::TestUpdateLocalStreamsWithSimulcast();
2122}
2123
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002124// VideoChannelDoubleThreadTest
2125TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2126 Base::TestInit();
2127}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002129TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2130 Base::TestDeinit();
2131}
2132
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002133TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2134 Base::TestSetContents();
2135}
2136
Johannes Kron9190b822018-10-29 11:22:05 +01002137TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2138 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2139}
2140
2141TEST_F(VideoChannelDoubleThreadTest,
2142 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2143 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2144}
2145
2146TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2147 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2148}
2149
2150TEST_F(VideoChannelDoubleThreadTest,
2151 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2152 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2153}
2154
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002155TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2156 Base::TestSetContentsNullOffer();
2157}
2158
2159TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2160 Base::TestSetContentsRtcpMux();
2161}
2162
2163TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2164 Base::TestSetContentsRtcpMux();
2165}
2166
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002167TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2168 Base::TestChangeStreamParamsInContent();
2169}
2170
2171TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2172 Base::TestPlayoutAndSendingStates();
2173}
2174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002175TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2176 Base::TestMediaContentDirection();
2177}
2178
2179TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2180 Base::TestNetworkRouteChanges();
2181}
2182
2183TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2184 Base::TestCallSetup();
2185}
2186
2187TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2188 Base::TestCallTeardownRtcpMux();
2189}
2190
2191TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2192 Base::SendRtpToRtp();
2193}
2194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002195TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2196 Base::SendRtcpToRtcp();
2197}
2198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002199TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002200 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002201}
2202
2203TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002204 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002205}
2206
2207TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2208 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2209}
2210
2211TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2212 Base::SendRtpToRtpOnThread();
2213}
2214
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002215TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2216 Base::SendWithWritabilityLoss();
2217}
2218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002219TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2220 Base::TestSetContentFailure();
2221}
2222
2223TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2224 Base::TestSendTwoOffers();
2225}
2226
2227TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2228 Base::TestReceiveTwoOffers();
2229}
2230
2231TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2232 Base::TestSendPrAnswer();
2233}
2234
2235TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2236 Base::TestReceivePrAnswer();
2237}
2238
2239TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2240 Base::TestFlushRtcp();
2241}
2242
2243TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2244 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2245}
2246
2247TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2248 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2249}
2250
2251TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2252 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2253}
2254
2255TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2256 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2257}
2258
zstein56162b92017-04-24 16:54:35 -07002259TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2260 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261}
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2264 Base::DefaultMaxBitrateIsUnlimited();
2265}
2266
Steve Anton8a63f782017-10-23 13:08:53 -07002267TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2268 Base::SocketOptionsMergedOnSetTransport();
2269}
2270
deadbeef953c2ce2017-01-09 14:53:41 -08002271// RtpDataChannelSingleThreadTest
2272class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002274 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002275 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2277};
2278
deadbeef953c2ce2017-01-09 14:53:41 -08002279// RtpDataChannelDoubleThreadTest
2280class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002281 public:
2282 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002283 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285};
2286
2287// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002288template <>
Steve Anton8699a322017-11-06 15:53:33 -08002289std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002290 rtc::Thread* worker_thread,
2291 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002292 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002293 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002294 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002295 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002296 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002297 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002298 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2299 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002300 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301 return channel;
2302}
2303
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002304template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305void ChannelTest<DataTraits>::CreateContent(
2306 int flags,
2307 const cricket::AudioCodec& audio_codec,
2308 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002309 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 data->AddCodec(kGoogleDataCodec);
2311 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312}
2313
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002314template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002316 const cricket::RtpDataContentDescription& source,
2317 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 *data = source;
2319}
2320
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002321template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2323 const cricket::DataCodec& c2) {
2324 return c1.name == c2.name;
2325}
2326
Peter Boström0c4e06b2015-10-07 12:23:21 +02002327template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002328void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002329 uint32_t ssrc,
2330 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002331 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332 data->AddLegacyStream(ssrc);
2333}
2334
deadbeef953c2ce2017-01-09 14:53:41 -08002335TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 Base::TestInit();
2337 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2338}
2339
deadbeef953c2ce2017-01-09 14:53:41 -08002340TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002341 Base::TestDeinit();
2342}
2343
deadbeef953c2ce2017-01-09 14:53:41 -08002344TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345 Base::TestSetContents();
2346}
2347
deadbeef953c2ce2017-01-09 14:53:41 -08002348TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 Base::TestSetContentsNullOffer();
2350}
2351
deadbeef953c2ce2017-01-09 14:53:41 -08002352TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353 Base::TestSetContentsRtcpMux();
2354}
2355
deadbeef953c2ce2017-01-09 14:53:41 -08002356TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 Base::TestChangeStreamParamsInContent();
2358}
2359
deadbeef953c2ce2017-01-09 14:53:41 -08002360TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361 Base::TestPlayoutAndSendingStates();
2362}
2363
deadbeef953c2ce2017-01-09 14:53:41 -08002364TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::TestMediaContentDirection();
2366}
2367
deadbeef953c2ce2017-01-09 14:53:41 -08002368TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::TestCallSetup();
2370}
2371
deadbeef953c2ce2017-01-09 14:53:41 -08002372TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::TestCallTeardownRtcpMux();
2374}
2375
zstein56162b92017-04-24 16:54:35 -07002376TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2377 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378}
2379
deadbeef953c2ce2017-01-09 14:53:41 -08002380TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381 Base::SendRtpToRtp();
2382}
2383
deadbeef953c2ce2017-01-09 14:53:41 -08002384TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385 Base::SendRtcpToRtcp();
2386}
2387
deadbeef953c2ce2017-01-09 14:53:41 -08002388TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 Base::SendRtpToRtpOnThread();
2390}
2391
deadbeef953c2ce2017-01-09 14:53:41 -08002392TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002393 Base::SendWithWritabilityLoss();
2394}
2395
Steve Anton8a63f782017-10-23 13:08:53 -07002396TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2397 Base::SocketOptionsMergedOnSetTransport();
2398}
2399
deadbeef953c2ce2017-01-09 14:53:41 -08002400TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002401 CreateChannels(0, 0);
2402 EXPECT_TRUE(SendInitiate());
2403 EXPECT_TRUE(SendAccept());
2404
2405 cricket::SendDataParams params;
2406 params.ssrc = 42;
2407 unsigned char data[] = {'f', 'o', 'o'};
2408 rtc::CopyOnWriteBuffer payload(data, 3);
2409 cricket::SendDataResult result;
2410 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2411 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2412 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2413}
2414
deadbeef953c2ce2017-01-09 14:53:41 -08002415TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002416 Base::TestInit();
2417 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2418}
2419
deadbeef953c2ce2017-01-09 14:53:41 -08002420TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002421 Base::TestDeinit();
2422}
2423
deadbeef953c2ce2017-01-09 14:53:41 -08002424TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425 Base::TestSetContents();
2426}
2427
deadbeef953c2ce2017-01-09 14:53:41 -08002428TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429 Base::TestSetContentsNullOffer();
2430}
2431
deadbeef953c2ce2017-01-09 14:53:41 -08002432TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433 Base::TestSetContentsRtcpMux();
2434}
2435
deadbeef953c2ce2017-01-09 14:53:41 -08002436TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437 Base::TestChangeStreamParamsInContent();
2438}
2439
deadbeef953c2ce2017-01-09 14:53:41 -08002440TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441 Base::TestPlayoutAndSendingStates();
2442}
2443
deadbeef953c2ce2017-01-09 14:53:41 -08002444TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445 Base::TestMediaContentDirection();
2446}
2447
deadbeef953c2ce2017-01-09 14:53:41 -08002448TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449 Base::TestCallSetup();
2450}
2451
deadbeef953c2ce2017-01-09 14:53:41 -08002452TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453 Base::TestCallTeardownRtcpMux();
2454}
2455
zstein56162b92017-04-24 16:54:35 -07002456TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2457 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002458}
2459
deadbeef953c2ce2017-01-09 14:53:41 -08002460TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461 Base::SendRtpToRtp();
2462}
2463
deadbeef953c2ce2017-01-09 14:53:41 -08002464TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465 Base::SendRtcpToRtcp();
2466}
2467
deadbeef953c2ce2017-01-09 14:53:41 -08002468TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469 Base::SendRtpToRtpOnThread();
2470}
2471
deadbeef953c2ce2017-01-09 14:53:41 -08002472TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002473 Base::SendWithWritabilityLoss();
2474}
2475
Steve Anton8a63f782017-10-23 13:08:53 -07002476TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2477 Base::SocketOptionsMergedOnSetTransport();
2478}
2479
deadbeef953c2ce2017-01-09 14:53:41 -08002480TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 CreateChannels(0, 0);
2482 EXPECT_TRUE(SendInitiate());
2483 EXPECT_TRUE(SendAccept());
2484
2485 cricket::SendDataParams params;
2486 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002487 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002488 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 cricket::SendDataResult result;
2490 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002491 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2493}
2494
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495// TODO(pthatcher): TestSetReceiver?