blob: 5e15dbd89f71637d84560f86156350201df2f343 [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"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "media/base/fake_media_engine.h"
21#include "media/base/fake_rtp.h"
22#include "media/base/media_channel.h"
23#include "p2p/base/candidate_pair_interface.h"
24#include "p2p/base/fake_dtls_transport.h"
25#include "p2p/base/fake_packet_transport.h"
26#include "p2p/base/ice_transport_internal.h"
27#include "p2p/base/p2p_constants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Yves Gerey3e707812018-11-28 16:47:49 +010038#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>
Artem Titovd8bd7502019-01-09 21:10:00 +0100523 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100525 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
526 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700527 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700528 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700529 }
530
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700534
535 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200536 std::unique_ptr<rtc::Thread> thread_;
537 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700538 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
541 return false; // overridden in specialized classes
542 }
543
deadbeeff5346592017-01-24 21:51:21 -0800544 void OnRtcpMuxFullyActive1(const std::string&) {
545 rtcp_mux_activated_callbacks1_++;
546 }
547 void OnRtcpMuxFullyActive2(const std::string&) {
548 rtcp_mux_activated_callbacks2_++;
549 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550
Honghai Zhangcc411c02016-03-29 17:27:21 -0700551 cricket::CandidatePairInterface* last_selected_candidate_pair() {
552 return last_selected_candidate_pair_;
553 }
554
Peter Boström0c4e06b2015-10-07 12:23:21 +0200555 void AddLegacyStreamInContent(uint32_t ssrc,
556 int flags,
557 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Base implementation.
559 }
560
561 // Tests that can be used by derived classes.
562
563 // Basic sanity check.
564 void TestInit() {
565 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700566 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200568 if (verify_playout_) {
569 EXPECT_FALSE(media_channel1_->playout());
570 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 EXPECT_TRUE(media_channel1_->codecs().empty());
572 EXPECT_TRUE(media_channel1_->recv_streams().empty());
573 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
574 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
575 }
576
577 // Test that SetLocalContent and SetRemoteContent properly configure
578 // the codecs.
579 void TestSetContents() {
580 CreateChannels(0, 0);
581 typename T::Content content;
582 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800583 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800585 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200587 EXPECT_TRUE(
588 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 }
590
Johannes Kron9190b822018-10-29 11:22:05 +0100591 // Test that SetLocalContent and SetRemoteContent properly configure
592 // extmap-allow-mixed.
593 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
594 // For a caller, SetLocalContent() is called first with an offer and next
595 // SetRemoteContent() is called with the answer.
596 CreateChannels(0, 0);
597 typename T::Content content;
598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
600 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
601 content.set_extmap_allow_mixed_enum(offer_enum);
602 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
603 content.set_extmap_allow_mixed_enum(answer_enum);
604 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
605 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
606 }
607 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
608 // For a callee, SetRemoteContent() is called first with an offer and next
609 // SetLocalContent() is called with the answer.
610 CreateChannels(0, 0);
611 typename T::Content content;
612 CreateContent(0, kPcmuCodec, kH264Codec, &content);
613 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
614 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
615 content.set_extmap_allow_mixed_enum(offer_enum);
616 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
617 content.set_extmap_allow_mixed_enum(answer_enum);
618 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
619 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
620 }
621
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 // Test that SetLocalContent and SetRemoteContent properly deals
623 // with an empty offer.
624 void TestSetContentsNullOffer() {
625 CreateChannels(0, 0);
626 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800627 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 CreateContent(0, kPcmuCodec, kH264Codec, &content);
629 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800630 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200632 EXPECT_TRUE(
633 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 }
635
636 // Test that SetLocalContent and SetRemoteContent properly set RTCP
637 // mux.
638 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800639 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 typename T::Content content;
641 CreateContent(0, kPcmuCodec, kH264Codec, &content);
642 // Both sides agree on mux. Should no longer be a separate RTCP channel.
643 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800644 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
645 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 }
651
652 // Test that SetLocalContent and SetRemoteContent properly set RTCP
653 // mux when a provisional answer is received.
654 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800655 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 typename T::Content content;
657 CreateContent(0, kPcmuCodec, kH264Codec, &content);
658 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800659 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
660 EXPECT_TRUE(
661 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800662 // Both sides agree on mux. Should signal RTCP mux as fully activated.
663 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800665 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800667 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800669 EXPECT_TRUE(
670 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
671 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800672 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 }
674
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 // Test that Add/RemoveStream properly forward to the media channel.
676 void TestStreams() {
677 CreateChannels(0, 0);
678 EXPECT_TRUE(AddStream1(1));
679 EXPECT_TRUE(AddStream1(2));
680 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
681 EXPECT_TRUE(RemoveStream1(2));
682 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
683 EXPECT_TRUE(RemoveStream1(1));
684 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
685 }
686
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 // Test that SetLocalContent and SetRemoteContent properly
688 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800689 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 void TestChangeStreamParamsInContent() {
691 cricket::StreamParams stream1;
692 stream1.groupid = "group1";
693 stream1.id = "stream1";
694 stream1.ssrcs.push_back(kSsrc1);
695 stream1.cname = "stream1_cname";
696
697 cricket::StreamParams stream2;
698 stream2.groupid = "group1";
699 stream2.id = "stream2";
700 stream2.ssrcs.push_back(kSsrc2);
701 stream2.cname = "stream2_cname";
702
703 // Setup a call where channel 1 send |stream1| to channel 2.
704 CreateChannels(0, 0);
705 typename T::Content content1;
706 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
707 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800708 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel1_->Enable(true));
710 EXPECT_EQ(1u, media_channel1_->send_streams().size());
711
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800714 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715
716 // Channel 2 do not send anything.
717 typename T::Content content2;
718 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800719 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800721 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_TRUE(channel2_->Enable(true));
723 EXPECT_EQ(0u, media_channel2_->send_streams().size());
724
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200725 SendCustomRtp1(kSsrc1, 0);
726 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
728
729 // Let channel 2 update the content by sending |stream2| and enable SRTP.
730 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700731 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800733 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 ASSERT_EQ(1u, media_channel2_->send_streams().size());
735 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
736
Steve Anton3828c062017-12-06 10:34:51 -0800737 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
739 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
740
741 // Channel 1 replies but stop sending stream1.
742 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700743 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800744 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_EQ(0u, media_channel1_->send_streams().size());
746
Steve Anton3828c062017-12-06 10:34:51 -0800747 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
749
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200750 SendCustomRtp2(kSsrc2, 0);
751 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
753 }
754
755 // Test that we only start playout and sending at the right times.
756 void TestPlayoutAndSendingStates() {
757 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200758 if (verify_playout_) {
759 EXPECT_FALSE(media_channel1_->playout());
760 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200762 if (verify_playout_) {
763 EXPECT_FALSE(media_channel2_->playout());
764 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765 EXPECT_FALSE(media_channel2_->sending());
766 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
768 EXPECT_FALSE(media_channel1_->playout());
769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000771 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800772 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_TRUE(media_channel1_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000777 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800778 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200779 if (verify_playout_) {
780 EXPECT_FALSE(media_channel2_->playout());
781 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000783 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800784 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 if (verify_playout_) {
786 EXPECT_FALSE(media_channel2_->playout());
787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800789 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200790 if (verify_playout_) {
791 EXPECT_TRUE(media_channel1_->playout());
792 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200794 if (verify_playout_) {
795 EXPECT_FALSE(media_channel2_->playout());
796 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 EXPECT_FALSE(media_channel2_->sending());
798 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 if (verify_playout_) {
800 EXPECT_TRUE(media_channel2_->playout());
801 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000803 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800804 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200805 if (verify_playout_) {
806 EXPECT_TRUE(media_channel1_->playout());
807 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808 EXPECT_TRUE(media_channel1_->sending());
809 }
810
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811 // Test that changing the MediaContentDirection in the local and remote
812 // session description start playout and sending at the right time.
813 void TestMediaContentDirection() {
814 CreateChannels(0, 0);
815 typename T::Content content1;
816 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
817 typename T::Content content2;
818 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
819 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800820 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821
822 EXPECT_TRUE(channel1_->Enable(true));
823 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200824 if (verify_playout_) {
825 EXPECT_FALSE(media_channel1_->playout());
826 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200828 if (verify_playout_) {
829 EXPECT_FALSE(media_channel2_->playout());
830 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 EXPECT_FALSE(media_channel2_->sending());
832
Steve Anton3828c062017-12-06 10:34:51 -0800833 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
834 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
835 EXPECT_TRUE(
836 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
837 EXPECT_TRUE(
838 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800839 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000840
Peter Boström34fbfff2015-09-24 19:20:30 +0200841 if (verify_playout_) {
842 EXPECT_TRUE(media_channel1_->playout());
843 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200845 if (verify_playout_) {
846 EXPECT_FALSE(media_channel2_->playout()); // local InActive
847 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848 EXPECT_FALSE(media_channel2_->sending()); // local InActive
849
850 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800851 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800852 EXPECT_TRUE(
853 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
854 EXPECT_TRUE(
855 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856
Peter Boström34fbfff2015-09-24 19:20:30 +0200857 if (verify_playout_) {
858 EXPECT_TRUE(media_channel1_->playout());
859 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200861 if (verify_playout_) {
862 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
863 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
865
866 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800867 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800868 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
869 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870
Peter Boström34fbfff2015-09-24 19:20:30 +0200871 if (verify_playout_) {
872 EXPECT_TRUE(media_channel1_->playout());
873 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200875 if (verify_playout_) {
876 EXPECT_TRUE(media_channel2_->playout());
877 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 EXPECT_TRUE(media_channel2_->sending());
879 }
880
Honghai Zhangcc411c02016-03-29 17:27:21 -0700881 // Tests that when the transport channel signals a candidate pair change
882 // event, the media channel will receive a call on the network route change.
883 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700884 static constexpr uint16_t kLocalNetId = 1;
885 static constexpr uint16_t kRemoteNetId = 2;
886 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800887 // Ipv4(20) + UDP(8).
888 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800889 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200890
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800891 CreateChannels(DTLS, DTLS);
892 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700893
Honghai Zhangcc411c02016-03-29 17:27:21 -0700894 typename T::MediaChannel* media_channel1 =
895 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200896 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700897
Zhi Huang942bc2e2017-11-13 13:26:07 -0800898 // Need to wait for the threads before calling
899 // |set_num_network_route_changes| because the network route would be set
900 // when creating the channel.
901 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200902 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800903 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800904 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200905 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800906 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
907
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200908 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200909 });
910 WaitForThreads();
911 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700912 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200913 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700914
eladalon05b07bb2017-08-24 07:40:16 -0700915 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800916 rtc::NetworkRoute network_route;
917 network_route.connected = true;
918 network_route.local_network_id = kLocalNetId;
919 network_route.remote_network_id = kRemoteNetId;
920 network_route.last_sent_packet_id = kLastPacketId;
921 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200922 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800923 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
924
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200925 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200926 });
927 WaitForThreads();
928 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100929 EXPECT_TRUE(media_channel1->last_network_route().connected);
930 EXPECT_EQ(kLocalNetId,
931 media_channel1->last_network_route().local_network_id);
932 EXPECT_EQ(kRemoteNetId,
933 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200934 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700935 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800936 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800937 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700938 }
939
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 // Test setting up a call.
941 void TestCallSetup() {
942 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700943 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200945 if (verify_playout_) {
946 EXPECT_TRUE(media_channel1_->playout());
947 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948 EXPECT_FALSE(media_channel1_->sending());
949 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700950 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_TRUE(media_channel1_->sending());
952 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200953 if (verify_playout_) {
954 EXPECT_TRUE(media_channel2_->playout());
955 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 EXPECT_TRUE(media_channel2_->sending());
957 EXPECT_EQ(1U, media_channel2_->codecs().size());
958 }
959
960 // Test that we don't crash if packets are sent during call teardown
961 // when RTCP mux is enabled. This is a regression test against a specific
962 // race condition that would only occur when a RTCP packet was sent during
963 // teardown of a channel on which RTCP mux was enabled.
964 void TestCallTeardownRtcpMux() {
965 class LastWordMediaChannel : public T::MediaChannel {
966 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700969 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
970 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
972 }
973 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200974 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
975 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
976 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977 EXPECT_TRUE(SendInitiate());
978 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800979 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 }
981
982 // Send voice RTP data to the other side and ensure it gets there.
983 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700984 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 EXPECT_TRUE(SendInitiate());
986 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700987 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
988 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200989 SendRtp1();
990 SendRtp2();
991 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 EXPECT_TRUE(CheckRtp1());
993 EXPECT_TRUE(CheckRtp2());
994 EXPECT_TRUE(CheckNoRtp1());
995 EXPECT_TRUE(CheckNoRtp2());
996 }
997
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200998 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800999 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001000 EXPECT_TRUE(SendInitiate());
1001 EXPECT_TRUE(SendAccept());
1002 SendRtp1();
1003 SendRtp2();
1004 SendRtcp1();
1005 SendRtcp2();
1006 // Do not wait, destroy channels.
1007 channel1_.reset(nullptr);
1008 channel2_.reset(nullptr);
1009 }
1010
deadbeefac22f702017-01-12 21:59:29 -08001011 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001012 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001013 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(SendInitiate());
1015 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001016 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1017 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001018 SendRtcp1();
1019 SendRtcp2();
1020 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 EXPECT_TRUE(CheckRtcp1());
1022 EXPECT_TRUE(CheckRtcp2());
1023 EXPECT_TRUE(CheckNoRtcp1());
1024 EXPECT_TRUE(CheckNoRtcp2());
1025 }
1026
Zhi Huange830e682018-03-30 10:48:35 -07001027 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1028 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001029 EXPECT_FALSE(channel1_->srtp_active());
1030 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001032 WaitForThreads();
1033 EXPECT_TRUE(channel1_->writable());
1034 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001036 EXPECT_TRUE(channel1_->srtp_active());
1037 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001038 SendRtp1();
1039 SendRtp2();
1040 SendRtcp1();
1041 SendRtcp2();
1042 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 EXPECT_TRUE(CheckRtp1());
1044 EXPECT_TRUE(CheckRtp2());
1045 EXPECT_TRUE(CheckNoRtp1());
1046 EXPECT_TRUE(CheckNoRtp2());
1047 EXPECT_TRUE(CheckRtcp1());
1048 EXPECT_TRUE(CheckRtcp2());
1049 EXPECT_TRUE(CheckNoRtcp1());
1050 EXPECT_TRUE(CheckNoRtcp2());
1051 }
1052
1053 // Test that we can send and receive early media when a provisional answer is
1054 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1055 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001056 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057
Yves Gerey665174f2018-06-19 15:03:05 +02001058 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1059 EXPECT_TRUE(SendOffer());
1060 EXPECT_TRUE(SendProvisionalAnswer());
1061 EXPECT_TRUE(channel1_->srtp_active());
1062 EXPECT_TRUE(channel2_->srtp_active());
1063 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1064 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1065 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1066 SendCustomRtcp1(kSsrc1);
1067 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1068 WaitForThreads();
1069 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1070 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071
Yves Gerey665174f2018-06-19 15:03:05 +02001072 // Send packets from callee and verify that it is received.
1073 SendCustomRtcp2(kSsrc2);
1074 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1075 WaitForThreads();
1076 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1077 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078
Yves Gerey665174f2018-06-19 15:03:05 +02001079 // Complete call setup and ensure everything is still OK.
1080 EXPECT_TRUE(SendFinalAnswer());
1081 EXPECT_TRUE(channel1_->srtp_active());
1082 EXPECT_TRUE(channel2_->srtp_active());
1083 SendCustomRtcp1(kSsrc1);
1084 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1085 SendCustomRtcp2(kSsrc2);
1086 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1087 WaitForThreads();
1088 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1089 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1090 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1091 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 }
1093
1094 // Test that we properly send RTP without SRTP from a thread.
1095 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001096 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_TRUE(SendInitiate());
1098 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001099 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1100 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1101 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1102 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1103 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1104 send_rtcp1.thread(),
1105 send_rtcp2.thread()};
1106 WaitForThreads(involved_threads);
1107 EXPECT_TRUE(CheckRtp1());
1108 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_TRUE(CheckNoRtp1());
1110 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001111 EXPECT_TRUE(CheckRtcp1());
1112 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113 EXPECT_TRUE(CheckNoRtcp1());
1114 EXPECT_TRUE(CheckNoRtcp2());
1115 }
1116
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 // Test that the mediachannel retains its sending state after the transport
1118 // becomes non-writable.
1119 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001120 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 EXPECT_TRUE(SendInitiate());
1122 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001123 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1124 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001125 SendRtp1();
1126 SendRtp2();
1127 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(CheckRtp1());
1129 EXPECT_TRUE(CheckRtp2());
1130 EXPECT_TRUE(CheckNoRtp1());
1131 EXPECT_TRUE(CheckNoRtp2());
1132
wu@webrtc.org97077a32013-10-25 21:18:33 +00001133 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001134 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1135 fake_rtp_dtls_transport1_->SetWritable(false);
1136 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001137 SendRtp1();
1138 SendRtp2();
1139 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(CheckRtp1());
1141 EXPECT_TRUE(CheckNoRtp2());
1142
1143 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001144 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1145 fake_rtp_dtls_transport1_->SetWritable(true);
1146 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001148 SendRtp1();
1149 SendRtp2();
1150 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 EXPECT_TRUE(CheckRtp1());
1152 EXPECT_TRUE(CheckRtp2());
1153 EXPECT_TRUE(CheckNoRtp1());
1154 EXPECT_TRUE(CheckNoRtp2());
1155
1156 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001157 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1158 bool asymmetric = true;
1159 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1160 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_TRUE(media_channel1_->sending());
1162
wu@webrtc.org97077a32013-10-25 21:18:33 +00001163 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001164 SendRtp1();
1165 SendRtp2();
1166 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 EXPECT_TRUE(CheckRtp1());
1168 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001169 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170
1171 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001172 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001173 bool asymmetric = true;
1174 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1175 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001176 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001178 SendRtp1();
1179 SendRtp2();
1180 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 EXPECT_TRUE(CheckRtp1());
1182 EXPECT_TRUE(CheckRtp2());
1183 EXPECT_TRUE(CheckNoRtp1());
1184 EXPECT_TRUE(CheckNoRtp2());
1185 }
1186
Yves Gerey665174f2018-06-19 15:03:05 +02001187 void SendBundleToBundle(const int* pl_types,
1188 int len,
1189 bool rtcp_mux,
1190 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001191 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001193 // Only pl_type1 was added to the bundle filter for both |channel1_|
1194 // and |channel2_|.
1195 int pl_type1 = pl_types[0];
1196 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001197 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001198 if (secure)
1199 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001200 if (rtcp_mux) {
1201 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001202 }
1203 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001206
1207 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001208 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1209 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1210 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001211 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001212 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1213 EXPECT_TRUE(CheckNoRtp1());
1214 EXPECT_TRUE(CheckNoRtp2());
1215
Zhi Huang365381f2018-04-13 16:44:34 -07001216 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1217 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001218 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001219 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1220 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001221
Zhi Huange830e682018-03-30 10:48:35 -07001222 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001223 SendCustomRtcp1(kSsrc1);
1224 SendCustomRtcp2(kSsrc2);
1225 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1227 EXPECT_TRUE(CheckNoRtcp1());
1228 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1229 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001231 SendCustomRtcp1(kSsrc2);
1232 SendCustomRtcp2(kSsrc1);
1233 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001234 // Bundle filter shouldn't filter out any RTCP.
1235 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1236 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001237 }
1238
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 void TestSetContentFailure() {
1240 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241
Peter Thatchera6d24442015-07-09 21:26:36 -07001242 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001243 std::unique_ptr<typename T::Content> content(
1244 CreateMediaContentWithStream(1));
1245
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001246 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001247 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001248 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001249 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001250 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001252 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001253 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001254 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001255
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001257 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001258 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001259 }
1260
1261 void TestSendTwoOffers() {
1262 CreateChannels(0, 0);
1263
Peter Thatchera6d24442015-07-09 21:26:36 -07001264 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001265 std::unique_ptr<typename T::Content> content1(
1266 CreateMediaContentWithStream(1));
1267 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001268 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001269 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1270
Steve Anton18ee1d52017-09-11 11:32:35 -07001271 std::unique_ptr<typename T::Content> content2(
1272 CreateMediaContentWithStream(2));
1273 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001274 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001275 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1276 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1277 }
1278
1279 void TestReceiveTwoOffers() {
1280 CreateChannels(0, 0);
1281
Peter Thatchera6d24442015-07-09 21:26:36 -07001282 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001283 std::unique_ptr<typename T::Content> content1(
1284 CreateMediaContentWithStream(1));
1285 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001286 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1288
Steve Anton18ee1d52017-09-11 11:32:35 -07001289 std::unique_ptr<typename T::Content> content2(
1290 CreateMediaContentWithStream(2));
1291 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001292 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1294 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1295 }
1296
1297 void TestSendPrAnswer() {
1298 CreateChannels(0, 0);
1299
Peter Thatchera6d24442015-07-09 21:26:36 -07001300 std::string err;
1301 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001302 std::unique_ptr<typename T::Content> content1(
1303 CreateMediaContentWithStream(1));
1304 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001305 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1307
Peter Thatchera6d24442015-07-09 21:26:36 -07001308 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001309 std::unique_ptr<typename T::Content> content2(
1310 CreateMediaContentWithStream(2));
1311 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001312 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001313 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1314 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1315
Peter Thatchera6d24442015-07-09 21:26:36 -07001316 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001317 std::unique_ptr<typename T::Content> content3(
1318 CreateMediaContentWithStream(3));
1319 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001320 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001321 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1322 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1323 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1324 }
1325
1326 void TestReceivePrAnswer() {
1327 CreateChannels(0, 0);
1328
Peter Thatchera6d24442015-07-09 21:26:36 -07001329 std::string err;
1330 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001331 std::unique_ptr<typename T::Content> content1(
1332 CreateMediaContentWithStream(1));
1333 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001334 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1336
Peter Thatchera6d24442015-07-09 21:26:36 -07001337 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001338 std::unique_ptr<typename T::Content> content2(
1339 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001340 EXPECT_TRUE(
1341 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1343 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1344
Peter Thatchera6d24442015-07-09 21:26:36 -07001345 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001346 std::unique_ptr<typename T::Content> content3(
1347 CreateMediaContentWithStream(3));
1348 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001349 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001350 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1351 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1352 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1353 }
1354
1355 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001356 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357 EXPECT_TRUE(SendInitiate());
1358 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001359 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1360 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361
1362 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001363 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 // The sending message is only posted. channel2_ should be empty.
1365 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001366 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1367 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368
1369 // When channel1_ is deleted, the RTCP packet should be sent out to
1370 // channel2_.
1371 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001372 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373 EXPECT_TRUE(CheckRtcp2());
1374 }
1375
zstein56162b92017-04-24 16:54:35 -07001376 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001377 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001378 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001379
zstein56162b92017-04-24 16:54:35 -07001380 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001381 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001382 EXPECT_TRUE(media_channel1_->ready_to_send());
1383
zstein56162b92017-04-24 16:54:35 -07001384 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001385 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001387 }
1388
skvladdc1c62c2016-03-16 19:07:43 -07001389 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1390 typename T::Content content;
1391 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1392 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001393 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001394 }
1395
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001396 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001397 webrtc::RtpParameters parameters;
1398 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001399 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001400 parameters.encodings.push_back(encoding);
1401 return parameters;
1402 }
1403
1404 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001405 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001406 EXPECT_EQ(1UL, parameters.encodings.size());
1407 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1408 }
1409
1410 void DefaultMaxBitrateIsUnlimited() {
1411 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001412 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1413 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001414 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001415 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001416 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001417 }
1418
Zhi Huange830e682018-03-30 10:48:35 -07001419 // Test that when a channel gets new RtpTransport with a call to
1420 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1421 // with the options on the new one.
1422
Steve Anton8a63f782017-10-23 13:08:53 -07001423 // For example, audio and video may use separate socket options, but initially
1424 // be unbundled, then later become bundled. When this happens, their preferred
1425 // socket options should be merged to the underlying transport they share.
1426 void SocketOptionsMergedOnSetTransport() {
1427 constexpr int kSndBufSize = 4000;
1428 constexpr int kRcvBufSize = 8000;
1429
Zhi Huange830e682018-03-30 10:48:35 -07001430 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001431
1432 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1433 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1434 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1435 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1436
Zhi Huange830e682018-03-30 10:48:35 -07001437 new_rtp_transport_ = CreateDtlsSrtpTransport(
1438 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1439 static_cast<DtlsTransportInternal*>(
1440 channel2_->rtcp_packet_transport()));
1441 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001442
1443 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001444 ASSERT_TRUE(
1445 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1446 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001447 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001448 ASSERT_TRUE(
1449 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1450 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001451 EXPECT_EQ(kRcvBufSize, option_val);
1452 }
1453
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001455 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1456 static void ProcessThreadQueue(rtc::Thread* thread) {
1457 RTC_DCHECK(thread->IsCurrent());
1458 while (!thread->empty()) {
1459 thread->ProcessMessages(0);
1460 }
1461 }
1462 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1463 // |threads| and current thread post packets to network thread.
1464 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001465 thread->Invoke<void>(RTC_FROM_HERE,
1466 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001467 }
1468 ProcessThreadQueue(rtc::Thread::Current());
1469 // Network thread move them around and post back to worker = current thread.
1470 if (!network_thread_->IsCurrent()) {
1471 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001472 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001473 }
1474 // Worker thread = current Thread process received messages.
1475 ProcessThreadQueue(rtc::Thread::Current());
1476 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001477 // TODO(pbos): Remove playout from all media channels and let renderers mute
1478 // themselves.
1479 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001480 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1481 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001482 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1483 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1484 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1485 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1486 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1487 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1488 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1489 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001490 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1491 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1492 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493 cricket::FakeMediaEngine media_engine_;
1494 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001495 typename T::MediaChannel* media_channel1_ = nullptr;
1496 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001497 std::unique_ptr<typename T::Channel> channel1_;
1498 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 typename T::Content local_media_content1_;
1500 typename T::Content local_media_content2_;
1501 typename T::Content remote_media_content1_;
1502 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 rtc::Buffer rtp_packet_;
1505 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001506 int rtcp_mux_activated_callbacks1_ = 0;
1507 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001508 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509};
1510
Yves Gerey665174f2018-06-19 15:03:05 +02001511template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512void ChannelTest<VoiceTraits>::CreateContent(
1513 int flags,
1514 const cricket::AudioCodec& audio_codec,
1515 const cricket::VideoCodec& video_codec,
1516 cricket::AudioContentDescription* audio) {
1517 audio->AddCodec(audio_codec);
1518 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519}
1520
Yves Gerey665174f2018-06-19 15:03:05 +02001521template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522void ChannelTest<VoiceTraits>::CopyContent(
1523 const cricket::AudioContentDescription& source,
1524 cricket::AudioContentDescription* audio) {
1525 *audio = source;
1526}
1527
Yves Gerey665174f2018-06-19 15:03:05 +02001528template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1530 const cricket::AudioCodec& c2) {
1531 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001532 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533}
1534
Peter Boström0c4e06b2015-10-07 12:23:21 +02001535template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001537 uint32_t ssrc,
1538 int flags,
1539 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 audio->AddLegacyStream(ssrc);
1541}
1542
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001543class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 public:
solenberg1dd98f32015-09-10 01:57:14 -07001545 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001546 VoiceChannelSingleThreadTest()
1547 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1548};
1549
1550class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1551 public:
1552 typedef ChannelTest<VoiceTraits> Base;
1553 VoiceChannelDoubleThreadTest()
1554 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555};
1556
jbauch5869f502017-06-29 12:31:36 -07001557class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001558 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001559 public:
1560 typedef ChannelTest<VoiceTraits> Base;
1561 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001562 : Base(true,
1563 kPcmuFrameWithExtensions,
1564 kRtcpReport,
1565 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001566};
1567
1568class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001569 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001570 public:
1571 typedef ChannelTest<VoiceTraits> Base;
1572 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001573 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1574 }
jbauch5869f502017-06-29 12:31:36 -07001575};
1576
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001578template <>
Steve Anton8699a322017-11-06 15:53:33 -08001579std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001580 rtc::Thread* worker_thread,
1581 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001582 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001583 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001584 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001585 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001586 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001587 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001588 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001589 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001590 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 return channel;
1592}
1593
1594// override to add 0 parameter
Yves Gerey665174f2018-06-19 15:03:05 +02001595template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596bool ChannelTest<VideoTraits>::AddStream1(int id) {
1597 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1598}
1599
Yves Gerey665174f2018-06-19 15:03:05 +02001600template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601void ChannelTest<VideoTraits>::CreateContent(
1602 int flags,
1603 const cricket::AudioCodec& audio_codec,
1604 const cricket::VideoCodec& video_codec,
1605 cricket::VideoContentDescription* video) {
1606 video->AddCodec(video_codec);
1607 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608}
1609
Yves Gerey665174f2018-06-19 15:03:05 +02001610template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611void ChannelTest<VideoTraits>::CopyContent(
1612 const cricket::VideoContentDescription& source,
1613 cricket::VideoContentDescription* video) {
1614 *video = source;
1615}
1616
Yves Gerey665174f2018-06-19 15:03:05 +02001617template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1619 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001620 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621}
1622
Peter Boström0c4e06b2015-10-07 12:23:21 +02001623template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001624void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001625 uint32_t ssrc,
1626 int flags,
1627 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 video->AddLegacyStream(ssrc);
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 public:
solenberg1dd98f32015-09-10 01:57:14 -07001633 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634 VideoChannelSingleThreadTest()
1635 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636};
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1639 public:
1640 typedef ChannelTest<VideoTraits> Base;
1641 VideoChannelDoubleThreadTest()
1642 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1643};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001645TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 Base::TestInit();
1647 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1648 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1649}
1650
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001651TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1652 Base::TestDeinit();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::TestSetContents();
1657}
1658
Johannes Kron9190b822018-10-29 11:22:05 +01001659TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1660 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1661}
1662
1663TEST_F(VoiceChannelSingleThreadTest,
1664 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1665 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1666}
1667
1668TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1669 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1670}
1671
1672TEST_F(VoiceChannelSingleThreadTest,
1673 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1674 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 Base::TestSetContentsNullOffer();
1679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 Base::TestSetContentsRtcpMux();
1683}
1684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001685TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 Base::TestSetContentsRtcpMux();
1687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 Base::TestStreams();
1691}
1692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001693TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 Base::TestChangeStreamParamsInContent();
1695}
1696
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001697TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 Base::TestPlayoutAndSendingStates();
1699}
1700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001701TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 Base::TestMediaContentDirection();
1703}
1704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001705TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001706 Base::TestNetworkRouteChanges();
1707}
1708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 Base::TestCallSetup();
1711}
1712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 Base::TestCallTeardownRtcpMux();
1715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 Base::SendRtpToRtp();
1719}
1720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001721TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722 Base::SendRtcpToRtcp();
1723}
1724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001726 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727}
1728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001729TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001730 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001731}
1732
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001733TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1735}
1736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 Base::SendRtpToRtpOnThread();
1739}
1740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 Base::SendWithWritabilityLoss();
1743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 Base::TestSetContentFailure();
1747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 Base::TestSendTwoOffers();
1751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 Base::TestReceiveTwoOffers();
1755}
1756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001757TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 Base::TestSendPrAnswer();
1759}
1760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001761TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 Base::TestReceivePrAnswer();
1763}
1764
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001765TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 Base::TestFlushRtcp();
1767}
1768
zstein56162b92017-04-24 16:54:35 -07001769TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1770 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771}
1772
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001774 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775}
1776
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001777TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001778 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001779}
1780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001782 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001783}
1784
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001785TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001786 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787}
1788
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001790 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001791}
1792
Steve Anton8a63f782017-10-23 13:08:53 -07001793TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1794 Base::SocketOptionsMergedOnSetTransport();
1795}
1796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797// VoiceChannelDoubleThreadTest
1798TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1801 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802}
1803
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001804TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1805 Base::TestDeinit();
1806}
1807
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809 Base::TestSetContents();
1810}
1811
Johannes Kron9190b822018-10-29 11:22:05 +01001812TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1813 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1814}
1815
1816TEST_F(VoiceChannelDoubleThreadTest,
1817 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1818 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1819}
1820
1821TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1822 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1823}
1824
1825TEST_F(VoiceChannelDoubleThreadTest,
1826 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1827 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1828}
1829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831 Base::TestSetContentsNullOffer();
1832}
1833
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001834TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835 Base::TestSetContentsRtcpMux();
1836}
1837
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001838TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839 Base::TestSetContentsRtcpMux();
1840}
1841
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001842TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 Base::TestStreams();
1844}
1845
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001846TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 Base::TestChangeStreamParamsInContent();
1848}
1849
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001850TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 Base::TestPlayoutAndSendingStates();
1852}
1853
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001854TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1855 Base::TestMediaContentDirection();
1856}
1857
1858TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1859 Base::TestNetworkRouteChanges();
1860}
1861
1862TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1863 Base::TestCallSetup();
1864}
1865
1866TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1867 Base::TestCallTeardownRtcpMux();
1868}
1869
1870TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1871 Base::SendRtpToRtp();
1872}
1873
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001874TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1875 Base::SendRtcpToRtcp();
1876}
1877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001879 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001880}
1881
1882TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001883 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001884}
1885
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001886TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1887 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1888}
1889
1890TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1891 Base::SendRtpToRtpOnThread();
1892}
1893
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001894TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1895 Base::SendWithWritabilityLoss();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1899 Base::TestSetContentFailure();
1900}
1901
1902TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1903 Base::TestSendTwoOffers();
1904}
1905
1906TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1907 Base::TestReceiveTwoOffers();
1908}
1909
1910TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1911 Base::TestSendPrAnswer();
1912}
1913
1914TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1915 Base::TestReceivePrAnswer();
1916}
1917
1918TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1919 Base::TestFlushRtcp();
1920}
1921
zstein56162b92017-04-24 16:54:35 -07001922TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1923 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1927 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1928}
1929
1930TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1931 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1932}
1933
1934TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1935 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1936}
1937
1938TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1939 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1940}
1941
1942TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1943 Base::DefaultMaxBitrateIsUnlimited();
1944}
1945
Steve Anton8a63f782017-10-23 13:08:53 -07001946TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1947 Base::SocketOptionsMergedOnSetTransport();
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950// VideoChannelSingleThreadTest
1951TEST_F(VideoChannelSingleThreadTest, TestInit) {
1952 Base::TestInit();
1953}
1954
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001955TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1956 Base::TestDeinit();
1957}
1958
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001959TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1960 Base::TestSetContents();
1961}
1962
Johannes Kron9190b822018-10-29 11:22:05 +01001963TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1964 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1965}
1966
1967TEST_F(VideoChannelSingleThreadTest,
1968 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1969 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1970}
1971
1972TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1973 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1974}
1975
1976TEST_F(VideoChannelSingleThreadTest,
1977 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1978 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1979}
1980
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001981TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1982 Base::TestSetContentsNullOffer();
1983}
1984
1985TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1986 Base::TestSetContentsRtcpMux();
1987}
1988
1989TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1990 Base::TestSetContentsRtcpMux();
1991}
1992
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001993TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1994 Base::TestStreams();
1995}
1996
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001997TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1998 Base::TestChangeStreamParamsInContent();
1999}
2000
2001TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2002 Base::TestPlayoutAndSendingStates();
2003}
2004
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002005TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006 Base::TestMediaContentDirection();
2007}
2008
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002009TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002010 Base::TestNetworkRouteChanges();
2011}
2012
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002013TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002014 Base::TestCallSetup();
2015}
2016
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002017TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002018 Base::TestCallTeardownRtcpMux();
2019}
2020
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002021TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022 Base::SendRtpToRtp();
2023}
2024
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002025TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 Base::SendRtcpToRtcp();
2027}
2028
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002029TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002030 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002031}
2032
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002033TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002034 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035}
2036
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002037TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2039}
2040
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002041TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002042 Base::SendRtpToRtpOnThread();
2043}
2044
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002045TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002046 Base::SendWithWritabilityLoss();
2047}
2048
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002049TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002050 Base::TestSetContentFailure();
2051}
2052
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002053TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054 Base::TestSendTwoOffers();
2055}
2056
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002057TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 Base::TestReceiveTwoOffers();
2059}
2060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002061TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 Base::TestSendPrAnswer();
2063}
2064
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002065TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066 Base::TestReceivePrAnswer();
2067}
2068
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002069TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 Base::TestFlushRtcp();
2071}
2072
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002074 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075}
2076
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002077TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002078 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002079}
2080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002081TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002082 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002083}
2084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002085TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002086 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002087}
2088
zstein56162b92017-04-24 16:54:35 -07002089TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2090 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091}
2092
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002093TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002094 Base::DefaultMaxBitrateIsUnlimited();
2095}
2096
Steve Anton8a63f782017-10-23 13:08:53 -07002097TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2098 Base::SocketOptionsMergedOnSetTransport();
2099}
2100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101// VideoChannelDoubleThreadTest
2102TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2103 Base::TestInit();
2104}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002106TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2107 Base::TestDeinit();
2108}
2109
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002110TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2111 Base::TestSetContents();
2112}
2113
Johannes Kron9190b822018-10-29 11:22:05 +01002114TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2115 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2116}
2117
2118TEST_F(VideoChannelDoubleThreadTest,
2119 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2120 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2121}
2122
2123TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2124 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2125}
2126
2127TEST_F(VideoChannelDoubleThreadTest,
2128 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2129 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2130}
2131
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002132TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2133 Base::TestSetContentsNullOffer();
2134}
2135
2136TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2137 Base::TestSetContentsRtcpMux();
2138}
2139
2140TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2141 Base::TestSetContentsRtcpMux();
2142}
2143
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002144TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2145 Base::TestStreams();
2146}
2147
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002148TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2149 Base::TestChangeStreamParamsInContent();
2150}
2151
2152TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2153 Base::TestPlayoutAndSendingStates();
2154}
2155
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002156TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2157 Base::TestMediaContentDirection();
2158}
2159
2160TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2161 Base::TestNetworkRouteChanges();
2162}
2163
2164TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2165 Base::TestCallSetup();
2166}
2167
2168TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2169 Base::TestCallTeardownRtcpMux();
2170}
2171
2172TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2173 Base::SendRtpToRtp();
2174}
2175
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002176TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2177 Base::SendRtcpToRtcp();
2178}
2179
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002180TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002181 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002182}
2183
2184TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002185 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002186}
2187
2188TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2189 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2190}
2191
2192TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2193 Base::SendRtpToRtpOnThread();
2194}
2195
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002196TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2197 Base::SendWithWritabilityLoss();
2198}
2199
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002200TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2201 Base::TestSetContentFailure();
2202}
2203
2204TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2205 Base::TestSendTwoOffers();
2206}
2207
2208TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2209 Base::TestReceiveTwoOffers();
2210}
2211
2212TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2213 Base::TestSendPrAnswer();
2214}
2215
2216TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2217 Base::TestReceivePrAnswer();
2218}
2219
2220TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2221 Base::TestFlushRtcp();
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2225 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2226}
2227
2228TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2229 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2230}
2231
2232TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2233 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2234}
2235
2236TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2237 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2238}
2239
zstein56162b92017-04-24 16:54:35 -07002240TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2241 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002242}
2243
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002244TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2245 Base::DefaultMaxBitrateIsUnlimited();
2246}
2247
Steve Anton8a63f782017-10-23 13:08:53 -07002248TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2249 Base::SocketOptionsMergedOnSetTransport();
2250}
2251
deadbeef953c2ce2017-01-09 14:53:41 -08002252// RtpDataChannelSingleThreadTest
2253class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002255 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002256 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002257 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2258};
2259
deadbeef953c2ce2017-01-09 14:53:41 -08002260// RtpDataChannelDoubleThreadTest
2261class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002262 public:
2263 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002264 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266};
2267
2268// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002269template <>
Steve Anton8699a322017-11-06 15:53:33 -08002270std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271 rtc::Thread* worker_thread,
2272 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002273 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002274 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002275 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002276 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002277 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002278 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002279 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07002280 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002281 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282 return channel;
2283}
2284
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002285template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286void ChannelTest<DataTraits>::CreateContent(
2287 int flags,
2288 const cricket::AudioCodec& audio_codec,
2289 const cricket::VideoCodec& video_codec,
2290 cricket::DataContentDescription* data) {
2291 data->AddCodec(kGoogleDataCodec);
2292 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293}
2294
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002295template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296void ChannelTest<DataTraits>::CopyContent(
2297 const cricket::DataContentDescription& source,
2298 cricket::DataContentDescription* data) {
2299 *data = source;
2300}
2301
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2304 const cricket::DataCodec& c2) {
2305 return c1.name == c2.name;
2306}
2307
Peter Boström0c4e06b2015-10-07 12:23:21 +02002308template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002310 uint32_t ssrc,
2311 int flags,
2312 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313 data->AddLegacyStream(ssrc);
2314}
2315
deadbeef953c2ce2017-01-09 14:53:41 -08002316TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317 Base::TestInit();
2318 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2319}
2320
deadbeef953c2ce2017-01-09 14:53:41 -08002321TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002322 Base::TestDeinit();
2323}
2324
deadbeef953c2ce2017-01-09 14:53:41 -08002325TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 Base::TestSetContents();
2327}
2328
deadbeef953c2ce2017-01-09 14:53:41 -08002329TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 Base::TestSetContentsNullOffer();
2331}
2332
deadbeef953c2ce2017-01-09 14:53:41 -08002333TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 Base::TestSetContentsRtcpMux();
2335}
2336
deadbeef953c2ce2017-01-09 14:53:41 -08002337TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 Base::TestStreams();
2339}
2340
deadbeef953c2ce2017-01-09 14:53:41 -08002341TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342 Base::TestChangeStreamParamsInContent();
2343}
2344
deadbeef953c2ce2017-01-09 14:53:41 -08002345TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346 Base::TestPlayoutAndSendingStates();
2347}
2348
deadbeef953c2ce2017-01-09 14:53:41 -08002349TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 Base::TestMediaContentDirection();
2351}
2352
deadbeef953c2ce2017-01-09 14:53:41 -08002353TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 Base::TestCallSetup();
2355}
2356
deadbeef953c2ce2017-01-09 14:53:41 -08002357TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 Base::TestCallTeardownRtcpMux();
2359}
2360
zstein56162b92017-04-24 16:54:35 -07002361TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2362 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363}
2364
deadbeef953c2ce2017-01-09 14:53:41 -08002365TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 Base::SendRtpToRtp();
2367}
2368
deadbeef953c2ce2017-01-09 14:53:41 -08002369TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 Base::SendRtcpToRtcp();
2371}
2372
deadbeef953c2ce2017-01-09 14:53:41 -08002373TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 Base::SendRtpToRtpOnThread();
2375}
2376
deadbeef953c2ce2017-01-09 14:53:41 -08002377TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 Base::SendWithWritabilityLoss();
2379}
2380
Steve Anton8a63f782017-10-23 13:08:53 -07002381TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2382 Base::SocketOptionsMergedOnSetTransport();
2383}
2384
deadbeef953c2ce2017-01-09 14:53:41 -08002385TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002386 CreateChannels(0, 0);
2387 EXPECT_TRUE(SendInitiate());
2388 EXPECT_TRUE(SendAccept());
2389
2390 cricket::SendDataParams params;
2391 params.ssrc = 42;
2392 unsigned char data[] = {'f', 'o', 'o'};
2393 rtc::CopyOnWriteBuffer payload(data, 3);
2394 cricket::SendDataResult result;
2395 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2396 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2397 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2398}
2399
deadbeef953c2ce2017-01-09 14:53:41 -08002400TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002401 Base::TestInit();
2402 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2403}
2404
deadbeef953c2ce2017-01-09 14:53:41 -08002405TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002406 Base::TestDeinit();
2407}
2408
deadbeef953c2ce2017-01-09 14:53:41 -08002409TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002410 Base::TestSetContents();
2411}
2412
deadbeef953c2ce2017-01-09 14:53:41 -08002413TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002414 Base::TestSetContentsNullOffer();
2415}
2416
deadbeef953c2ce2017-01-09 14:53:41 -08002417TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002418 Base::TestSetContentsRtcpMux();
2419}
2420
deadbeef953c2ce2017-01-09 14:53:41 -08002421TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002422 Base::TestStreams();
2423}
2424
deadbeef953c2ce2017-01-09 14:53:41 -08002425TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002426 Base::TestChangeStreamParamsInContent();
2427}
2428
deadbeef953c2ce2017-01-09 14:53:41 -08002429TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002430 Base::TestPlayoutAndSendingStates();
2431}
2432
deadbeef953c2ce2017-01-09 14:53:41 -08002433TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002434 Base::TestMediaContentDirection();
2435}
2436
deadbeef953c2ce2017-01-09 14:53:41 -08002437TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002438 Base::TestCallSetup();
2439}
2440
deadbeef953c2ce2017-01-09 14:53:41 -08002441TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002442 Base::TestCallTeardownRtcpMux();
2443}
2444
zstein56162b92017-04-24 16:54:35 -07002445TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2446 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447}
2448
deadbeef953c2ce2017-01-09 14:53:41 -08002449TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002450 Base::SendRtpToRtp();
2451}
2452
deadbeef953c2ce2017-01-09 14:53:41 -08002453TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002454 Base::SendRtcpToRtcp();
2455}
2456
deadbeef953c2ce2017-01-09 14:53:41 -08002457TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002458 Base::SendRtpToRtpOnThread();
2459}
2460
deadbeef953c2ce2017-01-09 14:53:41 -08002461TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002462 Base::SendWithWritabilityLoss();
2463}
2464
Steve Anton8a63f782017-10-23 13:08:53 -07002465TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2466 Base::SocketOptionsMergedOnSetTransport();
2467}
2468
deadbeef953c2ce2017-01-09 14:53:41 -08002469TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 CreateChannels(0, 0);
2471 EXPECT_TRUE(SendInitiate());
2472 EXPECT_TRUE(SendAccept());
2473
2474 cricket::SendDataParams params;
2475 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002476 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002477 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 cricket::SendDataResult result;
2479 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002480 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2482}
2483
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484// TODO(pthatcher): TestSetReceiver?