blob: 07e9e188aeaa03005cc6fe360c3890ee915fe87d [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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080012#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010013#include <utility>
kwiberg31022942016-03-11 14:18:21 -080014
Yves Gerey3e707812018-11-28 16:47:49 +010015#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "api/audio_options.h"
18#include "api/rtpparameters.h"
19#include "media/base/codec.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "media/base/fakemediaengine.h"
21#include "media/base/fakertp.h"
22#include "media/base/mediachannel.h"
Yves Gerey3e707812018-11-28 16:47:49 +010023#include "p2p/base/candidatepairinterface.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "p2p/base/fakedtlstransport.h"
25#include "p2p/base/fakepackettransport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010026#include "p2p/base/icetransportinternal.h"
27#include "p2p/base/p2pconstants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "pc/channel.h"
Yves Gerey3e707812018-11-28 16:47:49 +010029#include "pc/dtlssrtptransport.h"
30#include "pc/jseptransport.h"
31#include "pc/rtptransport.h"
32#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "rtc_base/byteorder.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Yves Gerey3e707812018-11-28 16:47:49 +010036#include "rtc_base/rtccertificate.h"
37#include "rtc_base/sslidentity.h"
38#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039
zhihuangb2cdd932017-01-19 16:54:25 -080040using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080043using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080044using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045
Danil Chapovalov33b01f22016-05-11 19:55:27 +020046namespace {
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
48const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
49const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070050const cricket::VideoCodec kH264Codec(97, "H264");
51const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020052const cricket::DataCodec kGoogleDataCodec(101, "google-data");
53const uint32_t kSsrc1 = 0x1111;
54const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070055const uint32_t kSsrc3 = 0x3333;
56const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020057const int kAudioPts[] = {0, 8};
58const int kVideoPts[] = {97, 99};
59enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010060
Danil Chapovalov33b01f22016-05-11 19:55:27 +020061} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
deadbeefcbecd352015-09-23 11:50:27 -070063template <class ChannelT,
64 class MediaChannelT,
65 class ContentT,
66 class CodecT,
67 class MediaInfoT,
68 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069class Traits {
70 public:
71 typedef ChannelT Channel;
72 typedef MediaChannelT MediaChannel;
73 typedef ContentT Content;
74 typedef CodecT Codec;
75 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020076 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000077};
78
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079class VoiceTraits : public Traits<cricket::VoiceChannel,
80 cricket::FakeVoiceMediaChannel,
81 cricket::AudioContentDescription,
82 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020083 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070084 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085
86class VideoTraits : public Traits<cricket::VideoChannel,
87 cricket::FakeVideoMediaChannel,
88 cricket::VideoContentDescription,
89 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020090 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070091 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092
deadbeef953c2ce2017-01-09 14:53:41 -080093class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 cricket::FakeDataMediaChannel,
95 cricket::DataContentDescription,
96 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020097 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070098 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099
deadbeef953c2ce2017-01-09 14:53:41 -0800100// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200101template <class T>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102class ChannelTest : public testing::Test, public sigslot::has_slots<> {
103 public:
deadbeefac22f702017-01-12 21:59:29 -0800104 enum Flags {
105 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800106 SSRC_MUX = 0x8,
107 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800108 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800109 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700110 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800111 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112
Peter Boström34fbfff2015-09-24 19:20:30 +0200113 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 rtc::ArrayView<const uint8_t> rtp_data,
115 rtc::ArrayView<const uint8_t> rtcp_data,
116 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200117 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200118 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800119 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200120 if (network_is_worker == NetworkIsWorker::Yes) {
121 network_thread_ = rtc::Thread::Current();
122 } else {
123 network_thread_keeper_ = rtc::Thread::Create();
124 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200125 network_thread_ = network_thread_keeper_.get();
126 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200130 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800131 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200132 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800133 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200134 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 }
Steve Anton8699a322017-11-06 15:53:33 -0800136 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
137 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 int flags1,
139 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800140 // Network thread is started in CreateChannels, to allow the test to
141 // configure a fake clock before any threads are spawned and attempt to
142 // access the time.
143 if (network_thread_keeper_) {
144 network_thread_keeper_->Start();
145 }
Zhi Huange830e682018-03-30 10:48:35 -0700146
deadbeeff5346592017-01-24 21:51:21 -0800147 // Make sure if using raw packet transports, they're used for both
148 // channels.
149 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200150 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800151 media_channel1_ = ch1.get();
152 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800153 rtc::PacketTransportInternal* rtp1 = nullptr;
154 rtc::PacketTransportInternal* rtcp1 = nullptr;
155 rtc::PacketTransportInternal* rtp2 = nullptr;
156 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800157 // Based on flags, create fake DTLS or raw packet transports.
158 if (flags1 & RAW_PACKET_TRANSPORT) {
159 fake_rtp_packet_transport1_.reset(
160 new rtc::FakePacketTransport("channel1_rtp"));
161 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700162 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800163 fake_rtcp_packet_transport1_.reset(
164 new rtc::FakePacketTransport("channel1_rtcp"));
165 rtcp1 = fake_rtcp_packet_transport1_.get();
166 }
167 } else {
168 // Confirmed to work with KT_RSA and KT_ECDSA.
169 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
170 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
171 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700172 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800173 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
174 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
175 rtcp1 = fake_rtcp_dtls_transport1_.get();
176 }
177 if (flags1 & DTLS) {
178 auto cert1 =
179 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
180 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
181 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
182 if (fake_rtcp_dtls_transport1_) {
183 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
184 }
185 }
186 }
187 // Based on flags, create fake DTLS or raw packet transports.
188 if (flags2 & RAW_PACKET_TRANSPORT) {
189 fake_rtp_packet_transport2_.reset(
190 new rtc::FakePacketTransport("channel2_rtp"));
191 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700192 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800193 fake_rtcp_packet_transport2_.reset(
194 new rtc::FakePacketTransport("channel2_rtcp"));
195 rtcp2 = fake_rtcp_packet_transport2_.get();
196 }
197 } else {
198 // Confirmed to work with KT_RSA and KT_ECDSA.
199 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
200 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
201 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700202 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800203 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
204 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
205 rtcp2 = fake_rtcp_dtls_transport2_.get();
206 }
207 if (flags2 & DTLS) {
208 auto cert2 =
209 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
210 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
211 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
212 if (fake_rtcp_dtls_transport2_) {
213 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
214 }
215 }
216 }
Zhi Huange830e682018-03-30 10:48:35 -0700217 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
218 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
219 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
220 flags1);
221 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
222 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
223 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
224 flags2);
225
226 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
227 std::move(ch1), rtp_transport1_.get(), flags1);
228 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
229 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800230 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800231 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800232 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800233 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200234 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
235 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 CopyContent(local_media_content1_, &remote_media_content1_);
237 CopyContent(local_media_content2_, &remote_media_content2_);
238
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 // Add stream information (SSRC) to the local content but not to the remote
240 // content. This means that we per default know the SSRC of what we send but
241 // not what we receive.
242 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
243 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
244
245 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
246 if (flags1 & SSRC_MUX) {
247 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
248 }
249 if (flags2 & SSRC_MUX) {
250 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
251 }
252 }
Steve Anton8699a322017-11-06 15:53:33 -0800253 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200254 rtc::Thread* worker_thread,
255 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700256 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800257 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700258 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700259 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800260 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200261 auto channel = absl::make_unique<typename T::Channel>(
Steve Anton8699a322017-11-06 15:53:33 -0800262 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700263 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700264 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000265 return channel;
266 }
267
Zhi Huange830e682018-03-30 10:48:35 -0700268 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
269 rtc::PacketTransportInternal* rtp_packet_transport,
270 rtc::PacketTransportInternal* rtcp_packet_transport,
271 DtlsTransportInternal* rtp_dtls_transport,
272 DtlsTransportInternal* rtcp_dtls_transport,
273 int flags) {
274 if (flags & RTCP_MUX) {
275 rtcp_packet_transport = nullptr;
276 rtcp_dtls_transport = nullptr;
277 }
278
279 if (flags & DTLS) {
280 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
281 } else {
282 if (flags & RAW_PACKET_TRANSPORT) {
283 return CreateUnencryptedTransport(rtp_packet_transport,
284 rtcp_packet_transport);
285 } else {
286 return CreateUnencryptedTransport(rtp_dtls_transport,
287 rtcp_dtls_transport);
288 }
289 }
290 }
291
292 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
293 rtc::PacketTransportInternal* rtp_packet_transport,
294 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200295 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
296 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700297
298 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
299 if (rtcp_packet_transport) {
300 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
301 }
302 return rtp_transport;
303 }
304
305 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
306 cricket::DtlsTransportInternal* rtp_dtls_transport,
307 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200308 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700309 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700310
311 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
312 rtcp_dtls_transport);
313 return dtls_srtp_transport;
314 }
315
deadbeeff5346592017-01-24 21:51:21 -0800316 void ConnectFakeTransports() {
317 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
318 bool asymmetric = false;
319 // Depending on test flags, could be using DTLS or raw packet transport.
320 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
321 fake_rtp_dtls_transport1_->SetDestination(
322 fake_rtp_dtls_transport2_.get(), asymmetric);
323 }
324 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
325 fake_rtcp_dtls_transport1_->SetDestination(
326 fake_rtcp_dtls_transport2_.get(), asymmetric);
327 }
328 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
329 fake_rtp_packet_transport1_->SetDestination(
330 fake_rtp_packet_transport2_.get(), asymmetric);
331 }
332 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
333 fake_rtcp_packet_transport1_->SetDestination(
334 fake_rtcp_packet_transport2_.get(), asymmetric);
335 }
336 });
337 }
338
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800341 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 if (result) {
343 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800347 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000348 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800349 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 }
351 }
352 return result;
353 }
354
355 bool SendAccept() {
356 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000357 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800358 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 }
360
361 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 if (result) {
365 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000366 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800367 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 }
369 return result;
370 }
371
372 bool SendProvisionalAnswer() {
373 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800374 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 if (result) {
376 channel2_->Enable(true);
377 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800378 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800379 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 }
381 return result;
382 }
383
384 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000385 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800386 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000388 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800389 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 return result;
391 }
392
deadbeeff5346592017-01-24 21:51:21 -0800393 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 channel1_.reset();
395 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800396 fake_rtp_dtls_transport1_.reset();
397 fake_rtcp_dtls_transport1_.reset();
398 fake_rtp_dtls_transport2_.reset();
399 fake_rtcp_dtls_transport2_.reset();
400 fake_rtp_packet_transport1_.reset();
401 fake_rtcp_packet_transport1_.reset();
402 fake_rtp_packet_transport2_.reset();
403 fake_rtcp_packet_transport2_.reset();
404 if (network_thread_keeper_) {
405 network_thread_keeper_.reset();
406 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 return true;
408 }
409
410 bool AddStream1(int id) {
411 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
412 }
Yves Gerey665174f2018-06-19 15:03:05 +0200413 bool RemoveStream1(int id) { return channel1_->RemoveRecvStream(id); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendRtp1() {
416 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
417 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendRtp2() {
420 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
421 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendRtcp1() {
424 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 void SendRtcp2() {
427 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
429 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200430 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
431 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
432 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200434 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
435 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
436 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200438 void SendCustomRtcp1(uint32_t ssrc) {
439 rtc::Buffer data = CreateRtcpData(ssrc);
440 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 void SendCustomRtcp2(uint32_t ssrc) {
443 rtc::Buffer data = CreateRtcpData(ssrc);
444 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200457 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
459 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200460 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200461 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
462 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200464 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
466 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200468 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::Buffer data = CreateRtcpData(ssrc);
470 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200472 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Buffer data = CreateRtcpData(ssrc);
474 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
477 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::SetBE32(data.data() + 8, ssrc);
480 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000481 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000483 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 return data;
485 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
487 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490 return data;
491 }
492
Yves Gerey665174f2018-06-19 15:03:05 +0200493 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
494 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
495 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
496 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497
498 void CreateContent(int flags,
499 const cricket::AudioCodec& audio_codec,
500 const cricket::VideoCodec& video_codec,
501 typename T::Content* content) {
502 // overridden in specialized classes
503 }
504 void CopyContent(const typename T::Content& source,
505 typename T::Content* content) {
506 // overridden in specialized classes
507 }
508
Steve Anton18ee1d52017-09-11 11:32:35 -0700509 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700511 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
512 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700513 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 AddLegacyStreamInContent(ssrc, 0, content);
515 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 }
517
ossu292d6582016-03-17 02:31:13 -0700518 // Will manage the lifetime of a CallThread, making sure it's
519 // destroyed before this object goes out of scope.
520 class ScopedCallThread {
521 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200522 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700523 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 : thread_(rtc::Thread::Create()),
525 task_(new rtc::FunctorMessageHandler<void, 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 Add/RemoveStream properly forward to the media channel.
675 void TestStreams() {
676 CreateChannels(0, 0);
677 EXPECT_TRUE(AddStream1(1));
678 EXPECT_TRUE(AddStream1(2));
679 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
680 EXPECT_TRUE(RemoveStream1(2));
681 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
682 EXPECT_TRUE(RemoveStream1(1));
683 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
684 }
685
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 // Test that SetLocalContent and SetRemoteContent properly
687 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800688 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 void TestChangeStreamParamsInContent() {
690 cricket::StreamParams stream1;
691 stream1.groupid = "group1";
692 stream1.id = "stream1";
693 stream1.ssrcs.push_back(kSsrc1);
694 stream1.cname = "stream1_cname";
695
696 cricket::StreamParams stream2;
697 stream2.groupid = "group1";
698 stream2.id = "stream2";
699 stream2.ssrcs.push_back(kSsrc2);
700 stream2.cname = "stream2_cname";
701
702 // Setup a call where channel 1 send |stream1| to channel 2.
703 CreateChannels(0, 0);
704 typename T::Content content1;
705 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
706 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800707 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 EXPECT_TRUE(channel1_->Enable(true));
709 EXPECT_EQ(1u, media_channel1_->send_streams().size());
710
Steve Anton3828c062017-12-06 10:34:51 -0800711 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800713 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714
715 // Channel 2 do not send anything.
716 typename T::Content content2;
717 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800718 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800720 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 EXPECT_TRUE(channel2_->Enable(true));
722 EXPECT_EQ(0u, media_channel2_->send_streams().size());
723
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200724 SendCustomRtp1(kSsrc1, 0);
725 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
727
728 // Let channel 2 update the content by sending |stream2| and enable SRTP.
729 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700730 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800732 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 ASSERT_EQ(1u, media_channel2_->send_streams().size());
734 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
735
Steve Anton3828c062017-12-06 10:34:51 -0800736 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
738 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
739
740 // Channel 1 replies but stop sending stream1.
741 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700742 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800743 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_EQ(0u, media_channel1_->send_streams().size());
745
Steve Anton3828c062017-12-06 10:34:51 -0800746 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
748
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200749 SendCustomRtp2(kSsrc2, 0);
750 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
752 }
753
754 // Test that we only start playout and sending at the right times.
755 void TestPlayoutAndSendingStates() {
756 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
758 EXPECT_FALSE(media_channel1_->playout());
759 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
762 EXPECT_FALSE(media_channel2_->playout());
763 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_FALSE(media_channel2_->sending());
765 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200766 if (verify_playout_) {
767 EXPECT_FALSE(media_channel1_->playout());
768 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800771 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200772 if (verify_playout_) {
773 EXPECT_TRUE(media_channel1_->playout());
774 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000776 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800777 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_FALSE(media_channel2_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800783 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_FALSE(media_channel2_->playout());
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800788 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200789 if (verify_playout_) {
790 EXPECT_TRUE(media_channel1_->playout());
791 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200793 if (verify_playout_) {
794 EXPECT_FALSE(media_channel2_->playout());
795 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 EXPECT_FALSE(media_channel2_->sending());
797 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
799 EXPECT_TRUE(media_channel2_->playout());
800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000802 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800803 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200804 if (verify_playout_) {
805 EXPECT_TRUE(media_channel1_->playout());
806 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807 EXPECT_TRUE(media_channel1_->sending());
808 }
809
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 // Test that changing the MediaContentDirection in the local and remote
811 // session description start playout and sending at the right time.
812 void TestMediaContentDirection() {
813 CreateChannels(0, 0);
814 typename T::Content content1;
815 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
816 typename T::Content content2;
817 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
818 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800819 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820
821 EXPECT_TRUE(channel1_->Enable(true));
822 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200823 if (verify_playout_) {
824 EXPECT_FALSE(media_channel1_->playout());
825 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200827 if (verify_playout_) {
828 EXPECT_FALSE(media_channel2_->playout());
829 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830 EXPECT_FALSE(media_channel2_->sending());
831
Steve Anton3828c062017-12-06 10:34:51 -0800832 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
833 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
834 EXPECT_TRUE(
835 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
836 EXPECT_TRUE(
837 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800838 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
841 EXPECT_TRUE(media_channel1_->playout());
842 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200844 if (verify_playout_) {
845 EXPECT_FALSE(media_channel2_->playout()); // local InActive
846 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 EXPECT_FALSE(media_channel2_->sending()); // local InActive
848
849 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800850 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800851 EXPECT_TRUE(
852 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
853 EXPECT_TRUE(
854 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855
Peter Boström34fbfff2015-09-24 19:20:30 +0200856 if (verify_playout_) {
857 EXPECT_TRUE(media_channel1_->playout());
858 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200860 if (verify_playout_) {
861 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
862 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
864
865 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800866 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800867 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
868 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869
Peter Boström34fbfff2015-09-24 19:20:30 +0200870 if (verify_playout_) {
871 EXPECT_TRUE(media_channel1_->playout());
872 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200874 if (verify_playout_) {
875 EXPECT_TRUE(media_channel2_->playout());
876 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 EXPECT_TRUE(media_channel2_->sending());
878 }
879
Honghai Zhangcc411c02016-03-29 17:27:21 -0700880 // Tests that when the transport channel signals a candidate pair change
881 // event, the media channel will receive a call on the network route change.
882 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700883 static constexpr uint16_t kLocalNetId = 1;
884 static constexpr uint16_t kRemoteNetId = 2;
885 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800886 // Ipv4(20) + UDP(8).
887 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800888 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200889
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800890 CreateChannels(DTLS, DTLS);
891 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700892
Honghai Zhangcc411c02016-03-29 17:27:21 -0700893 typename T::MediaChannel* media_channel1 =
894 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200895 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700896
Zhi Huang942bc2e2017-11-13 13:26:07 -0800897 // Need to wait for the threads before calling
898 // |set_num_network_route_changes| because the network route would be set
899 // when creating the channel.
900 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800902 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800903 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200904 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800905 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
906
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200907 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200908 });
909 WaitForThreads();
910 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700911 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200912 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700913
eladalon05b07bb2017-08-24 07:40:16 -0700914 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800915 rtc::NetworkRoute network_route;
916 network_route.connected = true;
917 network_route.local_network_id = kLocalNetId;
918 network_route.remote_network_id = kRemoteNetId;
919 network_route.last_sent_packet_id = kLastPacketId;
920 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200921 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800922 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
923
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200924 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200925 });
926 WaitForThreads();
927 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100928 EXPECT_TRUE(media_channel1->last_network_route().connected);
929 EXPECT_EQ(kLocalNetId,
930 media_channel1->last_network_route().local_network_id);
931 EXPECT_EQ(kRemoteNetId,
932 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200933 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700934 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800935 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800936 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700937 }
938
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 // Test setting up a call.
940 void TestCallSetup() {
941 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700942 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200944 if (verify_playout_) {
945 EXPECT_TRUE(media_channel1_->playout());
946 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 EXPECT_FALSE(media_channel1_->sending());
948 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700949 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950 EXPECT_TRUE(media_channel1_->sending());
951 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200952 if (verify_playout_) {
953 EXPECT_TRUE(media_channel2_->playout());
954 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 EXPECT_TRUE(media_channel2_->sending());
956 EXPECT_EQ(1U, media_channel2_->codecs().size());
957 }
958
959 // Test that we don't crash if packets are sent during call teardown
960 // when RTCP mux is enabled. This is a regression test against a specific
961 // race condition that would only occur when a RTCP packet was sent during
962 // teardown of a channel on which RTCP mux was enabled.
963 void TestCallTeardownRtcpMux() {
964 class LastWordMediaChannel : public T::MediaChannel {
965 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200966 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000967 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700968 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
969 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
971 }
972 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200973 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
974 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
975 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000976 EXPECT_TRUE(SendInitiate());
977 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800978 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 }
980
981 // Send voice RTP data to the other side and ensure it gets there.
982 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700983 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 EXPECT_TRUE(SendInitiate());
985 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700986 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
987 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200988 SendRtp1();
989 SendRtp2();
990 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 EXPECT_TRUE(CheckRtp1());
992 EXPECT_TRUE(CheckRtp2());
993 EXPECT_TRUE(CheckNoRtp1());
994 EXPECT_TRUE(CheckNoRtp2());
995 }
996
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200997 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800998 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200999 EXPECT_TRUE(SendInitiate());
1000 EXPECT_TRUE(SendAccept());
1001 SendRtp1();
1002 SendRtp2();
1003 SendRtcp1();
1004 SendRtcp2();
1005 // Do not wait, destroy channels.
1006 channel1_.reset(nullptr);
1007 channel2_.reset(nullptr);
1008 }
1009
deadbeefac22f702017-01-12 21:59:29 -08001010 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001012 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 EXPECT_TRUE(SendInitiate());
1014 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001015 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1016 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001017 SendRtcp1();
1018 SendRtcp2();
1019 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_TRUE(CheckRtcp1());
1021 EXPECT_TRUE(CheckRtcp2());
1022 EXPECT_TRUE(CheckNoRtcp1());
1023 EXPECT_TRUE(CheckNoRtcp2());
1024 }
1025
Zhi Huange830e682018-03-30 10:48:35 -07001026 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1027 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001028 EXPECT_FALSE(channel1_->srtp_active());
1029 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001031 WaitForThreads();
1032 EXPECT_TRUE(channel1_->writable());
1033 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001035 EXPECT_TRUE(channel1_->srtp_active());
1036 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001037 SendRtp1();
1038 SendRtp2();
1039 SendRtcp1();
1040 SendRtcp2();
1041 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 EXPECT_TRUE(CheckRtp1());
1043 EXPECT_TRUE(CheckRtp2());
1044 EXPECT_TRUE(CheckNoRtp1());
1045 EXPECT_TRUE(CheckNoRtp2());
1046 EXPECT_TRUE(CheckRtcp1());
1047 EXPECT_TRUE(CheckRtcp2());
1048 EXPECT_TRUE(CheckNoRtcp1());
1049 EXPECT_TRUE(CheckNoRtcp2());
1050 }
1051
1052 // Test that we can send and receive early media when a provisional answer is
1053 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1054 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001055 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056
Yves Gerey665174f2018-06-19 15:03:05 +02001057 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1058 EXPECT_TRUE(SendOffer());
1059 EXPECT_TRUE(SendProvisionalAnswer());
1060 EXPECT_TRUE(channel1_->srtp_active());
1061 EXPECT_TRUE(channel2_->srtp_active());
1062 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1063 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1064 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1065 SendCustomRtcp1(kSsrc1);
1066 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1067 WaitForThreads();
1068 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1069 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001070
Yves Gerey665174f2018-06-19 15:03:05 +02001071 // Send packets from callee and verify that it is received.
1072 SendCustomRtcp2(kSsrc2);
1073 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1074 WaitForThreads();
1075 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1076 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077
Yves Gerey665174f2018-06-19 15:03:05 +02001078 // Complete call setup and ensure everything is still OK.
1079 EXPECT_TRUE(SendFinalAnswer());
1080 EXPECT_TRUE(channel1_->srtp_active());
1081 EXPECT_TRUE(channel2_->srtp_active());
1082 SendCustomRtcp1(kSsrc1);
1083 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1084 SendCustomRtcp2(kSsrc2);
1085 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1086 WaitForThreads();
1087 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1088 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1089 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1090 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 }
1092
1093 // Test that we properly send RTP without SRTP from a thread.
1094 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001095 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(SendInitiate());
1097 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001098 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1099 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1100 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1101 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1102 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1103 send_rtcp1.thread(),
1104 send_rtcp2.thread()};
1105 WaitForThreads(involved_threads);
1106 EXPECT_TRUE(CheckRtp1());
1107 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 EXPECT_TRUE(CheckNoRtp1());
1109 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001110 EXPECT_TRUE(CheckRtcp1());
1111 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112 EXPECT_TRUE(CheckNoRtcp1());
1113 EXPECT_TRUE(CheckNoRtcp2());
1114 }
1115
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 // Test that the mediachannel retains its sending state after the transport
1117 // becomes non-writable.
1118 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001119 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 EXPECT_TRUE(SendInitiate());
1121 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001122 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1123 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
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(CheckRtp2());
1129 EXPECT_TRUE(CheckNoRtp1());
1130 EXPECT_TRUE(CheckNoRtp2());
1131
wu@webrtc.org97077a32013-10-25 21:18:33 +00001132 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001133 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1134 fake_rtp_dtls_transport1_->SetWritable(false);
1135 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001136 SendRtp1();
1137 SendRtp2();
1138 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(CheckRtp1());
1140 EXPECT_TRUE(CheckNoRtp2());
1141
1142 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001143 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1144 fake_rtp_dtls_transport1_->SetWritable(true);
1145 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001147 SendRtp1();
1148 SendRtp2();
1149 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_TRUE(CheckRtp1());
1151 EXPECT_TRUE(CheckRtp2());
1152 EXPECT_TRUE(CheckNoRtp1());
1153 EXPECT_TRUE(CheckNoRtp2());
1154
1155 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001156 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1157 bool asymmetric = true;
1158 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1159 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 EXPECT_TRUE(media_channel1_->sending());
1161
wu@webrtc.org97077a32013-10-25 21:18:33 +00001162 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001163 SendRtp1();
1164 SendRtp2();
1165 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 EXPECT_TRUE(CheckRtp1());
1167 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001168 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169
1170 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001171 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001172 bool asymmetric = true;
1173 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1174 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001175 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001177 SendRtp1();
1178 SendRtp2();
1179 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 EXPECT_TRUE(CheckRtp1());
1181 EXPECT_TRUE(CheckRtp2());
1182 EXPECT_TRUE(CheckNoRtp1());
1183 EXPECT_TRUE(CheckNoRtp2());
1184 }
1185
Yves Gerey665174f2018-06-19 15:03:05 +02001186 void SendBundleToBundle(const int* pl_types,
1187 int len,
1188 bool rtcp_mux,
1189 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001190 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001192 // Only pl_type1 was added to the bundle filter for both |channel1_|
1193 // and |channel2_|.
1194 int pl_type1 = pl_types[0];
1195 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001196 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001197 if (secure)
1198 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001199 if (rtcp_mux) {
1200 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001201 }
1202 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001205
1206 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001207 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1208 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1209 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001210 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001211 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1212 EXPECT_TRUE(CheckNoRtp1());
1213 EXPECT_TRUE(CheckNoRtp2());
1214
Zhi Huang365381f2018-04-13 16:44:34 -07001215 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1216 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001217 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001218 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1219 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001220
Zhi Huange830e682018-03-30 10:48:35 -07001221 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001222 SendCustomRtcp1(kSsrc1);
1223 SendCustomRtcp2(kSsrc2);
1224 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1226 EXPECT_TRUE(CheckNoRtcp1());
1227 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1228 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001230 SendCustomRtcp1(kSsrc2);
1231 SendCustomRtcp2(kSsrc1);
1232 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001233 // Bundle filter shouldn't filter out any RTCP.
1234 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1235 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236 }
1237
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 void TestSetContentFailure() {
1239 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240
Peter Thatchera6d24442015-07-09 21:26:36 -07001241 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001242 std::unique_ptr<typename T::Content> content(
1243 CreateMediaContentWithStream(1));
1244
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001246 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001247 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001248 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001249 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001250
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001252 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001253 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001254
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001255 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001256 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001257 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 }
1259
1260 void TestSendTwoOffers() {
1261 CreateChannels(0, 0);
1262
Peter Thatchera6d24442015-07-09 21:26:36 -07001263 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001264 std::unique_ptr<typename T::Content> content1(
1265 CreateMediaContentWithStream(1));
1266 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001267 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1269
Steve Anton18ee1d52017-09-11 11:32:35 -07001270 std::unique_ptr<typename T::Content> content2(
1271 CreateMediaContentWithStream(2));
1272 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001273 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1275 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1276 }
1277
1278 void TestReceiveTwoOffers() {
1279 CreateChannels(0, 0);
1280
Peter Thatchera6d24442015-07-09 21:26:36 -07001281 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001282 std::unique_ptr<typename T::Content> content1(
1283 CreateMediaContentWithStream(1));
1284 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001285 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1287
Steve Anton18ee1d52017-09-11 11:32:35 -07001288 std::unique_ptr<typename T::Content> content2(
1289 CreateMediaContentWithStream(2));
1290 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001291 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1293 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1294 }
1295
1296 void TestSendPrAnswer() {
1297 CreateChannels(0, 0);
1298
Peter Thatchera6d24442015-07-09 21:26:36 -07001299 std::string err;
1300 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001301 std::unique_ptr<typename T::Content> content1(
1302 CreateMediaContentWithStream(1));
1303 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001304 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1306
Peter Thatchera6d24442015-07-09 21:26:36 -07001307 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001308 std::unique_ptr<typename T::Content> content2(
1309 CreateMediaContentWithStream(2));
1310 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001311 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001312 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1313 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1314
Peter Thatchera6d24442015-07-09 21:26:36 -07001315 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001316 std::unique_ptr<typename T::Content> content3(
1317 CreateMediaContentWithStream(3));
1318 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001319 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1321 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1322 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1323 }
1324
1325 void TestReceivePrAnswer() {
1326 CreateChannels(0, 0);
1327
Peter Thatchera6d24442015-07-09 21:26:36 -07001328 std::string err;
1329 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001330 std::unique_ptr<typename T::Content> content1(
1331 CreateMediaContentWithStream(1));
1332 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001333 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001334 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1335
Peter Thatchera6d24442015-07-09 21:26:36 -07001336 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001337 std::unique_ptr<typename T::Content> content2(
1338 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001339 EXPECT_TRUE(
1340 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001341 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1342 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1343
Peter Thatchera6d24442015-07-09 21:26:36 -07001344 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001345 std::unique_ptr<typename T::Content> content3(
1346 CreateMediaContentWithStream(3));
1347 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001348 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1350 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1351 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1352 }
1353
1354 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001355 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356 EXPECT_TRUE(SendInitiate());
1357 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001358 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1359 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360
1361 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001362 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 // The sending message is only posted. channel2_ should be empty.
1364 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001365 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1366 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367
1368 // When channel1_ is deleted, the RTCP packet should be sent out to
1369 // channel2_.
1370 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001371 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 EXPECT_TRUE(CheckRtcp2());
1373 }
1374
zstein56162b92017-04-24 16:54:35 -07001375 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001376 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001377 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001378
zstein56162b92017-04-24 16:54:35 -07001379 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001380 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(media_channel1_->ready_to_send());
1382
zstein56162b92017-04-24 16:54:35 -07001383 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001384 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001385 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 }
1387
skvladdc1c62c2016-03-16 19:07:43 -07001388 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1389 typename T::Content content;
1390 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1391 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001392 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001393 }
1394
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001395 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001396 webrtc::RtpParameters parameters;
1397 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001398 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001399 parameters.encodings.push_back(encoding);
1400 return parameters;
1401 }
1402
1403 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001404 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001405 EXPECT_EQ(1UL, parameters.encodings.size());
1406 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1407 }
1408
1409 void DefaultMaxBitrateIsUnlimited() {
1410 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001411 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1412 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001413 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001414 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001415 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001416 }
1417
Zhi Huange830e682018-03-30 10:48:35 -07001418 // Test that when a channel gets new RtpTransport with a call to
1419 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1420 // with the options on the new one.
1421
Steve Anton8a63f782017-10-23 13:08:53 -07001422 // For example, audio and video may use separate socket options, but initially
1423 // be unbundled, then later become bundled. When this happens, their preferred
1424 // socket options should be merged to the underlying transport they share.
1425 void SocketOptionsMergedOnSetTransport() {
1426 constexpr int kSndBufSize = 4000;
1427 constexpr int kRcvBufSize = 8000;
1428
Zhi Huange830e682018-03-30 10:48:35 -07001429 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001430
1431 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1432 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1433 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1434 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1435
Zhi Huange830e682018-03-30 10:48:35 -07001436 new_rtp_transport_ = CreateDtlsSrtpTransport(
1437 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1438 static_cast<DtlsTransportInternal*>(
1439 channel2_->rtcp_packet_transport()));
1440 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001441
1442 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001443 ASSERT_TRUE(
1444 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1445 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001446 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001447 ASSERT_TRUE(
1448 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1449 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001450 EXPECT_EQ(kRcvBufSize, option_val);
1451 }
1452
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001453 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001454 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1455 static void ProcessThreadQueue(rtc::Thread* thread) {
1456 RTC_DCHECK(thread->IsCurrent());
1457 while (!thread->empty()) {
1458 thread->ProcessMessages(0);
1459 }
1460 }
1461 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1462 // |threads| and current thread post packets to network thread.
1463 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001464 thread->Invoke<void>(RTC_FROM_HERE,
1465 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001466 }
1467 ProcessThreadQueue(rtc::Thread::Current());
1468 // Network thread move them around and post back to worker = current thread.
1469 if (!network_thread_->IsCurrent()) {
1470 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001471 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001472 }
1473 // Worker thread = current Thread process received messages.
1474 ProcessThreadQueue(rtc::Thread::Current());
1475 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001476 // TODO(pbos): Remove playout from all media channels and let renderers mute
1477 // themselves.
1478 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001479 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1480 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001481 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1482 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1483 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1484 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1485 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1486 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1487 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1488 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001489 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1490 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1491 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 cricket::FakeMediaEngine media_engine_;
1493 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001494 typename T::MediaChannel* media_channel1_ = nullptr;
1495 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001496 std::unique_ptr<typename T::Channel> channel1_;
1497 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 typename T::Content local_media_content1_;
1499 typename T::Content local_media_content2_;
1500 typename T::Content remote_media_content1_;
1501 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001503 rtc::Buffer rtp_packet_;
1504 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001505 int rtcp_mux_activated_callbacks1_ = 0;
1506 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001507 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508};
1509
Yves Gerey665174f2018-06-19 15:03:05 +02001510template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511void ChannelTest<VoiceTraits>::CreateContent(
1512 int flags,
1513 const cricket::AudioCodec& audio_codec,
1514 const cricket::VideoCodec& video_codec,
1515 cricket::AudioContentDescription* audio) {
1516 audio->AddCodec(audio_codec);
1517 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518}
1519
Yves Gerey665174f2018-06-19 15:03:05 +02001520template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521void ChannelTest<VoiceTraits>::CopyContent(
1522 const cricket::AudioContentDescription& source,
1523 cricket::AudioContentDescription* audio) {
1524 *audio = source;
1525}
1526
Yves Gerey665174f2018-06-19 15:03:05 +02001527template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1529 const cricket::AudioCodec& c2) {
1530 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001531 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532}
1533
Peter Boström0c4e06b2015-10-07 12:23:21 +02001534template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001536 uint32_t ssrc,
1537 int flags,
1538 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 audio->AddLegacyStream(ssrc);
1540}
1541
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 public:
solenberg1dd98f32015-09-10 01:57:14 -07001544 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001545 VoiceChannelSingleThreadTest()
1546 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1547};
1548
1549class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1550 public:
1551 typedef ChannelTest<VoiceTraits> Base;
1552 VoiceChannelDoubleThreadTest()
1553 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554};
1555
jbauch5869f502017-06-29 12:31:36 -07001556class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001557 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001558 public:
1559 typedef ChannelTest<VoiceTraits> Base;
1560 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001561 : Base(true,
1562 kPcmuFrameWithExtensions,
1563 kRtcpReport,
1564 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001565};
1566
1567class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001568 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001569 public:
1570 typedef ChannelTest<VoiceTraits> Base;
1571 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001572 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1573 }
jbauch5869f502017-06-29 12:31:36 -07001574};
1575
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001577template <>
Steve Anton8699a322017-11-06 15:53:33 -08001578std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001579 rtc::Thread* worker_thread,
1580 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001581 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001582 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001583 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001584 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001585 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001586 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001587 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001588 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001589 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 return channel;
1591}
1592
1593// override to add 0 parameter
Yves Gerey665174f2018-06-19 15:03:05 +02001594template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595bool ChannelTest<VideoTraits>::AddStream1(int id) {
1596 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1597}
1598
Yves Gerey665174f2018-06-19 15:03:05 +02001599template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600void ChannelTest<VideoTraits>::CreateContent(
1601 int flags,
1602 const cricket::AudioCodec& audio_codec,
1603 const cricket::VideoCodec& video_codec,
1604 cricket::VideoContentDescription* video) {
1605 video->AddCodec(video_codec);
1606 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607}
1608
Yves Gerey665174f2018-06-19 15:03:05 +02001609template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610void ChannelTest<VideoTraits>::CopyContent(
1611 const cricket::VideoContentDescription& source,
1612 cricket::VideoContentDescription* video) {
1613 *video = source;
1614}
1615
Yves Gerey665174f2018-06-19 15:03:05 +02001616template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001617bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1618 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001619 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620}
1621
Peter Boström0c4e06b2015-10-07 12:23:21 +02001622template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001624 uint32_t ssrc,
1625 int flags,
1626 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 video->AddLegacyStream(ssrc);
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 public:
solenberg1dd98f32015-09-10 01:57:14 -07001632 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633 VideoChannelSingleThreadTest()
1634 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635};
1636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1638 public:
1639 typedef ChannelTest<VideoTraits> Base;
1640 VideoChannelDoubleThreadTest()
1641 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1642};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001644TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 Base::TestInit();
1646 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1647 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1648}
1649
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001650TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1651 Base::TestDeinit();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::TestSetContents();
1656}
1657
Johannes Kron9190b822018-10-29 11:22:05 +01001658TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1659 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1660}
1661
1662TEST_F(VoiceChannelSingleThreadTest,
1663 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1664 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1665}
1666
1667TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1668 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1669}
1670
1671TEST_F(VoiceChannelSingleThreadTest,
1672 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1673 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1674}
1675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001676TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 Base::TestSetContentsNullOffer();
1678}
1679
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001680TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 Base::TestSetContentsRtcpMux();
1682}
1683
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001684TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685 Base::TestSetContentsRtcpMux();
1686}
1687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001688TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689 Base::TestStreams();
1690}
1691
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001692TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 Base::TestChangeStreamParamsInContent();
1694}
1695
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001696TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001697 Base::TestPlayoutAndSendingStates();
1698}
1699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 Base::TestMediaContentDirection();
1702}
1703
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001704TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001705 Base::TestNetworkRouteChanges();
1706}
1707
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001708TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 Base::TestCallSetup();
1710}
1711
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001712TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 Base::TestCallTeardownRtcpMux();
1714}
1715
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001716TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 Base::SendRtpToRtp();
1718}
1719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001720TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 Base::SendRtcpToRtcp();
1722}
1723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001724TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001725 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726}
1727
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001728TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001729 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001730}
1731
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001732TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1734}
1735
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001736TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 Base::SendRtpToRtpOnThread();
1738}
1739
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 Base::SendWithWritabilityLoss();
1742}
1743
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 Base::TestSetContentFailure();
1746}
1747
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001748TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 Base::TestSendTwoOffers();
1750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753 Base::TestReceiveTwoOffers();
1754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 Base::TestSendPrAnswer();
1758}
1759
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001760TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 Base::TestReceivePrAnswer();
1762}
1763
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 Base::TestFlushRtcp();
1766}
1767
zstein56162b92017-04-24 16:54:35 -07001768TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1769 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001773 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774}
1775
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001777 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001778}
1779
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001780TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001781 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001782}
1783
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001784TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001785 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001789 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001790}
1791
Steve Anton8a63f782017-10-23 13:08:53 -07001792TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1793 Base::SocketOptionsMergedOnSetTransport();
1794}
1795
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796// VoiceChannelDoubleThreadTest
1797TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001799 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1800 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801}
1802
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001803TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1804 Base::TestDeinit();
1805}
1806
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001807TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 Base::TestSetContents();
1809}
1810
Johannes Kron9190b822018-10-29 11:22:05 +01001811TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1812 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1813}
1814
1815TEST_F(VoiceChannelDoubleThreadTest,
1816 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1817 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1818}
1819
1820TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1821 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1822}
1823
1824TEST_F(VoiceChannelDoubleThreadTest,
1825 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1826 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1827}
1828
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001829TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830 Base::TestSetContentsNullOffer();
1831}
1832
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001833TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834 Base::TestSetContentsRtcpMux();
1835}
1836
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001837TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 Base::TestSetContentsRtcpMux();
1839}
1840
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001841TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 Base::TestStreams();
1843}
1844
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001845TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846 Base::TestChangeStreamParamsInContent();
1847}
1848
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 Base::TestPlayoutAndSendingStates();
1851}
1852
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001853TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1854 Base::TestMediaContentDirection();
1855}
1856
1857TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1858 Base::TestNetworkRouteChanges();
1859}
1860
1861TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1862 Base::TestCallSetup();
1863}
1864
1865TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1866 Base::TestCallTeardownRtcpMux();
1867}
1868
1869TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1870 Base::SendRtpToRtp();
1871}
1872
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001873TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1874 Base::SendRtcpToRtcp();
1875}
1876
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001877TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001878 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879}
1880
1881TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001882 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001883}
1884
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001885TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1886 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1887}
1888
1889TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1890 Base::SendRtpToRtpOnThread();
1891}
1892
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001893TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1894 Base::SendWithWritabilityLoss();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1898 Base::TestSetContentFailure();
1899}
1900
1901TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1902 Base::TestSendTwoOffers();
1903}
1904
1905TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1906 Base::TestReceiveTwoOffers();
1907}
1908
1909TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1910 Base::TestSendPrAnswer();
1911}
1912
1913TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1914 Base::TestReceivePrAnswer();
1915}
1916
1917TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1918 Base::TestFlushRtcp();
1919}
1920
zstein56162b92017-04-24 16:54:35 -07001921TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1922 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923}
1924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001925TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1926 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1927}
1928
1929TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1930 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1931}
1932
1933TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1934 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1935}
1936
1937TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1938 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1939}
1940
1941TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1942 Base::DefaultMaxBitrateIsUnlimited();
1943}
1944
Steve Anton8a63f782017-10-23 13:08:53 -07001945TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1946 Base::SocketOptionsMergedOnSetTransport();
1947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949// VideoChannelSingleThreadTest
1950TEST_F(VideoChannelSingleThreadTest, TestInit) {
1951 Base::TestInit();
1952}
1953
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001954TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1955 Base::TestDeinit();
1956}
1957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1959 Base::TestSetContents();
1960}
1961
Johannes Kron9190b822018-10-29 11:22:05 +01001962TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1963 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1964}
1965
1966TEST_F(VideoChannelSingleThreadTest,
1967 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1968 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1969}
1970
1971TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1972 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1973}
1974
1975TEST_F(VideoChannelSingleThreadTest,
1976 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1977 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1978}
1979
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001980TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1981 Base::TestSetContentsNullOffer();
1982}
1983
1984TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1985 Base::TestSetContentsRtcpMux();
1986}
1987
1988TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1989 Base::TestSetContentsRtcpMux();
1990}
1991
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001992TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1993 Base::TestStreams();
1994}
1995
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001996TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1997 Base::TestChangeStreamParamsInContent();
1998}
1999
2000TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2001 Base::TestPlayoutAndSendingStates();
2002}
2003
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002004TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002005 Base::TestMediaContentDirection();
2006}
2007
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002008TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002009 Base::TestNetworkRouteChanges();
2010}
2011
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002012TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013 Base::TestCallSetup();
2014}
2015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002016TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017 Base::TestCallTeardownRtcpMux();
2018}
2019
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002020TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021 Base::SendRtpToRtp();
2022}
2023
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002024TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002025 Base::SendRtcpToRtcp();
2026}
2027
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002028TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002029 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030}
2031
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002032TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002033 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034}
2035
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002036TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2038}
2039
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002040TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 Base::SendRtpToRtpOnThread();
2042}
2043
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002044TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 Base::SendWithWritabilityLoss();
2046}
2047
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002048TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049 Base::TestSetContentFailure();
2050}
2051
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002052TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053 Base::TestSendTwoOffers();
2054}
2055
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002056TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057 Base::TestReceiveTwoOffers();
2058}
2059
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002060TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002061 Base::TestSendPrAnswer();
2062}
2063
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002064TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002065 Base::TestReceivePrAnswer();
2066}
2067
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002068TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002069 Base::TestFlushRtcp();
2070}
2071
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002072TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002073 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074}
2075
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002076TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002077 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002078}
2079
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002080TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002081 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002082}
2083
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002084TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002085 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086}
2087
zstein56162b92017-04-24 16:54:35 -07002088TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2089 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090}
2091
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002092TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002093 Base::DefaultMaxBitrateIsUnlimited();
2094}
2095
Steve Anton8a63f782017-10-23 13:08:53 -07002096TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2097 Base::SocketOptionsMergedOnSetTransport();
2098}
2099
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002100// VideoChannelDoubleThreadTest
2101TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2102 Base::TestInit();
2103}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002105TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2106 Base::TestDeinit();
2107}
2108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2110 Base::TestSetContents();
2111}
2112
Johannes Kron9190b822018-10-29 11:22:05 +01002113TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2114 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2115}
2116
2117TEST_F(VideoChannelDoubleThreadTest,
2118 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2119 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2120}
2121
2122TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2123 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2124}
2125
2126TEST_F(VideoChannelDoubleThreadTest,
2127 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2128 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2129}
2130
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002131TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2132 Base::TestSetContentsNullOffer();
2133}
2134
2135TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2136 Base::TestSetContentsRtcpMux();
2137}
2138
2139TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2140 Base::TestSetContentsRtcpMux();
2141}
2142
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002143TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2144 Base::TestStreams();
2145}
2146
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2148 Base::TestChangeStreamParamsInContent();
2149}
2150
2151TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2152 Base::TestPlayoutAndSendingStates();
2153}
2154
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002155TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2156 Base::TestMediaContentDirection();
2157}
2158
2159TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2160 Base::TestNetworkRouteChanges();
2161}
2162
2163TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2164 Base::TestCallSetup();
2165}
2166
2167TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2168 Base::TestCallTeardownRtcpMux();
2169}
2170
2171TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2172 Base::SendRtpToRtp();
2173}
2174
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002175TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2176 Base::SendRtcpToRtcp();
2177}
2178
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002179TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002180 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002181}
2182
2183TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002184 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002185}
2186
2187TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2188 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2189}
2190
2191TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2192 Base::SendRtpToRtpOnThread();
2193}
2194
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002195TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2196 Base::SendWithWritabilityLoss();
2197}
2198
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002199TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2200 Base::TestSetContentFailure();
2201}
2202
2203TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2204 Base::TestSendTwoOffers();
2205}
2206
2207TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2208 Base::TestReceiveTwoOffers();
2209}
2210
2211TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2212 Base::TestSendPrAnswer();
2213}
2214
2215TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2216 Base::TestReceivePrAnswer();
2217}
2218
2219TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2220 Base::TestFlushRtcp();
2221}
2222
2223TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2224 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2225}
2226
2227TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2228 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2229}
2230
2231TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2232 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2233}
2234
2235TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2236 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2237}
2238
zstein56162b92017-04-24 16:54:35 -07002239TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2240 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002241}
2242
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002243TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2244 Base::DefaultMaxBitrateIsUnlimited();
2245}
2246
Steve Anton8a63f782017-10-23 13:08:53 -07002247TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2248 Base::SocketOptionsMergedOnSetTransport();
2249}
2250
deadbeef953c2ce2017-01-09 14:53:41 -08002251// RtpDataChannelSingleThreadTest
2252class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002254 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002255 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2257};
2258
deadbeef953c2ce2017-01-09 14:53:41 -08002259// RtpDataChannelDoubleThreadTest
2260class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261 public:
2262 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002263 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002264 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002265};
2266
2267// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002268template <>
Steve Anton8699a322017-11-06 15:53:33 -08002269std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002270 rtc::Thread* worker_thread,
2271 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002272 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002273 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002274 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002275 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002276 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002277 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002278 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07002279 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002280 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 return channel;
2282}
2283
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002285void ChannelTest<DataTraits>::CreateContent(
2286 int flags,
2287 const cricket::AudioCodec& audio_codec,
2288 const cricket::VideoCodec& video_codec,
2289 cricket::DataContentDescription* data) {
2290 data->AddCodec(kGoogleDataCodec);
2291 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292}
2293
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002294template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295void ChannelTest<DataTraits>::CopyContent(
2296 const cricket::DataContentDescription& source,
2297 cricket::DataContentDescription* data) {
2298 *data = source;
2299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2303 const cricket::DataCodec& c2) {
2304 return c1.name == c2.name;
2305}
2306
Peter Boström0c4e06b2015-10-07 12:23:21 +02002307template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002309 uint32_t ssrc,
2310 int flags,
2311 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312 data->AddLegacyStream(ssrc);
2313}
2314
deadbeef953c2ce2017-01-09 14:53:41 -08002315TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 Base::TestInit();
2317 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2318}
2319
deadbeef953c2ce2017-01-09 14:53:41 -08002320TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002321 Base::TestDeinit();
2322}
2323
deadbeef953c2ce2017-01-09 14:53:41 -08002324TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325 Base::TestSetContents();
2326}
2327
deadbeef953c2ce2017-01-09 14:53:41 -08002328TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 Base::TestSetContentsNullOffer();
2330}
2331
deadbeef953c2ce2017-01-09 14:53:41 -08002332TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333 Base::TestSetContentsRtcpMux();
2334}
2335
deadbeef953c2ce2017-01-09 14:53:41 -08002336TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337 Base::TestStreams();
2338}
2339
deadbeef953c2ce2017-01-09 14:53:41 -08002340TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 Base::TestChangeStreamParamsInContent();
2342}
2343
deadbeef953c2ce2017-01-09 14:53:41 -08002344TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345 Base::TestPlayoutAndSendingStates();
2346}
2347
deadbeef953c2ce2017-01-09 14:53:41 -08002348TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 Base::TestMediaContentDirection();
2350}
2351
deadbeef953c2ce2017-01-09 14:53:41 -08002352TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353 Base::TestCallSetup();
2354}
2355
deadbeef953c2ce2017-01-09 14:53:41 -08002356TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 Base::TestCallTeardownRtcpMux();
2358}
2359
zstein56162b92017-04-24 16:54:35 -07002360TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2361 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362}
2363
deadbeef953c2ce2017-01-09 14:53:41 -08002364TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::SendRtpToRtp();
2366}
2367
deadbeef953c2ce2017-01-09 14:53:41 -08002368TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::SendRtcpToRtcp();
2370}
2371
deadbeef953c2ce2017-01-09 14:53:41 -08002372TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::SendRtpToRtpOnThread();
2374}
2375
deadbeef953c2ce2017-01-09 14:53:41 -08002376TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 Base::SendWithWritabilityLoss();
2378}
2379
Steve Anton8a63f782017-10-23 13:08:53 -07002380TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2381 Base::SocketOptionsMergedOnSetTransport();
2382}
2383
deadbeef953c2ce2017-01-09 14:53:41 -08002384TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002385 CreateChannels(0, 0);
2386 EXPECT_TRUE(SendInitiate());
2387 EXPECT_TRUE(SendAccept());
2388
2389 cricket::SendDataParams params;
2390 params.ssrc = 42;
2391 unsigned char data[] = {'f', 'o', 'o'};
2392 rtc::CopyOnWriteBuffer payload(data, 3);
2393 cricket::SendDataResult result;
2394 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2395 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2396 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2397}
2398
deadbeef953c2ce2017-01-09 14:53:41 -08002399TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002400 Base::TestInit();
2401 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2402}
2403
deadbeef953c2ce2017-01-09 14:53:41 -08002404TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002405 Base::TestDeinit();
2406}
2407
deadbeef953c2ce2017-01-09 14:53:41 -08002408TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002409 Base::TestSetContents();
2410}
2411
deadbeef953c2ce2017-01-09 14:53:41 -08002412TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002413 Base::TestSetContentsNullOffer();
2414}
2415
deadbeef953c2ce2017-01-09 14:53:41 -08002416TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002417 Base::TestSetContentsRtcpMux();
2418}
2419
deadbeef953c2ce2017-01-09 14:53:41 -08002420TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002421 Base::TestStreams();
2422}
2423
deadbeef953c2ce2017-01-09 14:53:41 -08002424TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002425 Base::TestChangeStreamParamsInContent();
2426}
2427
deadbeef953c2ce2017-01-09 14:53:41 -08002428TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429 Base::TestPlayoutAndSendingStates();
2430}
2431
deadbeef953c2ce2017-01-09 14:53:41 -08002432TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433 Base::TestMediaContentDirection();
2434}
2435
deadbeef953c2ce2017-01-09 14:53:41 -08002436TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437 Base::TestCallSetup();
2438}
2439
deadbeef953c2ce2017-01-09 14:53:41 -08002440TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441 Base::TestCallTeardownRtcpMux();
2442}
2443
zstein56162b92017-04-24 16:54:35 -07002444TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2445 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002446}
2447
deadbeef953c2ce2017-01-09 14:53:41 -08002448TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449 Base::SendRtpToRtp();
2450}
2451
deadbeef953c2ce2017-01-09 14:53:41 -08002452TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453 Base::SendRtcpToRtcp();
2454}
2455
deadbeef953c2ce2017-01-09 14:53:41 -08002456TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457 Base::SendRtpToRtpOnThread();
2458}
2459
deadbeef953c2ce2017-01-09 14:53:41 -08002460TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461 Base::SendWithWritabilityLoss();
2462}
2463
Steve Anton8a63f782017-10-23 13:08:53 -07002464TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2465 Base::SocketOptionsMergedOnSetTransport();
2466}
2467
deadbeef953c2ce2017-01-09 14:53:41 -08002468TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 CreateChannels(0, 0);
2470 EXPECT_TRUE(SendInitiate());
2471 EXPECT_TRUE(SendAccept());
2472
2473 cricket::SendDataParams params;
2474 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002475 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002476 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 cricket::SendDataResult result;
2478 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002479 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2481}
2482
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483// TODO(pthatcher): TestSetReceiver?