blob: 1ead1359b0528ab908151cfc3c7a55856558d883 [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
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp1() {
411 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200414 void SendRtp2() {
415 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
416 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtcp1() {
419 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200421 void SendRtcp2() {
422 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
426 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
427 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
430 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
431 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtcp1(uint32_t ssrc) {
434 rtc::Buffer data = CreateRtcpData(ssrc);
435 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtcp2(uint32_t ssrc) {
438 rtc::Buffer data = CreateRtcpData(ssrc);
439 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 }
451 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 }
454 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200455 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200456 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
457 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200459 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
461 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtcpData(ssrc);
465 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtcpData(ssrc);
469 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
472 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 rtc::SetBE32(data.data() + 8, ssrc);
475 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000476 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
482 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 return data;
486 }
487
Yves Gerey665174f2018-06-19 15:03:05 +0200488 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
489 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
490 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
491 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492
493 void CreateContent(int flags,
494 const cricket::AudioCodec& audio_codec,
495 const cricket::VideoCodec& video_codec,
496 typename T::Content* content) {
497 // overridden in specialized classes
498 }
499 void CopyContent(const typename T::Content& source,
500 typename T::Content* content) {
501 // overridden in specialized classes
502 }
503
Steve Anton18ee1d52017-09-11 11:32:35 -0700504 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700506 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
507 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700508 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700509 AddLegacyStreamInContent(ssrc, 0, content);
510 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511 }
512
ossu292d6582016-03-17 02:31:13 -0700513 // Will manage the lifetime of a CallThread, making sure it's
514 // destroyed before this object goes out of scope.
515 class ScopedCallThread {
516 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200517 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100518 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200519 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100520 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
521 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700522 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700523 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700524 }
525
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200526 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700527
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200528 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700529
530 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 std::unique_ptr<rtc::Thread> thread_;
532 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700533 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
536 return false; // overridden in specialized classes
537 }
538
deadbeeff5346592017-01-24 21:51:21 -0800539 void OnRtcpMuxFullyActive1(const std::string&) {
540 rtcp_mux_activated_callbacks1_++;
541 }
542 void OnRtcpMuxFullyActive2(const std::string&) {
543 rtcp_mux_activated_callbacks2_++;
544 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545
Honghai Zhangcc411c02016-03-29 17:27:21 -0700546 cricket::CandidatePairInterface* last_selected_candidate_pair() {
547 return last_selected_candidate_pair_;
548 }
549
Peter Boström0c4e06b2015-10-07 12:23:21 +0200550 void AddLegacyStreamInContent(uint32_t ssrc,
551 int flags,
552 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 // Base implementation.
554 }
555
556 // Tests that can be used by derived classes.
557
558 // Basic sanity check.
559 void TestInit() {
560 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700561 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200563 if (verify_playout_) {
564 EXPECT_FALSE(media_channel1_->playout());
565 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 EXPECT_TRUE(media_channel1_->codecs().empty());
567 EXPECT_TRUE(media_channel1_->recv_streams().empty());
568 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
569 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
570 }
571
572 // Test that SetLocalContent and SetRemoteContent properly configure
573 // the codecs.
574 void TestSetContents() {
575 CreateChannels(0, 0);
576 typename T::Content content;
577 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800578 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800580 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200582 EXPECT_TRUE(
583 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 }
585
Johannes Kron9190b822018-10-29 11:22:05 +0100586 // Test that SetLocalContent and SetRemoteContent properly configure
587 // extmap-allow-mixed.
588 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
589 // For a caller, SetLocalContent() is called first with an offer and next
590 // SetRemoteContent() is called with the answer.
591 CreateChannels(0, 0);
592 typename T::Content content;
593 CreateContent(0, kPcmuCodec, kH264Codec, &content);
594 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
595 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
596 content.set_extmap_allow_mixed_enum(offer_enum);
597 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
598 content.set_extmap_allow_mixed_enum(answer_enum);
599 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
600 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
601 }
602 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
603 // For a callee, SetRemoteContent() is called first with an offer and next
604 // SetLocalContent() is called with the answer.
605 CreateChannels(0, 0);
606 typename T::Content content;
607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
609 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
610 content.set_extmap_allow_mixed_enum(offer_enum);
611 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
612 content.set_extmap_allow_mixed_enum(answer_enum);
613 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
614 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
615 }
616
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Test that SetLocalContent and SetRemoteContent properly deals
618 // with an empty offer.
619 void TestSetContentsNullOffer() {
620 CreateChannels(0, 0);
621 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800622 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 CreateContent(0, kPcmuCodec, kH264Codec, &content);
624 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800625 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200627 EXPECT_TRUE(
628 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 }
630
631 // Test that SetLocalContent and SetRemoteContent properly set RTCP
632 // mux.
633 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800634 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 typename T::Content content;
636 CreateContent(0, kPcmuCodec, kH264Codec, &content);
637 // Both sides agree on mux. Should no longer be a separate RTCP channel.
638 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800639 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
640 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800642 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800644 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 }
646
647 // Test that SetLocalContent and SetRemoteContent properly set RTCP
648 // mux when a provisional answer is received.
649 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800650 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 typename T::Content content;
652 CreateContent(0, kPcmuCodec, kH264Codec, &content);
653 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800654 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
655 EXPECT_TRUE(
656 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800657 // Both sides agree on mux. Should signal RTCP mux as fully activated.
658 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800659 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800660 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800662 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(
665 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
666 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800667 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 }
669
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 // Test that SetLocalContent and SetRemoteContent properly
671 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800672 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 void TestChangeStreamParamsInContent() {
674 cricket::StreamParams stream1;
675 stream1.groupid = "group1";
676 stream1.id = "stream1";
677 stream1.ssrcs.push_back(kSsrc1);
678 stream1.cname = "stream1_cname";
679
680 cricket::StreamParams stream2;
681 stream2.groupid = "group1";
682 stream2.id = "stream2";
683 stream2.ssrcs.push_back(kSsrc2);
684 stream2.cname = "stream2_cname";
685
686 // Setup a call where channel 1 send |stream1| to channel 2.
687 CreateChannels(0, 0);
688 typename T::Content content1;
689 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
690 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_TRUE(channel1_->Enable(true));
693 EXPECT_EQ(1u, media_channel1_->send_streams().size());
694
Steve Anton3828c062017-12-06 10:34:51 -0800695 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800697 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
699 // Channel 2 do not send anything.
700 typename T::Content content2;
701 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800702 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800704 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_TRUE(channel2_->Enable(true));
706 EXPECT_EQ(0u, media_channel2_->send_streams().size());
707
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200708 SendCustomRtp1(kSsrc1, 0);
709 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
711
712 // Let channel 2 update the content by sending |stream2| and enable SRTP.
713 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700714 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800716 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 ASSERT_EQ(1u, media_channel2_->send_streams().size());
718 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
719
Steve Anton3828c062017-12-06 10:34:51 -0800720 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
722 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
723
724 // Channel 1 replies but stop sending stream1.
725 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700726 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800727 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 EXPECT_EQ(0u, media_channel1_->send_streams().size());
729
Steve Anton3828c062017-12-06 10:34:51 -0800730 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
732
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200733 SendCustomRtp2(kSsrc2, 0);
734 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
736 }
737
738 // Test that we only start playout and sending at the right times.
739 void TestPlayoutAndSendingStates() {
740 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200741 if (verify_playout_) {
742 EXPECT_FALSE(media_channel1_->playout());
743 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200745 if (verify_playout_) {
746 EXPECT_FALSE(media_channel2_->playout());
747 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_FALSE(media_channel2_->sending());
749 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200750 if (verify_playout_) {
751 EXPECT_FALSE(media_channel1_->playout());
752 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800755 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200756 if (verify_playout_) {
757 EXPECT_TRUE(media_channel1_->playout());
758 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000760 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800761 SdpType::kOffer, NULL));
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());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000766 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800767 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200768 if (verify_playout_) {
769 EXPECT_FALSE(media_channel2_->playout());
770 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800772 ConnectFakeTransports();
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());
Peter Boström34fbfff2015-09-24 19:20:30 +0200777 if (verify_playout_) {
778 EXPECT_FALSE(media_channel2_->playout());
779 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_FALSE(media_channel2_->sending());
781 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
783 EXPECT_TRUE(media_channel2_->playout());
784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000786 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800787 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200788 if (verify_playout_) {
789 EXPECT_TRUE(media_channel1_->playout());
790 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791 EXPECT_TRUE(media_channel1_->sending());
792 }
793
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794 // Test that changing the MediaContentDirection in the local and remote
795 // session description start playout and sending at the right time.
796 void TestMediaContentDirection() {
797 CreateChannels(0, 0);
798 typename T::Content content1;
799 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
800 typename T::Content content2;
801 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
802 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800803 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804
805 EXPECT_TRUE(channel1_->Enable(true));
806 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200807 if (verify_playout_) {
808 EXPECT_FALSE(media_channel1_->playout());
809 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200811 if (verify_playout_) {
812 EXPECT_FALSE(media_channel2_->playout());
813 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814 EXPECT_FALSE(media_channel2_->sending());
815
Steve Anton3828c062017-12-06 10:34:51 -0800816 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
817 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
818 EXPECT_TRUE(
819 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
820 EXPECT_TRUE(
821 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800822 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823
Peter Boström34fbfff2015-09-24 19:20:30 +0200824 if (verify_playout_) {
825 EXPECT_TRUE(media_channel1_->playout());
826 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200828 if (verify_playout_) {
829 EXPECT_FALSE(media_channel2_->playout()); // local InActive
830 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 EXPECT_FALSE(media_channel2_->sending()); // local InActive
832
833 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800834 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800835 EXPECT_TRUE(
836 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
837 EXPECT_TRUE(
838 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
841 EXPECT_TRUE(media_channel1_->playout());
842 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200844 if (verify_playout_) {
845 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
846 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
848
849 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800850 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800851 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
852 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853
Peter Boström34fbfff2015-09-24 19:20:30 +0200854 if (verify_playout_) {
855 EXPECT_TRUE(media_channel1_->playout());
856 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200858 if (verify_playout_) {
859 EXPECT_TRUE(media_channel2_->playout());
860 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861 EXPECT_TRUE(media_channel2_->sending());
862 }
863
Honghai Zhangcc411c02016-03-29 17:27:21 -0700864 // Tests that when the transport channel signals a candidate pair change
865 // event, the media channel will receive a call on the network route change.
866 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700867 static constexpr uint16_t kLocalNetId = 1;
868 static constexpr uint16_t kRemoteNetId = 2;
869 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800870 // Ipv4(20) + UDP(8).
871 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800872 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200873
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800874 CreateChannels(DTLS, DTLS);
875 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700876
Honghai Zhangcc411c02016-03-29 17:27:21 -0700877 typename T::MediaChannel* media_channel1 =
878 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200879 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700880
Zhi Huang942bc2e2017-11-13 13:26:07 -0800881 // Need to wait for the threads before calling
882 // |set_num_network_route_changes| because the network route would be set
883 // when creating the channel.
884 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200885 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800886 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800887 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200888 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800889 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
890
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200891 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 });
893 WaitForThreads();
894 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700895 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200896 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700897
eladalon05b07bb2017-08-24 07:40:16 -0700898 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800899 rtc::NetworkRoute network_route;
900 network_route.connected = true;
901 network_route.local_network_id = kLocalNetId;
902 network_route.remote_network_id = kRemoteNetId;
903 network_route.last_sent_packet_id = kLastPacketId;
904 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200905 // The transport channel becomes connected.
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());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100912 EXPECT_TRUE(media_channel1->last_network_route().connected);
913 EXPECT_EQ(kLocalNetId,
914 media_channel1->last_network_route().local_network_id);
915 EXPECT_EQ(kRemoteNetId,
916 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200917 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700918 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800919 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800920 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700921 }
922
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 // Test setting up a call.
924 void TestCallSetup() {
925 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700926 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200928 if (verify_playout_) {
929 EXPECT_TRUE(media_channel1_->playout());
930 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931 EXPECT_FALSE(media_channel1_->sending());
932 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700933 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000934 EXPECT_TRUE(media_channel1_->sending());
935 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200936 if (verify_playout_) {
937 EXPECT_TRUE(media_channel2_->playout());
938 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 EXPECT_TRUE(media_channel2_->sending());
940 EXPECT_EQ(1U, media_channel2_->codecs().size());
941 }
942
943 // Test that we don't crash if packets are sent during call teardown
944 // when RTCP mux is enabled. This is a regression test against a specific
945 // race condition that would only occur when a RTCP packet was sent during
946 // teardown of a channel on which RTCP mux was enabled.
947 void TestCallTeardownRtcpMux() {
948 class LastWordMediaChannel : public T::MediaChannel {
949 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200950 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700952 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
953 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
955 }
956 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200957 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
958 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
959 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 EXPECT_TRUE(SendInitiate());
961 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800962 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963 }
964
965 // Send voice RTP data to the other side and ensure it gets there.
966 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700967 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 EXPECT_TRUE(SendInitiate());
969 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700970 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
971 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200972 SendRtp1();
973 SendRtp2();
974 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 EXPECT_TRUE(CheckRtp1());
976 EXPECT_TRUE(CheckRtp2());
977 EXPECT_TRUE(CheckNoRtp1());
978 EXPECT_TRUE(CheckNoRtp2());
979 }
980
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200981 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800982 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200983 EXPECT_TRUE(SendInitiate());
984 EXPECT_TRUE(SendAccept());
985 SendRtp1();
986 SendRtp2();
987 SendRtcp1();
988 SendRtcp2();
989 // Do not wait, destroy channels.
990 channel1_.reset(nullptr);
991 channel2_.reset(nullptr);
992 }
993
deadbeefac22f702017-01-12 21:59:29 -0800994 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800996 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 EXPECT_TRUE(SendInitiate());
998 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700999 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1000 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001001 SendRtcp1();
1002 SendRtcp2();
1003 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 EXPECT_TRUE(CheckRtcp1());
1005 EXPECT_TRUE(CheckRtcp2());
1006 EXPECT_TRUE(CheckNoRtcp1());
1007 EXPECT_TRUE(CheckNoRtcp2());
1008 }
1009
Zhi Huange830e682018-03-30 10:48:35 -07001010 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1011 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001012 EXPECT_FALSE(channel1_->srtp_active());
1013 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001015 WaitForThreads();
1016 EXPECT_TRUE(channel1_->writable());
1017 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001019 EXPECT_TRUE(channel1_->srtp_active());
1020 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001021 SendRtp1();
1022 SendRtp2();
1023 SendRtcp1();
1024 SendRtcp2();
1025 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(CheckRtp1());
1027 EXPECT_TRUE(CheckRtp2());
1028 EXPECT_TRUE(CheckNoRtp1());
1029 EXPECT_TRUE(CheckNoRtp2());
1030 EXPECT_TRUE(CheckRtcp1());
1031 EXPECT_TRUE(CheckRtcp2());
1032 EXPECT_TRUE(CheckNoRtcp1());
1033 EXPECT_TRUE(CheckNoRtcp2());
1034 }
1035
1036 // Test that we can send and receive early media when a provisional answer is
1037 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1038 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001039 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040
Yves Gerey665174f2018-06-19 15:03:05 +02001041 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1042 EXPECT_TRUE(SendOffer());
1043 EXPECT_TRUE(SendProvisionalAnswer());
1044 EXPECT_TRUE(channel1_->srtp_active());
1045 EXPECT_TRUE(channel2_->srtp_active());
1046 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1047 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1048 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1049 SendCustomRtcp1(kSsrc1);
1050 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1051 WaitForThreads();
1052 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1053 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054
Yves Gerey665174f2018-06-19 15:03:05 +02001055 // Send packets from callee and verify that it is received.
1056 SendCustomRtcp2(kSsrc2);
1057 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1058 WaitForThreads();
1059 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1060 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061
Yves Gerey665174f2018-06-19 15:03:05 +02001062 // Complete call setup and ensure everything is still OK.
1063 EXPECT_TRUE(SendFinalAnswer());
1064 EXPECT_TRUE(channel1_->srtp_active());
1065 EXPECT_TRUE(channel2_->srtp_active());
1066 SendCustomRtcp1(kSsrc1);
1067 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1068 SendCustomRtcp2(kSsrc2);
1069 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1070 WaitForThreads();
1071 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1072 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1073 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1074 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 }
1076
1077 // Test that we properly send RTP without SRTP from a thread.
1078 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001079 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(SendInitiate());
1081 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001082 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1083 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1084 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1085 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1086 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1087 send_rtcp1.thread(),
1088 send_rtcp2.thread()};
1089 WaitForThreads(involved_threads);
1090 EXPECT_TRUE(CheckRtp1());
1091 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_TRUE(CheckNoRtp1());
1093 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001094 EXPECT_TRUE(CheckRtcp1());
1095 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(CheckNoRtcp1());
1097 EXPECT_TRUE(CheckNoRtcp2());
1098 }
1099
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 // Test that the mediachannel retains its sending state after the transport
1101 // becomes non-writable.
1102 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001103 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_TRUE(SendInitiate());
1105 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001106 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1107 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001108 SendRtp1();
1109 SendRtp2();
1110 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111 EXPECT_TRUE(CheckRtp1());
1112 EXPECT_TRUE(CheckRtp2());
1113 EXPECT_TRUE(CheckNoRtp1());
1114 EXPECT_TRUE(CheckNoRtp2());
1115
wu@webrtc.org97077a32013-10-25 21:18:33 +00001116 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001117 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1118 fake_rtp_dtls_transport1_->SetWritable(false);
1119 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001120 SendRtp1();
1121 SendRtp2();
1122 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 EXPECT_TRUE(CheckRtp1());
1124 EXPECT_TRUE(CheckNoRtp2());
1125
1126 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001127 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1128 fake_rtp_dtls_transport1_->SetWritable(true);
1129 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001131 SendRtp1();
1132 SendRtp2();
1133 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_TRUE(CheckRtp1());
1135 EXPECT_TRUE(CheckRtp2());
1136 EXPECT_TRUE(CheckNoRtp1());
1137 EXPECT_TRUE(CheckNoRtp2());
1138
1139 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001140 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1141 bool asymmetric = true;
1142 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1143 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144 EXPECT_TRUE(media_channel1_->sending());
1145
wu@webrtc.org97077a32013-10-25 21:18:33 +00001146 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001147 SendRtp1();
1148 SendRtp2();
1149 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_TRUE(CheckRtp1());
1151 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001152 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153
1154 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001155 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001156 bool asymmetric = true;
1157 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1158 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001159 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001161 SendRtp1();
1162 SendRtp2();
1163 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 EXPECT_TRUE(CheckRtp1());
1165 EXPECT_TRUE(CheckRtp2());
1166 EXPECT_TRUE(CheckNoRtp1());
1167 EXPECT_TRUE(CheckNoRtp2());
1168 }
1169
Yves Gerey665174f2018-06-19 15:03:05 +02001170 void SendBundleToBundle(const int* pl_types,
1171 int len,
1172 bool rtcp_mux,
1173 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001174 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001176 // Only pl_type1 was added to the bundle filter for both |channel1_|
1177 // and |channel2_|.
1178 int pl_type1 = pl_types[0];
1179 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001180 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001181 if (secure)
1182 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001183 if (rtcp_mux) {
1184 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001185 }
1186 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001189
1190 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001191 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1192 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1193 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001194 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001195 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1196 EXPECT_TRUE(CheckNoRtp1());
1197 EXPECT_TRUE(CheckNoRtp2());
1198
Zhi Huang365381f2018-04-13 16:44:34 -07001199 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1200 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001201 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001202 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1203 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001204
Zhi Huange830e682018-03-30 10:48:35 -07001205 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001206 SendCustomRtcp1(kSsrc1);
1207 SendCustomRtcp2(kSsrc2);
1208 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001209 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1210 EXPECT_TRUE(CheckNoRtcp1());
1211 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1212 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001214 SendCustomRtcp1(kSsrc2);
1215 SendCustomRtcp2(kSsrc1);
1216 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001217 // Bundle filter shouldn't filter out any RTCP.
1218 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1219 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220 }
1221
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 void TestSetContentFailure() {
1223 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224
Peter Thatchera6d24442015-07-09 21:26:36 -07001225 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001226 std::unique_ptr<typename T::Content> content(
1227 CreateMediaContentWithStream(1));
1228
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001230 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001231 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001232 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001233 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001236 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001237 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001238
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001240 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001241 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001242 }
1243
1244 void TestSendTwoOffers() {
1245 CreateChannels(0, 0);
1246
Peter Thatchera6d24442015-07-09 21:26:36 -07001247 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001248 std::unique_ptr<typename T::Content> content1(
1249 CreateMediaContentWithStream(1));
1250 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001251 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001252 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1253
Steve Anton18ee1d52017-09-11 11:32:35 -07001254 std::unique_ptr<typename T::Content> content2(
1255 CreateMediaContentWithStream(2));
1256 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001257 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1259 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1260 }
1261
1262 void TestReceiveTwoOffers() {
1263 CreateChannels(0, 0);
1264
Peter Thatchera6d24442015-07-09 21:26:36 -07001265 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001266 std::unique_ptr<typename T::Content> content1(
1267 CreateMediaContentWithStream(1));
1268 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001269 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001270 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1271
Steve Anton18ee1d52017-09-11 11:32:35 -07001272 std::unique_ptr<typename T::Content> content2(
1273 CreateMediaContentWithStream(2));
1274 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001275 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001276 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1277 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1278 }
1279
1280 void TestSendPrAnswer() {
1281 CreateChannels(0, 0);
1282
Peter Thatchera6d24442015-07-09 21:26:36 -07001283 std::string err;
1284 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001285 std::unique_ptr<typename T::Content> content1(
1286 CreateMediaContentWithStream(1));
1287 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001288 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1290
Peter Thatchera6d24442015-07-09 21:26:36 -07001291 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001292 std::unique_ptr<typename T::Content> content2(
1293 CreateMediaContentWithStream(2));
1294 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001295 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1297 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1298
Peter Thatchera6d24442015-07-09 21:26:36 -07001299 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001300 std::unique_ptr<typename T::Content> content3(
1301 CreateMediaContentWithStream(3));
1302 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001303 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1305 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1306 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1307 }
1308
1309 void TestReceivePrAnswer() {
1310 CreateChannels(0, 0);
1311
Peter Thatchera6d24442015-07-09 21:26:36 -07001312 std::string err;
1313 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001314 std::unique_ptr<typename T::Content> content1(
1315 CreateMediaContentWithStream(1));
1316 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001317 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1319
Peter Thatchera6d24442015-07-09 21:26:36 -07001320 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001321 std::unique_ptr<typename T::Content> content2(
1322 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001323 EXPECT_TRUE(
1324 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1326 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1327
Peter Thatchera6d24442015-07-09 21:26:36 -07001328 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001329 std::unique_ptr<typename T::Content> content3(
1330 CreateMediaContentWithStream(3));
1331 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001332 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001333 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1334 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1335 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1336 }
1337
1338 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001339 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(SendInitiate());
1341 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001342 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1343 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344
1345 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001346 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347 // The sending message is only posted. channel2_ should be empty.
1348 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001349 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1350 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351
1352 // When channel1_ is deleted, the RTCP packet should be sent out to
1353 // channel2_.
1354 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001355 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356 EXPECT_TRUE(CheckRtcp2());
1357 }
1358
zstein56162b92017-04-24 16:54:35 -07001359 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001360 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001362
zstein56162b92017-04-24 16:54:35 -07001363 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001364 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_TRUE(media_channel1_->ready_to_send());
1366
zstein56162b92017-04-24 16:54:35 -07001367 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001368 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 }
1371
skvladdc1c62c2016-03-16 19:07:43 -07001372 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1373 typename T::Content content;
1374 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1375 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001376 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001377 }
1378
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001379 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001380 webrtc::RtpParameters parameters;
1381 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001382 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001383 parameters.encodings.push_back(encoding);
1384 return parameters;
1385 }
1386
1387 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001388 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001389 EXPECT_EQ(1UL, parameters.encodings.size());
1390 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1391 }
1392
1393 void DefaultMaxBitrateIsUnlimited() {
1394 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001395 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1396 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001397 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001398 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001399 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001400 }
1401
Zhi Huange830e682018-03-30 10:48:35 -07001402 // Test that when a channel gets new RtpTransport with a call to
1403 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1404 // with the options on the new one.
1405
Steve Anton8a63f782017-10-23 13:08:53 -07001406 // For example, audio and video may use separate socket options, but initially
1407 // be unbundled, then later become bundled. When this happens, their preferred
1408 // socket options should be merged to the underlying transport they share.
1409 void SocketOptionsMergedOnSetTransport() {
1410 constexpr int kSndBufSize = 4000;
1411 constexpr int kRcvBufSize = 8000;
1412
Zhi Huange830e682018-03-30 10:48:35 -07001413 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001414
1415 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1416 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1417 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1418 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1419
Zhi Huange830e682018-03-30 10:48:35 -07001420 new_rtp_transport_ = CreateDtlsSrtpTransport(
1421 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1422 static_cast<DtlsTransportInternal*>(
1423 channel2_->rtcp_packet_transport()));
1424 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001425
1426 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001427 ASSERT_TRUE(
1428 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1429 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001430 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001431 ASSERT_TRUE(
1432 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1433 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001434 EXPECT_EQ(kRcvBufSize, option_val);
1435 }
1436
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1439 static void ProcessThreadQueue(rtc::Thread* thread) {
1440 RTC_DCHECK(thread->IsCurrent());
1441 while (!thread->empty()) {
1442 thread->ProcessMessages(0);
1443 }
1444 }
1445 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1446 // |threads| and current thread post packets to network thread.
1447 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001448 thread->Invoke<void>(RTC_FROM_HERE,
1449 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001450 }
1451 ProcessThreadQueue(rtc::Thread::Current());
1452 // Network thread move them around and post back to worker = current thread.
1453 if (!network_thread_->IsCurrent()) {
1454 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001455 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001456 }
1457 // Worker thread = current Thread process received messages.
1458 ProcessThreadQueue(rtc::Thread::Current());
1459 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001460 // TODO(pbos): Remove playout from all media channels and let renderers mute
1461 // themselves.
1462 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001463 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1464 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001465 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1466 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1467 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1468 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1469 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1470 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1471 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1472 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001473 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1474 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1475 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476 cricket::FakeMediaEngine media_engine_;
1477 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001478 typename T::MediaChannel* media_channel1_ = nullptr;
1479 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001480 std::unique_ptr<typename T::Channel> channel1_;
1481 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 typename T::Content local_media_content1_;
1483 typename T::Content local_media_content2_;
1484 typename T::Content remote_media_content1_;
1485 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001487 rtc::Buffer rtp_packet_;
1488 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001489 int rtcp_mux_activated_callbacks1_ = 0;
1490 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001491 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492};
1493
Yves Gerey665174f2018-06-19 15:03:05 +02001494template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495void ChannelTest<VoiceTraits>::CreateContent(
1496 int flags,
1497 const cricket::AudioCodec& audio_codec,
1498 const cricket::VideoCodec& video_codec,
1499 cricket::AudioContentDescription* audio) {
1500 audio->AddCodec(audio_codec);
1501 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502}
1503
Yves Gerey665174f2018-06-19 15:03:05 +02001504template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505void ChannelTest<VoiceTraits>::CopyContent(
1506 const cricket::AudioContentDescription& source,
1507 cricket::AudioContentDescription* audio) {
1508 *audio = source;
1509}
1510
Yves Gerey665174f2018-06-19 15:03:05 +02001511template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1513 const cricket::AudioCodec& c2) {
1514 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001515 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516}
1517
Peter Boström0c4e06b2015-10-07 12:23:21 +02001518template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001520 uint32_t ssrc,
1521 int flags,
1522 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 audio->AddLegacyStream(ssrc);
1524}
1525
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001526class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527 public:
solenberg1dd98f32015-09-10 01:57:14 -07001528 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001529 VoiceChannelSingleThreadTest()
1530 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1531};
1532
1533class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1534 public:
1535 typedef ChannelTest<VoiceTraits> Base;
1536 VoiceChannelDoubleThreadTest()
1537 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538};
1539
jbauch5869f502017-06-29 12:31:36 -07001540class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001541 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001542 public:
1543 typedef ChannelTest<VoiceTraits> Base;
1544 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001545 : Base(true,
1546 kPcmuFrameWithExtensions,
1547 kRtcpReport,
1548 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001549};
1550
1551class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001552 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001553 public:
1554 typedef ChannelTest<VoiceTraits> Base;
1555 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001556 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1557 }
jbauch5869f502017-06-29 12:31:36 -07001558};
1559
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001561template <>
Steve Anton8699a322017-11-06 15:53:33 -08001562std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001563 rtc::Thread* worker_thread,
1564 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001565 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001566 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001567 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001568 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001569 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001570 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001571 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001572 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001573 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001574 return channel;
1575}
1576
Yves Gerey665174f2018-06-19 15:03:05 +02001577template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578void ChannelTest<VideoTraits>::CreateContent(
1579 int flags,
1580 const cricket::AudioCodec& audio_codec,
1581 const cricket::VideoCodec& video_codec,
1582 cricket::VideoContentDescription* video) {
1583 video->AddCodec(video_codec);
1584 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585}
1586
Yves Gerey665174f2018-06-19 15:03:05 +02001587template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588void ChannelTest<VideoTraits>::CopyContent(
1589 const cricket::VideoContentDescription& source,
1590 cricket::VideoContentDescription* video) {
1591 *video = source;
1592}
1593
Yves Gerey665174f2018-06-19 15:03:05 +02001594template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001595bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1596 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001597 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598}
1599
Peter Boström0c4e06b2015-10-07 12:23:21 +02001600template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001602 uint32_t ssrc,
1603 int flags,
1604 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 video->AddLegacyStream(ssrc);
1606}
1607
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001608class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 public:
solenberg1dd98f32015-09-10 01:57:14 -07001610 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611 VideoChannelSingleThreadTest()
1612 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613};
1614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001615class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1616 public:
1617 typedef ChannelTest<VideoTraits> Base;
1618 VideoChannelDoubleThreadTest()
1619 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1620};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001622TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 Base::TestInit();
1624 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1625 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1626}
1627
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001628TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1629 Base::TestDeinit();
1630}
1631
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001632TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 Base::TestSetContents();
1634}
1635
Johannes Kron9190b822018-10-29 11:22:05 +01001636TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1637 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1638}
1639
1640TEST_F(VoiceChannelSingleThreadTest,
1641 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1642 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1643}
1644
1645TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1646 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1647}
1648
1649TEST_F(VoiceChannelSingleThreadTest,
1650 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1651 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::TestSetContentsNullOffer();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::TestSetContentsRtcpMux();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::TestSetContentsRtcpMux();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::TestChangeStreamParamsInContent();
1668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 Base::TestPlayoutAndSendingStates();
1672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::TestMediaContentDirection();
1676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001679 Base::TestNetworkRouteChanges();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::TestCallSetup();
1684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 Base::TestCallTeardownRtcpMux();
1688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::SendRtpToRtp();
1692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 Base::SendRtcpToRtcp();
1696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001699 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700}
1701
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001703 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001704}
1705
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001706TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1708}
1709
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 Base::SendRtpToRtpOnThread();
1712}
1713
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 Base::SendWithWritabilityLoss();
1716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 Base::TestSetContentFailure();
1720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 Base::TestSendTwoOffers();
1724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::TestReceiveTwoOffers();
1728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 Base::TestSendPrAnswer();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 Base::TestReceivePrAnswer();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestFlushRtcp();
1740}
1741
zstein56162b92017-04-24 16:54:35 -07001742TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1743 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001747 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748}
1749
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001750TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001751 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001755 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001759 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001763 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001764}
1765
Steve Anton8a63f782017-10-23 13:08:53 -07001766TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1767 Base::SocketOptionsMergedOnSetTransport();
1768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770// VoiceChannelDoubleThreadTest
1771TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1774 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775}
1776
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001777TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1778 Base::TestDeinit();
1779}
1780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001782 Base::TestSetContents();
1783}
1784
Johannes Kron9190b822018-10-29 11:22:05 +01001785TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1786 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1787}
1788
1789TEST_F(VoiceChannelDoubleThreadTest,
1790 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1791 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1792}
1793
1794TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1795 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest,
1799 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1800 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1801}
1802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001803TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 Base::TestSetContentsNullOffer();
1805}
1806
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001807TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 Base::TestSetContentsRtcpMux();
1809}
1810
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001811TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 Base::TestSetContentsRtcpMux();
1813}
1814
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001815TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 Base::TestChangeStreamParamsInContent();
1817}
1818
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001819TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 Base::TestPlayoutAndSendingStates();
1821}
1822
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1824 Base::TestMediaContentDirection();
1825}
1826
1827TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1828 Base::TestNetworkRouteChanges();
1829}
1830
1831TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1832 Base::TestCallSetup();
1833}
1834
1835TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1836 Base::TestCallTeardownRtcpMux();
1837}
1838
1839TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1840 Base::SendRtpToRtp();
1841}
1842
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001843TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1844 Base::SendRtcpToRtcp();
1845}
1846
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001847TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001848 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849}
1850
1851TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001852 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001853}
1854
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001855TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1856 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1857}
1858
1859TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1860 Base::SendRtpToRtpOnThread();
1861}
1862
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001863TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1864 Base::SendWithWritabilityLoss();
1865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1868 Base::TestSetContentFailure();
1869}
1870
1871TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1872 Base::TestSendTwoOffers();
1873}
1874
1875TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1876 Base::TestReceiveTwoOffers();
1877}
1878
1879TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1880 Base::TestSendPrAnswer();
1881}
1882
1883TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1884 Base::TestReceivePrAnswer();
1885}
1886
1887TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1888 Base::TestFlushRtcp();
1889}
1890
zstein56162b92017-04-24 16:54:35 -07001891TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1892 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001893}
1894
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001895TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1896 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1897}
1898
1899TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1900 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1901}
1902
1903TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1904 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1905}
1906
1907TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1908 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1909}
1910
1911TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1912 Base::DefaultMaxBitrateIsUnlimited();
1913}
1914
Steve Anton8a63f782017-10-23 13:08:53 -07001915TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1916 Base::SocketOptionsMergedOnSetTransport();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919// VideoChannelSingleThreadTest
1920TEST_F(VideoChannelSingleThreadTest, TestInit) {
1921 Base::TestInit();
1922}
1923
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001924TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1925 Base::TestDeinit();
1926}
1927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001928TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1929 Base::TestSetContents();
1930}
1931
Johannes Kron9190b822018-10-29 11:22:05 +01001932TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1933 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1934}
1935
1936TEST_F(VideoChannelSingleThreadTest,
1937 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1938 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1939}
1940
1941TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1942 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1943}
1944
1945TEST_F(VideoChannelSingleThreadTest,
1946 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1947 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1951 Base::TestSetContentsNullOffer();
1952}
1953
1954TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1955 Base::TestSetContentsRtcpMux();
1956}
1957
1958TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1959 Base::TestSetContentsRtcpMux();
1960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1963 Base::TestChangeStreamParamsInContent();
1964}
1965
1966TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1967 Base::TestPlayoutAndSendingStates();
1968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 Base::TestMediaContentDirection();
1972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001975 Base::TestNetworkRouteChanges();
1976}
1977
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001978TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979 Base::TestCallSetup();
1980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001983 Base::TestCallTeardownRtcpMux();
1984}
1985
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001986TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001987 Base::SendRtpToRtp();
1988}
1989
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001990TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991 Base::SendRtcpToRtcp();
1992}
1993
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001994TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001995 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996}
1997
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001998TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001999 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002000}
2001
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002002TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2004}
2005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002006TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 Base::SendRtpToRtpOnThread();
2008}
2009
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002010TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 Base::SendWithWritabilityLoss();
2012}
2013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002014TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 Base::TestSetContentFailure();
2016}
2017
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002018TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019 Base::TestSendTwoOffers();
2020}
2021
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002022TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 Base::TestReceiveTwoOffers();
2024}
2025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002026TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002027 Base::TestSendPrAnswer();
2028}
2029
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002030TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002031 Base::TestReceivePrAnswer();
2032}
2033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002034TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 Base::TestFlushRtcp();
2036}
2037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002038TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002039 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002040}
2041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002042TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002043 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002044}
2045
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002046TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002047 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002048}
2049
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002050TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002051 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002052}
2053
zstein56162b92017-04-24 16:54:35 -07002054TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2055 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056}
2057
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002058TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002059 Base::DefaultMaxBitrateIsUnlimited();
2060}
2061
Steve Anton8a63f782017-10-23 13:08:53 -07002062TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2063 Base::SocketOptionsMergedOnSetTransport();
2064}
2065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002066// VideoChannelDoubleThreadTest
2067TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2068 Base::TestInit();
2069}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002071TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2072 Base::TestDeinit();
2073}
2074
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002075TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2076 Base::TestSetContents();
2077}
2078
Johannes Kron9190b822018-10-29 11:22:05 +01002079TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2080 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2081}
2082
2083TEST_F(VideoChannelDoubleThreadTest,
2084 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2085 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2086}
2087
2088TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2089 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2090}
2091
2092TEST_F(VideoChannelDoubleThreadTest,
2093 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2094 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2095}
2096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002097TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2098 Base::TestSetContentsNullOffer();
2099}
2100
2101TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2102 Base::TestSetContentsRtcpMux();
2103}
2104
2105TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2106 Base::TestSetContentsRtcpMux();
2107}
2108
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002109TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2110 Base::TestChangeStreamParamsInContent();
2111}
2112
2113TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2114 Base::TestPlayoutAndSendingStates();
2115}
2116
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002117TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2118 Base::TestMediaContentDirection();
2119}
2120
2121TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2122 Base::TestNetworkRouteChanges();
2123}
2124
2125TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2126 Base::TestCallSetup();
2127}
2128
2129TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2130 Base::TestCallTeardownRtcpMux();
2131}
2132
2133TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2134 Base::SendRtpToRtp();
2135}
2136
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002137TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2138 Base::SendRtcpToRtcp();
2139}
2140
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002141TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002142 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002143}
2144
2145TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002146 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147}
2148
2149TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2150 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2151}
2152
2153TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2154 Base::SendRtpToRtpOnThread();
2155}
2156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002157TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2158 Base::SendWithWritabilityLoss();
2159}
2160
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002161TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2162 Base::TestSetContentFailure();
2163}
2164
2165TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2166 Base::TestSendTwoOffers();
2167}
2168
2169TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2170 Base::TestReceiveTwoOffers();
2171}
2172
2173TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2174 Base::TestSendPrAnswer();
2175}
2176
2177TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2178 Base::TestReceivePrAnswer();
2179}
2180
2181TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2182 Base::TestFlushRtcp();
2183}
2184
2185TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2186 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2187}
2188
2189TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2190 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2194 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2198 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2199}
2200
zstein56162b92017-04-24 16:54:35 -07002201TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2202 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203}
2204
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002205TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2206 Base::DefaultMaxBitrateIsUnlimited();
2207}
2208
Steve Anton8a63f782017-10-23 13:08:53 -07002209TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2210 Base::SocketOptionsMergedOnSetTransport();
2211}
2212
deadbeef953c2ce2017-01-09 14:53:41 -08002213// RtpDataChannelSingleThreadTest
2214class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002215 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002216 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002217 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002218 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2219};
2220
deadbeef953c2ce2017-01-09 14:53:41 -08002221// RtpDataChannelDoubleThreadTest
2222class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002223 public:
2224 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002225 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002226 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227};
2228
2229// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002230template <>
Steve Anton8699a322017-11-06 15:53:33 -08002231std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002232 rtc::Thread* worker_thread,
2233 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002234 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002235 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002236 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002237 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002238 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002239 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002240 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07002241 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002242 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 return channel;
2244}
2245
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002246template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247void ChannelTest<DataTraits>::CreateContent(
2248 int flags,
2249 const cricket::AudioCodec& audio_codec,
2250 const cricket::VideoCodec& video_codec,
2251 cricket::DataContentDescription* data) {
2252 data->AddCodec(kGoogleDataCodec);
2253 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254}
2255
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002256template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257void ChannelTest<DataTraits>::CopyContent(
2258 const cricket::DataContentDescription& source,
2259 cricket::DataContentDescription* data) {
2260 *data = source;
2261}
2262
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2265 const cricket::DataCodec& c2) {
2266 return c1.name == c2.name;
2267}
2268
Peter Boström0c4e06b2015-10-07 12:23:21 +02002269template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002271 uint32_t ssrc,
2272 int flags,
2273 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002274 data->AddLegacyStream(ssrc);
2275}
2276
deadbeef953c2ce2017-01-09 14:53:41 -08002277TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278 Base::TestInit();
2279 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2280}
2281
deadbeef953c2ce2017-01-09 14:53:41 -08002282TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002283 Base::TestDeinit();
2284}
2285
deadbeef953c2ce2017-01-09 14:53:41 -08002286TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287 Base::TestSetContents();
2288}
2289
deadbeef953c2ce2017-01-09 14:53:41 -08002290TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291 Base::TestSetContentsNullOffer();
2292}
2293
deadbeef953c2ce2017-01-09 14:53:41 -08002294TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 Base::TestSetContentsRtcpMux();
2296}
2297
deadbeef953c2ce2017-01-09 14:53:41 -08002298TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299 Base::TestChangeStreamParamsInContent();
2300}
2301
deadbeef953c2ce2017-01-09 14:53:41 -08002302TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303 Base::TestPlayoutAndSendingStates();
2304}
2305
deadbeef953c2ce2017-01-09 14:53:41 -08002306TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307 Base::TestMediaContentDirection();
2308}
2309
deadbeef953c2ce2017-01-09 14:53:41 -08002310TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311 Base::TestCallSetup();
2312}
2313
deadbeef953c2ce2017-01-09 14:53:41 -08002314TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315 Base::TestCallTeardownRtcpMux();
2316}
2317
zstein56162b92017-04-24 16:54:35 -07002318TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2319 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320}
2321
deadbeef953c2ce2017-01-09 14:53:41 -08002322TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 Base::SendRtpToRtp();
2324}
2325
deadbeef953c2ce2017-01-09 14:53:41 -08002326TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 Base::SendRtcpToRtcp();
2328}
2329
deadbeef953c2ce2017-01-09 14:53:41 -08002330TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 Base::SendRtpToRtpOnThread();
2332}
2333
deadbeef953c2ce2017-01-09 14:53:41 -08002334TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 Base::SendWithWritabilityLoss();
2336}
2337
Steve Anton8a63f782017-10-23 13:08:53 -07002338TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2339 Base::SocketOptionsMergedOnSetTransport();
2340}
2341
deadbeef953c2ce2017-01-09 14:53:41 -08002342TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002343 CreateChannels(0, 0);
2344 EXPECT_TRUE(SendInitiate());
2345 EXPECT_TRUE(SendAccept());
2346
2347 cricket::SendDataParams params;
2348 params.ssrc = 42;
2349 unsigned char data[] = {'f', 'o', 'o'};
2350 rtc::CopyOnWriteBuffer payload(data, 3);
2351 cricket::SendDataResult result;
2352 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2353 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2354 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2355}
2356
deadbeef953c2ce2017-01-09 14:53:41 -08002357TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002358 Base::TestInit();
2359 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2360}
2361
deadbeef953c2ce2017-01-09 14:53:41 -08002362TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002363 Base::TestDeinit();
2364}
2365
deadbeef953c2ce2017-01-09 14:53:41 -08002366TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002367 Base::TestSetContents();
2368}
2369
deadbeef953c2ce2017-01-09 14:53:41 -08002370TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002371 Base::TestSetContentsNullOffer();
2372}
2373
deadbeef953c2ce2017-01-09 14:53:41 -08002374TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002375 Base::TestSetContentsRtcpMux();
2376}
2377
deadbeef953c2ce2017-01-09 14:53:41 -08002378TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002379 Base::TestChangeStreamParamsInContent();
2380}
2381
deadbeef953c2ce2017-01-09 14:53:41 -08002382TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002383 Base::TestPlayoutAndSendingStates();
2384}
2385
deadbeef953c2ce2017-01-09 14:53:41 -08002386TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002387 Base::TestMediaContentDirection();
2388}
2389
deadbeef953c2ce2017-01-09 14:53:41 -08002390TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002391 Base::TestCallSetup();
2392}
2393
deadbeef953c2ce2017-01-09 14:53:41 -08002394TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002395 Base::TestCallTeardownRtcpMux();
2396}
2397
zstein56162b92017-04-24 16:54:35 -07002398TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2399 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002400}
2401
deadbeef953c2ce2017-01-09 14:53:41 -08002402TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403 Base::SendRtpToRtp();
2404}
2405
deadbeef953c2ce2017-01-09 14:53:41 -08002406TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002407 Base::SendRtcpToRtcp();
2408}
2409
deadbeef953c2ce2017-01-09 14:53:41 -08002410TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002411 Base::SendRtpToRtpOnThread();
2412}
2413
deadbeef953c2ce2017-01-09 14:53:41 -08002414TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002415 Base::SendWithWritabilityLoss();
2416}
2417
Steve Anton8a63f782017-10-23 13:08:53 -07002418TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2419 Base::SocketOptionsMergedOnSetTransport();
2420}
2421
deadbeef953c2ce2017-01-09 14:53:41 -08002422TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 CreateChannels(0, 0);
2424 EXPECT_TRUE(SendInitiate());
2425 EXPECT_TRUE(SendAccept());
2426
2427 cricket::SendDataParams params;
2428 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002429 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002430 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 cricket::SendDataResult result;
2432 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002433 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2435}
2436
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437// TODO(pthatcher): TestSetReceiver?