blob: edcea883bf0311e1ff6b0bc0d9b782f8be7dd3c8 [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;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080042using cricket::RidDescription;
43using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080045using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080046using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
Danil Chapovalov33b01f22016-05-11 19:55:27 +020048namespace {
49const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
50const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
51const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070052const cricket::VideoCodec kH264Codec(97, "H264");
53const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020054const cricket::DataCodec kGoogleDataCodec(101, "google-data");
55const uint32_t kSsrc1 = 0x1111;
56const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070057const uint32_t kSsrc3 = 0x3333;
58const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020059const int kAudioPts[] = {0, 8};
60const int kVideoPts[] = {97, 99};
61enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010062
Danil Chapovalov33b01f22016-05-11 19:55:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
deadbeefcbecd352015-09-23 11:50:27 -070065template <class ChannelT,
66 class MediaChannelT,
67 class ContentT,
68 class CodecT,
69 class MediaInfoT,
70 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071class Traits {
72 public:
73 typedef ChannelT Channel;
74 typedef MediaChannelT MediaChannel;
75 typedef ContentT Content;
76 typedef CodecT Codec;
77 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020078 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079};
80
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081class VoiceTraits : public Traits<cricket::VoiceChannel,
82 cricket::FakeVoiceMediaChannel,
83 cricket::AudioContentDescription,
84 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020085 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070086 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087
88class VideoTraits : public Traits<cricket::VideoChannel,
89 cricket::FakeVideoMediaChannel,
90 cricket::VideoContentDescription,
91 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020092 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070093 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094
deadbeef953c2ce2017-01-09 14:53:41 -080095class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096 cricket::FakeDataMediaChannel,
97 cricket::DataContentDescription,
98 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020099 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700100 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101
deadbeef953c2ce2017-01-09 14:53:41 -0800102// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200103template <class T>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104class ChannelTest : public testing::Test, public sigslot::has_slots<> {
105 public:
deadbeefac22f702017-01-12 21:59:29 -0800106 enum Flags {
107 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800108 SSRC_MUX = 0x8,
109 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800110 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800111 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700112 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800113 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114
Peter Boström34fbfff2015-09-24 19:20:30 +0200115 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200116 rtc::ArrayView<const uint8_t> rtp_data,
117 rtc::ArrayView<const uint8_t> rtcp_data,
118 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200119 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200120 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800121 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 if (network_is_worker == NetworkIsWorker::Yes) {
123 network_thread_ = rtc::Thread::Current();
124 } else {
125 network_thread_keeper_ = rtc::Thread::Create();
126 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 network_thread_ = network_thread_keeper_.get();
128 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200132 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800133 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200134 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800135 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200136 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 }
Steve Anton8699a322017-11-06 15:53:33 -0800138 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
139 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200140 int flags1,
141 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800142 // Network thread is started in CreateChannels, to allow the test to
143 // configure a fake clock before any threads are spawned and attempt to
144 // access the time.
145 if (network_thread_keeper_) {
146 network_thread_keeper_->Start();
147 }
Zhi Huange830e682018-03-30 10:48:35 -0700148
deadbeeff5346592017-01-24 21:51:21 -0800149 // Make sure if using raw packet transports, they're used for both
150 // channels.
151 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200152 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800153 media_channel1_ = ch1.get();
154 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800155 rtc::PacketTransportInternal* rtp1 = nullptr;
156 rtc::PacketTransportInternal* rtcp1 = nullptr;
157 rtc::PacketTransportInternal* rtp2 = nullptr;
158 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800159 // Based on flags, create fake DTLS or raw packet transports.
160 if (flags1 & RAW_PACKET_TRANSPORT) {
161 fake_rtp_packet_transport1_.reset(
162 new rtc::FakePacketTransport("channel1_rtp"));
163 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700164 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800165 fake_rtcp_packet_transport1_.reset(
166 new rtc::FakePacketTransport("channel1_rtcp"));
167 rtcp1 = fake_rtcp_packet_transport1_.get();
168 }
169 } else {
170 // Confirmed to work with KT_RSA and KT_ECDSA.
171 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
172 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
173 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700174 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800175 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
176 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
177 rtcp1 = fake_rtcp_dtls_transport1_.get();
178 }
179 if (flags1 & DTLS) {
180 auto cert1 =
181 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
182 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
183 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
186 }
187 }
188 }
189 // Based on flags, create fake DTLS or raw packet transports.
190 if (flags2 & RAW_PACKET_TRANSPORT) {
191 fake_rtp_packet_transport2_.reset(
192 new rtc::FakePacketTransport("channel2_rtp"));
193 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700194 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800195 fake_rtcp_packet_transport2_.reset(
196 new rtc::FakePacketTransport("channel2_rtcp"));
197 rtcp2 = fake_rtcp_packet_transport2_.get();
198 }
199 } else {
200 // Confirmed to work with KT_RSA and KT_ECDSA.
201 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
202 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
203 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700204 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800205 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
206 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
207 rtcp2 = fake_rtcp_dtls_transport2_.get();
208 }
209 if (flags2 & DTLS) {
210 auto cert2 =
211 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
212 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
213 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
214 if (fake_rtcp_dtls_transport2_) {
215 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
216 }
217 }
218 }
Zhi Huange830e682018-03-30 10:48:35 -0700219 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
220 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
221 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
222 flags1);
223 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
224 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
225 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
226 flags2);
227
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800228 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
229 rtp_transport1_.get(), flags1);
230 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
231 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800232 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800233 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800234 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800235 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200236 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
237 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 CopyContent(local_media_content1_, &remote_media_content1_);
239 CopyContent(local_media_content2_, &remote_media_content2_);
240
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 // Add stream information (SSRC) to the local content but not to the remote
242 // content. This means that we per default know the SSRC of what we send but
243 // not what we receive.
244 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
245 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
246
247 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
248 if (flags1 & SSRC_MUX) {
249 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
250 }
251 if (flags2 & SSRC_MUX) {
252 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
253 }
254 }
Steve Anton8699a322017-11-06 15:53:33 -0800255 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200256 rtc::Thread* worker_thread,
257 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800258 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700259 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700260 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800261 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200262 auto channel = absl::make_unique<typename T::Channel>(
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800263 worker_thread, network_thread, signaling_thread, std::move(ch),
264 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
265 &ssrc_generator_);
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700266 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000267 return channel;
268 }
269
Zhi Huange830e682018-03-30 10:48:35 -0700270 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
271 rtc::PacketTransportInternal* rtp_packet_transport,
272 rtc::PacketTransportInternal* rtcp_packet_transport,
273 DtlsTransportInternal* rtp_dtls_transport,
274 DtlsTransportInternal* rtcp_dtls_transport,
275 int flags) {
276 if (flags & RTCP_MUX) {
277 rtcp_packet_transport = nullptr;
278 rtcp_dtls_transport = nullptr;
279 }
280
281 if (flags & DTLS) {
282 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
283 } else {
284 if (flags & RAW_PACKET_TRANSPORT) {
285 return CreateUnencryptedTransport(rtp_packet_transport,
286 rtcp_packet_transport);
287 } else {
288 return CreateUnencryptedTransport(rtp_dtls_transport,
289 rtcp_dtls_transport);
290 }
291 }
292 }
293
294 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
295 rtc::PacketTransportInternal* rtp_packet_transport,
296 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200297 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
298 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700299
300 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
301 if (rtcp_packet_transport) {
302 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
303 }
304 return rtp_transport;
305 }
306
307 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
308 cricket::DtlsTransportInternal* rtp_dtls_transport,
309 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200310 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700311 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700312
313 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
314 rtcp_dtls_transport);
315 return dtls_srtp_transport;
316 }
317
deadbeeff5346592017-01-24 21:51:21 -0800318 void ConnectFakeTransports() {
319 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
320 bool asymmetric = false;
321 // Depending on test flags, could be using DTLS or raw packet transport.
322 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
323 fake_rtp_dtls_transport1_->SetDestination(
324 fake_rtp_dtls_transport2_.get(), asymmetric);
325 }
326 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
327 fake_rtcp_dtls_transport1_->SetDestination(
328 fake_rtcp_dtls_transport2_.get(), asymmetric);
329 }
330 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
331 fake_rtp_packet_transport1_->SetDestination(
332 fake_rtp_packet_transport2_.get(), asymmetric);
333 }
334 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
335 fake_rtcp_packet_transport1_->SetDestination(
336 fake_rtcp_packet_transport2_.get(), asymmetric);
337 }
338 });
339 }
340
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000342 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800343 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000344 if (result) {
345 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000346 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800347 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800349 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000350 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800351 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352 }
353 }
354 return result;
355 }
356
357 bool SendAccept() {
358 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800360 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 }
362
363 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000364 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800365 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 if (result) {
367 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000368 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800369 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 }
371 return result;
372 }
373
374 bool SendProvisionalAnswer() {
375 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800376 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377 if (result) {
378 channel2_->Enable(true);
379 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800380 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800381 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000382 }
383 return result;
384 }
385
386 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000387 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800388 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000390 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800391 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000392 return result;
393 }
394
deadbeeff5346592017-01-24 21:51:21 -0800395 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 channel1_.reset();
397 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800398 fake_rtp_dtls_transport1_.reset();
399 fake_rtcp_dtls_transport1_.reset();
400 fake_rtp_dtls_transport2_.reset();
401 fake_rtcp_dtls_transport2_.reset();
402 fake_rtp_packet_transport1_.reset();
403 fake_rtcp_packet_transport1_.reset();
404 fake_rtp_packet_transport2_.reset();
405 fake_rtcp_packet_transport2_.reset();
406 if (network_thread_keeper_) {
407 network_thread_keeper_.reset();
408 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 return true;
410 }
411
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtp1() {
413 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
414 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendRtp2() {
417 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
418 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420 void SendRtcp1() {
421 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendRtcp2() {
424 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
426 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
428 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
429 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
432 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
433 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 void SendCustomRtcp1(uint32_t ssrc) {
436 rtc::Buffer data = CreateRtcpData(ssrc);
437 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 void SendCustomRtcp2(uint32_t ssrc) {
440 rtc::Buffer data = CreateRtcpData(ssrc);
441 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 }
447 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
459 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
463 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200465 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200466 rtc::Buffer data = CreateRtcpData(ssrc);
467 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200469 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200470 rtc::Buffer data = CreateRtcpData(ssrc);
471 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
474 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::SetBE32(data.data() + 8, ssrc);
477 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000478 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000480 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 return data;
482 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
484 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 return data;
488 }
489
Yves Gerey665174f2018-06-19 15:03:05 +0200490 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
491 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
492 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
493 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494
495 void CreateContent(int flags,
496 const cricket::AudioCodec& audio_codec,
497 const cricket::VideoCodec& video_codec,
498 typename T::Content* content) {
499 // overridden in specialized classes
500 }
501 void CopyContent(const typename T::Content& source,
502 typename T::Content* content) {
503 // overridden in specialized classes
504 }
505
Steve Anton18ee1d52017-09-11 11:32:35 -0700506 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700508 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
509 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700510 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700511 AddLegacyStreamInContent(ssrc, 0, content);
512 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 }
514
ossu292d6582016-03-17 02:31:13 -0700515 // Will manage the lifetime of a CallThread, making sure it's
516 // destroyed before this object goes out of scope.
517 class ScopedCallThread {
518 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200519 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100520 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200521 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100522 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
523 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700524 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700525 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700526 }
527
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200528 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700529
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200530 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700531
532 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 std::unique_ptr<rtc::Thread> thread_;
534 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700535 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
538 return false; // overridden in specialized classes
539 }
540
deadbeeff5346592017-01-24 21:51:21 -0800541 void OnRtcpMuxFullyActive1(const std::string&) {
542 rtcp_mux_activated_callbacks1_++;
543 }
544 void OnRtcpMuxFullyActive2(const std::string&) {
545 rtcp_mux_activated_callbacks2_++;
546 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547
Honghai Zhangcc411c02016-03-29 17:27:21 -0700548 cricket::CandidatePairInterface* last_selected_candidate_pair() {
549 return last_selected_candidate_pair_;
550 }
551
Peter Boström0c4e06b2015-10-07 12:23:21 +0200552 void AddLegacyStreamInContent(uint32_t ssrc,
553 int flags,
554 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 // Base implementation.
556 }
557
558 // Tests that can be used by derived classes.
559
560 // Basic sanity check.
561 void TestInit() {
562 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700563 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000564 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200565 if (verify_playout_) {
566 EXPECT_FALSE(media_channel1_->playout());
567 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_TRUE(media_channel1_->codecs().empty());
569 EXPECT_TRUE(media_channel1_->recv_streams().empty());
570 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
571 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
572 }
573
574 // Test that SetLocalContent and SetRemoteContent properly configure
575 // the codecs.
576 void TestSetContents() {
577 CreateChannels(0, 0);
578 typename T::Content content;
579 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800580 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800582 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200584 EXPECT_TRUE(
585 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 }
587
Johannes Kron9190b822018-10-29 11:22:05 +0100588 // Test that SetLocalContent and SetRemoteContent properly configure
589 // extmap-allow-mixed.
590 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
591 // For a caller, SetLocalContent() is called first with an offer and next
592 // SetRemoteContent() is called with the answer.
593 CreateChannels(0, 0);
594 typename T::Content content;
595 CreateContent(0, kPcmuCodec, kH264Codec, &content);
596 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
597 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
598 content.set_extmap_allow_mixed_enum(offer_enum);
599 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
600 content.set_extmap_allow_mixed_enum(answer_enum);
601 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
602 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
603 }
604 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
605 // For a callee, SetRemoteContent() is called first with an offer and next
606 // SetLocalContent() is called with the answer.
607 CreateChannels(0, 0);
608 typename T::Content content;
609 CreateContent(0, kPcmuCodec, kH264Codec, &content);
610 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
611 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
612 content.set_extmap_allow_mixed_enum(offer_enum);
613 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
614 content.set_extmap_allow_mixed_enum(answer_enum);
615 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
616 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
617 }
618
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 // Test that SetLocalContent and SetRemoteContent properly deals
620 // with an empty offer.
621 void TestSetContentsNullOffer() {
622 CreateChannels(0, 0);
623 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800624 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 CreateContent(0, kPcmuCodec, kH264Codec, &content);
626 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800627 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200629 EXPECT_TRUE(
630 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 }
632
633 // Test that SetLocalContent and SetRemoteContent properly set RTCP
634 // mux.
635 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800636 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 typename T::Content content;
638 CreateContent(0, kPcmuCodec, kH264Codec, &content);
639 // Both sides agree on mux. Should no longer be a separate RTCP channel.
640 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800641 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
642 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800644 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 }
648
649 // Test that SetLocalContent and SetRemoteContent properly set RTCP
650 // mux when a provisional answer is received.
651 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800652 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 typename T::Content content;
654 CreateContent(0, kPcmuCodec, kH264Codec, &content);
655 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800656 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
657 EXPECT_TRUE(
658 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800659 // Both sides agree on mux. Should signal RTCP mux as fully activated.
660 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800661 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800662 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800666 EXPECT_TRUE(
667 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
668 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800669 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 }
671
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 // Test that SetLocalContent and SetRemoteContent properly
673 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800674 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 void TestChangeStreamParamsInContent() {
676 cricket::StreamParams stream1;
677 stream1.groupid = "group1";
678 stream1.id = "stream1";
679 stream1.ssrcs.push_back(kSsrc1);
680 stream1.cname = "stream1_cname";
681
682 cricket::StreamParams stream2;
683 stream2.groupid = "group1";
684 stream2.id = "stream2";
685 stream2.ssrcs.push_back(kSsrc2);
686 stream2.cname = "stream2_cname";
687
688 // Setup a call where channel 1 send |stream1| to channel 2.
689 CreateChannels(0, 0);
690 typename T::Content content1;
691 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
692 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800693 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 EXPECT_TRUE(channel1_->Enable(true));
695 EXPECT_EQ(1u, media_channel1_->send_streams().size());
696
Steve Anton3828c062017-12-06 10:34:51 -0800697 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800699 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700
701 // Channel 2 do not send anything.
702 typename T::Content content2;
703 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800704 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800706 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_TRUE(channel2_->Enable(true));
708 EXPECT_EQ(0u, media_channel2_->send_streams().size());
709
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200710 SendCustomRtp1(kSsrc1, 0);
711 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
713
714 // Let channel 2 update the content by sending |stream2| and enable SRTP.
715 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700716 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800718 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 ASSERT_EQ(1u, media_channel2_->send_streams().size());
720 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
721
Steve Anton3828c062017-12-06 10:34:51 -0800722 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
724 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
725
726 // Channel 1 replies but stop sending stream1.
727 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700728 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800729 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_EQ(0u, media_channel1_->send_streams().size());
731
Steve Anton3828c062017-12-06 10:34:51 -0800732 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
734
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200735 SendCustomRtp2(kSsrc2, 0);
736 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
738 }
739
740 // Test that we only start playout and sending at the right times.
741 void TestPlayoutAndSendingStates() {
742 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200743 if (verify_playout_) {
744 EXPECT_FALSE(media_channel1_->playout());
745 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 if (verify_playout_) {
748 EXPECT_FALSE(media_channel2_->playout());
749 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_FALSE(media_channel2_->sending());
751 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 if (verify_playout_) {
753 EXPECT_FALSE(media_channel1_->playout());
754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000756 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800757 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200758 if (verify_playout_) {
759 EXPECT_TRUE(media_channel1_->playout());
760 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800763 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200764 if (verify_playout_) {
765 EXPECT_FALSE(media_channel2_->playout());
766 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800769 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200770 if (verify_playout_) {
771 EXPECT_FALSE(media_channel2_->playout());
772 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800774 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200775 if (verify_playout_) {
776 EXPECT_TRUE(media_channel1_->playout());
777 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200779 if (verify_playout_) {
780 EXPECT_FALSE(media_channel2_->playout());
781 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782 EXPECT_FALSE(media_channel2_->sending());
783 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_TRUE(media_channel2_->playout());
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000788 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800789 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200790 if (verify_playout_) {
791 EXPECT_TRUE(media_channel1_->playout());
792 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793 EXPECT_TRUE(media_channel1_->sending());
794 }
795
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 // Test that changing the MediaContentDirection in the local and remote
797 // session description start playout and sending at the right time.
798 void TestMediaContentDirection() {
799 CreateChannels(0, 0);
800 typename T::Content content1;
801 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
802 typename T::Content content2;
803 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
804 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800805 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
807 EXPECT_TRUE(channel1_->Enable(true));
808 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200809 if (verify_playout_) {
810 EXPECT_FALSE(media_channel1_->playout());
811 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200813 if (verify_playout_) {
814 EXPECT_FALSE(media_channel2_->playout());
815 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816 EXPECT_FALSE(media_channel2_->sending());
817
Steve Anton3828c062017-12-06 10:34:51 -0800818 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
819 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
820 EXPECT_TRUE(
821 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
822 EXPECT_TRUE(
823 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800824 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825
Peter Boström34fbfff2015-09-24 19:20:30 +0200826 if (verify_playout_) {
827 EXPECT_TRUE(media_channel1_->playout());
828 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200830 if (verify_playout_) {
831 EXPECT_FALSE(media_channel2_->playout()); // local InActive
832 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833 EXPECT_FALSE(media_channel2_->sending()); // local InActive
834
835 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800836 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800837 EXPECT_TRUE(
838 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
839 EXPECT_TRUE(
840 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841
Peter Boström34fbfff2015-09-24 19:20:30 +0200842 if (verify_playout_) {
843 EXPECT_TRUE(media_channel1_->playout());
844 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200846 if (verify_playout_) {
847 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
848 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
850
851 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800852 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800853 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
854 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855
Peter Boström34fbfff2015-09-24 19:20:30 +0200856 if (verify_playout_) {
857 EXPECT_TRUE(media_channel1_->playout());
858 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200860 if (verify_playout_) {
861 EXPECT_TRUE(media_channel2_->playout());
862 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_TRUE(media_channel2_->sending());
864 }
865
Honghai Zhangcc411c02016-03-29 17:27:21 -0700866 // Tests that when the transport channel signals a candidate pair change
867 // event, the media channel will receive a call on the network route change.
868 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700869 static constexpr uint16_t kLocalNetId = 1;
870 static constexpr uint16_t kRemoteNetId = 2;
871 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800872 // Ipv4(20) + UDP(8).
873 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800874 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200875
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800876 CreateChannels(DTLS, DTLS);
877 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700878
Honghai Zhangcc411c02016-03-29 17:27:21 -0700879 typename T::MediaChannel* media_channel1 =
880 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200881 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700882
Zhi Huang942bc2e2017-11-13 13:26:07 -0800883 // Need to wait for the threads before calling
884 // |set_num_network_route_changes| because the network route would be set
885 // when creating the channel.
886 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200887 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800888 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800889 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200890 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800891 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
892
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200893 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200894 });
895 WaitForThreads();
896 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700897 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200898 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700899
eladalon05b07bb2017-08-24 07:40:16 -0700900 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800901 rtc::NetworkRoute network_route;
902 network_route.connected = true;
903 network_route.local_network_id = kLocalNetId;
904 network_route.remote_network_id = kRemoteNetId;
905 network_route.last_sent_packet_id = kLastPacketId;
906 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200907 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800908 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
909
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200910 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200911 });
912 WaitForThreads();
913 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100914 EXPECT_TRUE(media_channel1->last_network_route().connected);
915 EXPECT_EQ(kLocalNetId,
916 media_channel1->last_network_route().local_network_id);
917 EXPECT_EQ(kRemoteNetId,
918 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200919 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700920 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800921 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800922 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700923 }
924
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925 // Test setting up a call.
926 void TestCallSetup() {
927 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700928 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200930 if (verify_playout_) {
931 EXPECT_TRUE(media_channel1_->playout());
932 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 EXPECT_FALSE(media_channel1_->sending());
934 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700935 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 EXPECT_TRUE(media_channel1_->sending());
937 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200938 if (verify_playout_) {
939 EXPECT_TRUE(media_channel2_->playout());
940 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000941 EXPECT_TRUE(media_channel2_->sending());
942 EXPECT_EQ(1U, media_channel2_->codecs().size());
943 }
944
945 // Test that we don't crash if packets are sent during call teardown
946 // when RTCP mux is enabled. This is a regression test against a specific
947 // race condition that would only occur when a RTCP packet was sent during
948 // teardown of a channel on which RTCP mux was enabled.
949 void TestCallTeardownRtcpMux() {
950 class LastWordMediaChannel : public T::MediaChannel {
951 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200952 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700954 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
955 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
957 }
958 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200959 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
960 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
961 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962 EXPECT_TRUE(SendInitiate());
963 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800964 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 }
966
967 // Send voice RTP data to the other side and ensure it gets there.
968 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700969 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970 EXPECT_TRUE(SendInitiate());
971 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700972 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
973 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200974 SendRtp1();
975 SendRtp2();
976 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977 EXPECT_TRUE(CheckRtp1());
978 EXPECT_TRUE(CheckRtp2());
979 EXPECT_TRUE(CheckNoRtp1());
980 EXPECT_TRUE(CheckNoRtp2());
981 }
982
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200983 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800984 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200985 EXPECT_TRUE(SendInitiate());
986 EXPECT_TRUE(SendAccept());
987 SendRtp1();
988 SendRtp2();
989 SendRtcp1();
990 SendRtcp2();
991 // Do not wait, destroy channels.
992 channel1_.reset(nullptr);
993 channel2_.reset(nullptr);
994 }
995
deadbeefac22f702017-01-12 21:59:29 -0800996 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800998 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 EXPECT_TRUE(SendInitiate());
1000 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001001 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1002 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001003 SendRtcp1();
1004 SendRtcp2();
1005 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006 EXPECT_TRUE(CheckRtcp1());
1007 EXPECT_TRUE(CheckRtcp2());
1008 EXPECT_TRUE(CheckNoRtcp1());
1009 EXPECT_TRUE(CheckNoRtcp2());
1010 }
1011
Zhi Huange830e682018-03-30 10:48:35 -07001012 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1013 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001014 EXPECT_FALSE(channel1_->srtp_active());
1015 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001017 WaitForThreads();
1018 EXPECT_TRUE(channel1_->writable());
1019 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001021 EXPECT_TRUE(channel1_->srtp_active());
1022 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 SendRtp1();
1024 SendRtp2();
1025 SendRtcp1();
1026 SendRtcp2();
1027 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028 EXPECT_TRUE(CheckRtp1());
1029 EXPECT_TRUE(CheckRtp2());
1030 EXPECT_TRUE(CheckNoRtp1());
1031 EXPECT_TRUE(CheckNoRtp2());
1032 EXPECT_TRUE(CheckRtcp1());
1033 EXPECT_TRUE(CheckRtcp2());
1034 EXPECT_TRUE(CheckNoRtcp1());
1035 EXPECT_TRUE(CheckNoRtcp2());
1036 }
1037
1038 // Test that we can send and receive early media when a provisional answer is
1039 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1040 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001041 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042
Yves Gerey665174f2018-06-19 15:03:05 +02001043 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1044 EXPECT_TRUE(SendOffer());
1045 EXPECT_TRUE(SendProvisionalAnswer());
1046 EXPECT_TRUE(channel1_->srtp_active());
1047 EXPECT_TRUE(channel2_->srtp_active());
1048 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1049 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1050 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1051 SendCustomRtcp1(kSsrc1);
1052 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1053 WaitForThreads();
1054 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1055 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056
Yves Gerey665174f2018-06-19 15:03:05 +02001057 // Send packets from callee and verify that it is received.
1058 SendCustomRtcp2(kSsrc2);
1059 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1060 WaitForThreads();
1061 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1062 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001063
Yves Gerey665174f2018-06-19 15:03:05 +02001064 // Complete call setup and ensure everything is still OK.
1065 EXPECT_TRUE(SendFinalAnswer());
1066 EXPECT_TRUE(channel1_->srtp_active());
1067 EXPECT_TRUE(channel2_->srtp_active());
1068 SendCustomRtcp1(kSsrc1);
1069 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1070 SendCustomRtcp2(kSsrc2);
1071 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1072 WaitForThreads();
1073 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1074 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1075 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1076 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077 }
1078
1079 // Test that we properly send RTP without SRTP from a thread.
1080 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001081 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 EXPECT_TRUE(SendInitiate());
1083 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001084 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1085 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1086 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1087 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1088 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1089 send_rtcp1.thread(),
1090 send_rtcp2.thread()};
1091 WaitForThreads(involved_threads);
1092 EXPECT_TRUE(CheckRtp1());
1093 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_TRUE(CheckNoRtp1());
1095 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001096 EXPECT_TRUE(CheckRtcp1());
1097 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(CheckNoRtcp1());
1099 EXPECT_TRUE(CheckNoRtcp2());
1100 }
1101
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 // Test that the mediachannel retains its sending state after the transport
1103 // becomes non-writable.
1104 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001105 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 EXPECT_TRUE(SendInitiate());
1107 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001108 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1109 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001110 SendRtp1();
1111 SendRtp2();
1112 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113 EXPECT_TRUE(CheckRtp1());
1114 EXPECT_TRUE(CheckRtp2());
1115 EXPECT_TRUE(CheckNoRtp1());
1116 EXPECT_TRUE(CheckNoRtp2());
1117
wu@webrtc.org97077a32013-10-25 21:18:33 +00001118 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001119 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1120 fake_rtp_dtls_transport1_->SetWritable(false);
1121 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001122 SendRtp1();
1123 SendRtp2();
1124 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_TRUE(CheckRtp1());
1126 EXPECT_TRUE(CheckNoRtp2());
1127
1128 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001129 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1130 fake_rtp_dtls_transport1_->SetWritable(true);
1131 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001133 SendRtp1();
1134 SendRtp2();
1135 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_TRUE(CheckRtp1());
1137 EXPECT_TRUE(CheckRtp2());
1138 EXPECT_TRUE(CheckNoRtp1());
1139 EXPECT_TRUE(CheckNoRtp2());
1140
1141 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001142 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1143 bool asymmetric = true;
1144 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1145 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_TRUE(media_channel1_->sending());
1147
wu@webrtc.org97077a32013-10-25 21:18:33 +00001148 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001149 SendRtp1();
1150 SendRtp2();
1151 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152 EXPECT_TRUE(CheckRtp1());
1153 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001154 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155
1156 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001157 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001158 bool asymmetric = true;
1159 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1160 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001161 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001163 SendRtp1();
1164 SendRtp2();
1165 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 EXPECT_TRUE(CheckRtp1());
1167 EXPECT_TRUE(CheckRtp2());
1168 EXPECT_TRUE(CheckNoRtp1());
1169 EXPECT_TRUE(CheckNoRtp2());
1170 }
1171
Yves Gerey665174f2018-06-19 15:03:05 +02001172 void SendBundleToBundle(const int* pl_types,
1173 int len,
1174 bool rtcp_mux,
1175 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001176 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001178 // Only pl_type1 was added to the bundle filter for both |channel1_|
1179 // and |channel2_|.
1180 int pl_type1 = pl_types[0];
1181 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001182 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001183 if (secure)
1184 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001185 if (rtcp_mux) {
1186 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001187 }
1188 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001191
1192 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001193 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1194 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1195 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001196 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001197 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1198 EXPECT_TRUE(CheckNoRtp1());
1199 EXPECT_TRUE(CheckNoRtp2());
1200
Zhi Huang365381f2018-04-13 16:44:34 -07001201 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1202 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001203 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001204 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1205 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001206
Zhi Huange830e682018-03-30 10:48:35 -07001207 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001208 SendCustomRtcp1(kSsrc1);
1209 SendCustomRtcp2(kSsrc2);
1210 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1212 EXPECT_TRUE(CheckNoRtcp1());
1213 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1214 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001216 SendCustomRtcp1(kSsrc2);
1217 SendCustomRtcp2(kSsrc1);
1218 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001219 // Bundle filter shouldn't filter out any RTCP.
1220 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1221 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 }
1223
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 void TestSetContentFailure() {
1225 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226
Peter Thatchera6d24442015-07-09 21:26:36 -07001227 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001228 std::unique_ptr<typename T::Content> content(
1229 CreateMediaContentWithStream(1));
1230
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001231 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001232 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001233 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001234 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001235 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001237 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001238 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001239 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001240
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001242 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001243 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244 }
1245
1246 void TestSendTwoOffers() {
1247 CreateChannels(0, 0);
1248
Peter Thatchera6d24442015-07-09 21:26:36 -07001249 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001250 std::unique_ptr<typename T::Content> content1(
1251 CreateMediaContentWithStream(1));
1252 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001253 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1255
Steve Anton18ee1d52017-09-11 11:32:35 -07001256 std::unique_ptr<typename T::Content> content2(
1257 CreateMediaContentWithStream(2));
1258 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001259 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1261 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1262 }
1263
1264 void TestReceiveTwoOffers() {
1265 CreateChannels(0, 0);
1266
Peter Thatchera6d24442015-07-09 21:26:36 -07001267 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001268 std::unique_ptr<typename T::Content> content1(
1269 CreateMediaContentWithStream(1));
1270 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001271 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1273
Steve Anton18ee1d52017-09-11 11:32:35 -07001274 std::unique_ptr<typename T::Content> content2(
1275 CreateMediaContentWithStream(2));
1276 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001277 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1279 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1280 }
1281
1282 void TestSendPrAnswer() {
1283 CreateChannels(0, 0);
1284
Peter Thatchera6d24442015-07-09 21:26:36 -07001285 std::string err;
1286 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001287 std::unique_ptr<typename T::Content> content1(
1288 CreateMediaContentWithStream(1));
1289 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001290 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1292
Peter Thatchera6d24442015-07-09 21:26:36 -07001293 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001294 std::unique_ptr<typename T::Content> content2(
1295 CreateMediaContentWithStream(2));
1296 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001297 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1299 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1300
Peter Thatchera6d24442015-07-09 21:26:36 -07001301 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001302 std::unique_ptr<typename T::Content> content3(
1303 CreateMediaContentWithStream(3));
1304 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001305 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1307 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1308 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1309 }
1310
1311 void TestReceivePrAnswer() {
1312 CreateChannels(0, 0);
1313
Peter Thatchera6d24442015-07-09 21:26:36 -07001314 std::string err;
1315 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001316 std::unique_ptr<typename T::Content> content1(
1317 CreateMediaContentWithStream(1));
1318 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001319 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1321
Peter Thatchera6d24442015-07-09 21:26:36 -07001322 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001323 std::unique_ptr<typename T::Content> content2(
1324 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001325 EXPECT_TRUE(
1326 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1328 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1329
Peter Thatchera6d24442015-07-09 21:26:36 -07001330 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001331 std::unique_ptr<typename T::Content> content3(
1332 CreateMediaContentWithStream(3));
1333 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001334 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1336 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1337 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1338 }
1339
1340 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001341 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342 EXPECT_TRUE(SendInitiate());
1343 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001344 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1345 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346
1347 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001348 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349 // The sending message is only posted. channel2_ should be empty.
1350 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001351 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1352 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353
1354 // When channel1_ is deleted, the RTCP packet should be sent out to
1355 // channel2_.
1356 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001357 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358 EXPECT_TRUE(CheckRtcp2());
1359 }
1360
zstein56162b92017-04-24 16:54:35 -07001361 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001362 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001364
zstein56162b92017-04-24 16:54:35 -07001365 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001366 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_TRUE(media_channel1_->ready_to_send());
1368
zstein56162b92017-04-24 16:54:35 -07001369 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001370 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 }
1373
skvladdc1c62c2016-03-16 19:07:43 -07001374 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1375 typename T::Content content;
1376 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1377 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001378 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001379 }
1380
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001381 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001382 webrtc::RtpParameters parameters;
1383 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001384 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001385 parameters.encodings.push_back(encoding);
1386 return parameters;
1387 }
1388
1389 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001390 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001391 EXPECT_EQ(1UL, parameters.encodings.size());
1392 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1393 }
1394
1395 void DefaultMaxBitrateIsUnlimited() {
1396 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001397 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1398 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001399 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001400 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001401 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001402 }
1403
Zhi Huange830e682018-03-30 10:48:35 -07001404 // Test that when a channel gets new RtpTransport with a call to
1405 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1406 // with the options on the new one.
1407
Steve Anton8a63f782017-10-23 13:08:53 -07001408 // For example, audio and video may use separate socket options, but initially
1409 // be unbundled, then later become bundled. When this happens, their preferred
1410 // socket options should be merged to the underlying transport they share.
1411 void SocketOptionsMergedOnSetTransport() {
1412 constexpr int kSndBufSize = 4000;
1413 constexpr int kRcvBufSize = 8000;
1414
Zhi Huange830e682018-03-30 10:48:35 -07001415 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001416
1417 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1418 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1419 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1420 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1421
Zhi Huange830e682018-03-30 10:48:35 -07001422 new_rtp_transport_ = CreateDtlsSrtpTransport(
1423 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1424 static_cast<DtlsTransportInternal*>(
1425 channel2_->rtcp_packet_transport()));
1426 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001427
1428 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001429 ASSERT_TRUE(
1430 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1431 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001432 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001433 ASSERT_TRUE(
1434 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1435 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001436 EXPECT_EQ(kRcvBufSize, option_val);
1437 }
1438
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001439 void CreateSimulcastContent(const std::vector<std::string>& rids,
1440 typename T::Content* content) {
1441 std::vector<RidDescription> rid_descriptions;
1442 for (const std::string name : rids) {
1443 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1444 }
1445
1446 StreamParams stream;
1447 stream.set_rids(rid_descriptions);
1448 CreateContent(0, kPcmuCodec, kH264Codec, content);
1449 // This is for unified plan, so there can be only one StreamParams.
1450 content->mutable_streams().clear();
1451 content->AddStream(stream);
1452 }
1453
1454 void VerifySimulcastStreamParams(const StreamParams& expected,
1455 const typename T::Channel* channel) {
1456 const std::vector<StreamParams>& streams = channel->local_streams();
1457 ASSERT_EQ(1u, streams.size());
1458 const StreamParams& result = streams[0];
1459 EXPECT_EQ(expected.rids(), result.rids());
1460 EXPECT_TRUE(result.has_ssrcs());
1461 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1462 std::vector<uint32_t> primary_ssrcs;
1463 result.GetPrimarySsrcs(&primary_ssrcs);
1464 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1465 }
1466
1467 void TestUpdateLocalStreamsWithSimulcast() {
1468 CreateChannels(0, 0);
1469 typename T::Content content1, content2, content3;
1470 CreateSimulcastContent({"f", "h", "q"}, &content1);
1471 EXPECT_TRUE(
1472 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1473 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1474 StreamParams stream1 = channel1_->local_streams()[0];
1475
1476 // Create a similar offer. SetLocalContent should not remove and add.
1477 CreateSimulcastContent({"f", "h", "q"}, &content2);
1478 EXPECT_TRUE(
1479 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1480 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1481 StreamParams stream2 = channel1_->local_streams()[0];
1482 // Check that the streams are identical (SSRCs didn't change).
1483 EXPECT_EQ(stream1, stream2);
1484
1485 // Create third offer that has same RIDs in different order.
1486 CreateSimulcastContent({"f", "q", "h"}, &content3);
1487 EXPECT_TRUE(
1488 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1489 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1490 }
1491
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001493 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1494 static void ProcessThreadQueue(rtc::Thread* thread) {
1495 RTC_DCHECK(thread->IsCurrent());
1496 while (!thread->empty()) {
1497 thread->ProcessMessages(0);
1498 }
1499 }
1500 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1501 // |threads| and current thread post packets to network thread.
1502 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001503 thread->Invoke<void>(RTC_FROM_HERE,
1504 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001505 }
1506 ProcessThreadQueue(rtc::Thread::Current());
1507 // Network thread move them around and post back to worker = current thread.
1508 if (!network_thread_->IsCurrent()) {
1509 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001510 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511 }
1512 // Worker thread = current Thread process received messages.
1513 ProcessThreadQueue(rtc::Thread::Current());
1514 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001515 // TODO(pbos): Remove playout from all media channels and let renderers mute
1516 // themselves.
1517 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001518 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1519 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001520 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1521 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1522 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1523 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1524 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1525 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1526 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1527 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001528 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1529 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1530 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 cricket::FakeMediaEngine media_engine_;
1532 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001533 typename T::MediaChannel* media_channel1_ = nullptr;
1534 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001535 std::unique_ptr<typename T::Channel> channel1_;
1536 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 typename T::Content local_media_content1_;
1538 typename T::Content local_media_content2_;
1539 typename T::Content remote_media_content1_;
1540 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542 rtc::Buffer rtp_packet_;
1543 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001544 int rtcp_mux_activated_callbacks1_ = 0;
1545 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001546 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001547 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548};
1549
Yves Gerey665174f2018-06-19 15:03:05 +02001550template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551void ChannelTest<VoiceTraits>::CreateContent(
1552 int flags,
1553 const cricket::AudioCodec& audio_codec,
1554 const cricket::VideoCodec& video_codec,
1555 cricket::AudioContentDescription* audio) {
1556 audio->AddCodec(audio_codec);
1557 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558}
1559
Yves Gerey665174f2018-06-19 15:03:05 +02001560template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561void ChannelTest<VoiceTraits>::CopyContent(
1562 const cricket::AudioContentDescription& source,
1563 cricket::AudioContentDescription* audio) {
1564 *audio = source;
1565}
1566
Yves Gerey665174f2018-06-19 15:03:05 +02001567template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1569 const cricket::AudioCodec& c2) {
1570 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001571 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572}
1573
Peter Boström0c4e06b2015-10-07 12:23:21 +02001574template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001576 uint32_t ssrc,
1577 int flags,
1578 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 audio->AddLegacyStream(ssrc);
1580}
1581
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001582class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583 public:
solenberg1dd98f32015-09-10 01:57:14 -07001584 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001585 VoiceChannelSingleThreadTest()
1586 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1587};
1588
1589class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1590 public:
1591 typedef ChannelTest<VoiceTraits> Base;
1592 VoiceChannelDoubleThreadTest()
1593 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594};
1595
jbauch5869f502017-06-29 12:31:36 -07001596class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001597 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001598 public:
1599 typedef ChannelTest<VoiceTraits> Base;
1600 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001601 : Base(true,
1602 kPcmuFrameWithExtensions,
1603 kRtcpReport,
1604 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001605};
1606
1607class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001608 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001609 public:
1610 typedef ChannelTest<VoiceTraits> Base;
1611 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001612 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1613 }
jbauch5869f502017-06-29 12:31:36 -07001614};
1615
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001616// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001617template <>
Steve Anton8699a322017-11-06 15:53:33 -08001618std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001619 rtc::Thread* worker_thread,
1620 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001621 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001622 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001623 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001624 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001625 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001626 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001627 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1628 &ssrc_generator_);
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001629 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 return channel;
1631}
1632
Yves Gerey665174f2018-06-19 15:03:05 +02001633template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634void ChannelTest<VideoTraits>::CreateContent(
1635 int flags,
1636 const cricket::AudioCodec& audio_codec,
1637 const cricket::VideoCodec& video_codec,
1638 cricket::VideoContentDescription* video) {
1639 video->AddCodec(video_codec);
1640 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641}
1642
Yves Gerey665174f2018-06-19 15:03:05 +02001643template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644void ChannelTest<VideoTraits>::CopyContent(
1645 const cricket::VideoContentDescription& source,
1646 cricket::VideoContentDescription* video) {
1647 *video = source;
1648}
1649
Yves Gerey665174f2018-06-19 15:03:05 +02001650template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1652 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001653 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654}
1655
Peter Boström0c4e06b2015-10-07 12:23:21 +02001656template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001658 uint32_t ssrc,
1659 int flags,
1660 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 video->AddLegacyStream(ssrc);
1662}
1663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001664class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 public:
solenberg1dd98f32015-09-10 01:57:14 -07001666 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667 VideoChannelSingleThreadTest()
1668 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669};
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1672 public:
1673 typedef ChannelTest<VideoTraits> Base;
1674 VideoChannelDoubleThreadTest()
1675 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1676};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001678TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::TestInit();
1680 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1681 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1682}
1683
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001684TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1685 Base::TestDeinit();
1686}
1687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001688TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689 Base::TestSetContents();
1690}
1691
Johannes Kron9190b822018-10-29 11:22:05 +01001692TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1693 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1694}
1695
1696TEST_F(VoiceChannelSingleThreadTest,
1697 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1698 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1699}
1700
1701TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1702 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1703}
1704
1705TEST_F(VoiceChannelSingleThreadTest,
1706 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1707 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1708}
1709
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 Base::TestSetContentsNullOffer();
1712}
1713
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001714TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 Base::TestSetContentsRtcpMux();
1716}
1717
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001718TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 Base::TestSetContentsRtcpMux();
1720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 Base::TestChangeStreamParamsInContent();
1724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::TestPlayoutAndSendingStates();
1728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 Base::TestMediaContentDirection();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001735 Base::TestNetworkRouteChanges();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestCallSetup();
1740}
1741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001742TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 Base::TestCallTeardownRtcpMux();
1744}
1745
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 Base::SendRtpToRtp();
1748}
1749
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001750TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 Base::SendRtcpToRtcp();
1752}
1753
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001754TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001755 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756}
1757
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001758TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001759 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1764}
1765
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001766TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 Base::SendRtpToRtpOnThread();
1768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 Base::SendWithWritabilityLoss();
1772}
1773
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001774TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 Base::TestSetContentFailure();
1776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 Base::TestSendTwoOffers();
1780}
1781
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 Base::TestReceiveTwoOffers();
1784}
1785
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001786TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787 Base::TestSendPrAnswer();
1788}
1789
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001790TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 Base::TestReceivePrAnswer();
1792}
1793
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001794TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 Base::TestFlushRtcp();
1796}
1797
zstein56162b92017-04-24 16:54:35 -07001798TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1799 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800}
1801
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001803 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804}
1805
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001807 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001808}
1809
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001810TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001811 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001812}
1813
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001814TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001815 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001818TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001819 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001820}
1821
Steve Anton8a63f782017-10-23 13:08:53 -07001822TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1823 Base::SocketOptionsMergedOnSetTransport();
1824}
1825
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001826// VoiceChannelDoubleThreadTest
1827TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001829 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1830 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831}
1832
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001833TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1834 Base::TestDeinit();
1835}
1836
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001837TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 Base::TestSetContents();
1839}
1840
Johannes Kron9190b822018-10-29 11:22:05 +01001841TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1842 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1843}
1844
1845TEST_F(VoiceChannelDoubleThreadTest,
1846 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1847 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1848}
1849
1850TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1851 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1852}
1853
1854TEST_F(VoiceChannelDoubleThreadTest,
1855 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1856 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1857}
1858
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001859TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860 Base::TestSetContentsNullOffer();
1861}
1862
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001863TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001864 Base::TestSetContentsRtcpMux();
1865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001868 Base::TestSetContentsRtcpMux();
1869}
1870
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001871TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 Base::TestChangeStreamParamsInContent();
1873}
1874
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001875TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 Base::TestPlayoutAndSendingStates();
1877}
1878
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1880 Base::TestMediaContentDirection();
1881}
1882
1883TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1884 Base::TestNetworkRouteChanges();
1885}
1886
1887TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1888 Base::TestCallSetup();
1889}
1890
1891TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1892 Base::TestCallTeardownRtcpMux();
1893}
1894
1895TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1896 Base::SendRtpToRtp();
1897}
1898
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001899TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1900 Base::SendRtcpToRtcp();
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001904 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001905}
1906
1907TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001908 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001909}
1910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1912 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1913}
1914
1915TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1916 Base::SendRtpToRtpOnThread();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1920 Base::SendWithWritabilityLoss();
1921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1924 Base::TestSetContentFailure();
1925}
1926
1927TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1928 Base::TestSendTwoOffers();
1929}
1930
1931TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1932 Base::TestReceiveTwoOffers();
1933}
1934
1935TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1936 Base::TestSendPrAnswer();
1937}
1938
1939TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1940 Base::TestReceivePrAnswer();
1941}
1942
1943TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1944 Base::TestFlushRtcp();
1945}
1946
zstein56162b92017-04-24 16:54:35 -07001947TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1948 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949}
1950
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001951TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1952 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1953}
1954
1955TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1956 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1957}
1958
1959TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1960 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1961}
1962
1963TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1964 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1965}
1966
1967TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1968 Base::DefaultMaxBitrateIsUnlimited();
1969}
1970
Steve Anton8a63f782017-10-23 13:08:53 -07001971TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1972 Base::SocketOptionsMergedOnSetTransport();
1973}
1974
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001975// VideoChannelSingleThreadTest
1976TEST_F(VideoChannelSingleThreadTest, TestInit) {
1977 Base::TestInit();
1978}
1979
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001980TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1981 Base::TestDeinit();
1982}
1983
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001984TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1985 Base::TestSetContents();
1986}
1987
Johannes Kron9190b822018-10-29 11:22:05 +01001988TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1989 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1990}
1991
1992TEST_F(VideoChannelSingleThreadTest,
1993 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1994 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1995}
1996
1997TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1998 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1999}
2000
2001TEST_F(VideoChannelSingleThreadTest,
2002 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2003 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2004}
2005
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002006TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2007 Base::TestSetContentsNullOffer();
2008}
2009
2010TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2011 Base::TestSetContentsRtcpMux();
2012}
2013
2014TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2015 Base::TestSetContentsRtcpMux();
2016}
2017
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002018TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2019 Base::TestChangeStreamParamsInContent();
2020}
2021
2022TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2023 Base::TestPlayoutAndSendingStates();
2024}
2025
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002026TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002027 Base::TestMediaContentDirection();
2028}
2029
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002030TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002031 Base::TestNetworkRouteChanges();
2032}
2033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002034TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 Base::TestCallSetup();
2036}
2037
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002038TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039 Base::TestCallTeardownRtcpMux();
2040}
2041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002042TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 Base::SendRtpToRtp();
2044}
2045
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002046TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 Base::SendRtcpToRtcp();
2048}
2049
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002050TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002051 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002052}
2053
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002054TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002055 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056}
2057
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002058TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2060}
2061
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002062TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002063 Base::SendRtpToRtpOnThread();
2064}
2065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002066TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 Base::SendWithWritabilityLoss();
2068}
2069
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002070TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002071 Base::TestSetContentFailure();
2072}
2073
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002074TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075 Base::TestSendTwoOffers();
2076}
2077
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002078TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 Base::TestReceiveTwoOffers();
2080}
2081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 Base::TestSendPrAnswer();
2084}
2085
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002086TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002087 Base::TestReceivePrAnswer();
2088}
2089
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002090TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 Base::TestFlushRtcp();
2092}
2093
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002094TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002095 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002096}
2097
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002098TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002099 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002100}
2101
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002102TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002103 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002104}
2105
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002106TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002107 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108}
2109
zstein56162b92017-04-24 16:54:35 -07002110TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2111 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112}
2113
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002114TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002115 Base::DefaultMaxBitrateIsUnlimited();
2116}
2117
Steve Anton8a63f782017-10-23 13:08:53 -07002118TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2119 Base::SocketOptionsMergedOnSetTransport();
2120}
2121
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002122TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2123 Base::TestUpdateLocalStreamsWithSimulcast();
2124}
2125
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002126// VideoChannelDoubleThreadTest
2127TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2128 Base::TestInit();
2129}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002131TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2132 Base::TestDeinit();
2133}
2134
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002135TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2136 Base::TestSetContents();
2137}
2138
Johannes Kron9190b822018-10-29 11:22:05 +01002139TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2140 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2141}
2142
2143TEST_F(VideoChannelDoubleThreadTest,
2144 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2145 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2146}
2147
2148TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2149 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2150}
2151
2152TEST_F(VideoChannelDoubleThreadTest,
2153 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2154 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2155}
2156
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002157TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2158 Base::TestSetContentsNullOffer();
2159}
2160
2161TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2162 Base::TestSetContentsRtcpMux();
2163}
2164
2165TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2166 Base::TestSetContentsRtcpMux();
2167}
2168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002169TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2170 Base::TestChangeStreamParamsInContent();
2171}
2172
2173TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2174 Base::TestPlayoutAndSendingStates();
2175}
2176
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002177TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2178 Base::TestMediaContentDirection();
2179}
2180
2181TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2182 Base::TestNetworkRouteChanges();
2183}
2184
2185TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2186 Base::TestCallSetup();
2187}
2188
2189TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2190 Base::TestCallTeardownRtcpMux();
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2194 Base::SendRtpToRtp();
2195}
2196
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002197TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2198 Base::SendRtcpToRtcp();
2199}
2200
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002201TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002202 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002203}
2204
2205TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002206 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207}
2208
2209TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2210 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2211}
2212
2213TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2214 Base::SendRtpToRtpOnThread();
2215}
2216
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002217TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2218 Base::SendWithWritabilityLoss();
2219}
2220
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002221TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2222 Base::TestSetContentFailure();
2223}
2224
2225TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2226 Base::TestSendTwoOffers();
2227}
2228
2229TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2230 Base::TestReceiveTwoOffers();
2231}
2232
2233TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2234 Base::TestSendPrAnswer();
2235}
2236
2237TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2238 Base::TestReceivePrAnswer();
2239}
2240
2241TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2242 Base::TestFlushRtcp();
2243}
2244
2245TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2246 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2247}
2248
2249TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2250 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2251}
2252
2253TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2254 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2255}
2256
2257TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2258 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2259}
2260
zstein56162b92017-04-24 16:54:35 -07002261TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2262 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263}
2264
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002265TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2266 Base::DefaultMaxBitrateIsUnlimited();
2267}
2268
Steve Anton8a63f782017-10-23 13:08:53 -07002269TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2270 Base::SocketOptionsMergedOnSetTransport();
2271}
2272
deadbeef953c2ce2017-01-09 14:53:41 -08002273// RtpDataChannelSingleThreadTest
2274class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002276 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002277 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002278 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2279};
2280
deadbeef953c2ce2017-01-09 14:53:41 -08002281// RtpDataChannelDoubleThreadTest
2282class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283 public:
2284 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002285 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002286 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287};
2288
2289// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002290template <>
Steve Anton8699a322017-11-06 15:53:33 -08002291std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002292 rtc::Thread* worker_thread,
2293 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002294 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002295 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002296 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002297 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002298 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002299 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002300 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2301 &ssrc_generator_);
Zhi Huange830e682018-03-30 10:48:35 -07002302 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303 return channel;
2304}
2305
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307void ChannelTest<DataTraits>::CreateContent(
2308 int flags,
2309 const cricket::AudioCodec& audio_codec,
2310 const cricket::VideoCodec& video_codec,
2311 cricket::DataContentDescription* data) {
2312 data->AddCodec(kGoogleDataCodec);
2313 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314}
2315
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002316template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317void ChannelTest<DataTraits>::CopyContent(
2318 const cricket::DataContentDescription& source,
2319 cricket::DataContentDescription* data) {
2320 *data = source;
2321}
2322
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2325 const cricket::DataCodec& c2) {
2326 return c1.name == c2.name;
2327}
2328
Peter Boström0c4e06b2015-10-07 12:23:21 +02002329template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002331 uint32_t ssrc,
2332 int flags,
2333 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 data->AddLegacyStream(ssrc);
2335}
2336
deadbeef953c2ce2017-01-09 14:53:41 -08002337TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 Base::TestInit();
2339 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2340}
2341
deadbeef953c2ce2017-01-09 14:53:41 -08002342TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002343 Base::TestDeinit();
2344}
2345
deadbeef953c2ce2017-01-09 14:53:41 -08002346TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 Base::TestSetContents();
2348}
2349
deadbeef953c2ce2017-01-09 14:53:41 -08002350TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 Base::TestSetContentsNullOffer();
2352}
2353
deadbeef953c2ce2017-01-09 14:53:41 -08002354TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 Base::TestSetContentsRtcpMux();
2356}
2357
deadbeef953c2ce2017-01-09 14:53:41 -08002358TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 Base::TestChangeStreamParamsInContent();
2360}
2361
deadbeef953c2ce2017-01-09 14:53:41 -08002362TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 Base::TestPlayoutAndSendingStates();
2364}
2365
deadbeef953c2ce2017-01-09 14:53:41 -08002366TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 Base::TestMediaContentDirection();
2368}
2369
deadbeef953c2ce2017-01-09 14:53:41 -08002370TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 Base::TestCallSetup();
2372}
2373
deadbeef953c2ce2017-01-09 14:53:41 -08002374TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 Base::TestCallTeardownRtcpMux();
2376}
2377
zstein56162b92017-04-24 16:54:35 -07002378TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2379 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380}
2381
deadbeef953c2ce2017-01-09 14:53:41 -08002382TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383 Base::SendRtpToRtp();
2384}
2385
deadbeef953c2ce2017-01-09 14:53:41 -08002386TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 Base::SendRtcpToRtcp();
2388}
2389
deadbeef953c2ce2017-01-09 14:53:41 -08002390TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 Base::SendRtpToRtpOnThread();
2392}
2393
deadbeef953c2ce2017-01-09 14:53:41 -08002394TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 Base::SendWithWritabilityLoss();
2396}
2397
Steve Anton8a63f782017-10-23 13:08:53 -07002398TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2399 Base::SocketOptionsMergedOnSetTransport();
2400}
2401
deadbeef953c2ce2017-01-09 14:53:41 -08002402TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403 CreateChannels(0, 0);
2404 EXPECT_TRUE(SendInitiate());
2405 EXPECT_TRUE(SendAccept());
2406
2407 cricket::SendDataParams params;
2408 params.ssrc = 42;
2409 unsigned char data[] = {'f', 'o', 'o'};
2410 rtc::CopyOnWriteBuffer payload(data, 3);
2411 cricket::SendDataResult result;
2412 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2413 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2414 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2415}
2416
deadbeef953c2ce2017-01-09 14:53:41 -08002417TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002418 Base::TestInit();
2419 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2420}
2421
deadbeef953c2ce2017-01-09 14:53:41 -08002422TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002423 Base::TestDeinit();
2424}
2425
deadbeef953c2ce2017-01-09 14:53:41 -08002426TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427 Base::TestSetContents();
2428}
2429
deadbeef953c2ce2017-01-09 14:53:41 -08002430TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431 Base::TestSetContentsNullOffer();
2432}
2433
deadbeef953c2ce2017-01-09 14:53:41 -08002434TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002435 Base::TestSetContentsRtcpMux();
2436}
2437
deadbeef953c2ce2017-01-09 14:53:41 -08002438TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002439 Base::TestChangeStreamParamsInContent();
2440}
2441
deadbeef953c2ce2017-01-09 14:53:41 -08002442TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002443 Base::TestPlayoutAndSendingStates();
2444}
2445
deadbeef953c2ce2017-01-09 14:53:41 -08002446TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447 Base::TestMediaContentDirection();
2448}
2449
deadbeef953c2ce2017-01-09 14:53:41 -08002450TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451 Base::TestCallSetup();
2452}
2453
deadbeef953c2ce2017-01-09 14:53:41 -08002454TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002455 Base::TestCallTeardownRtcpMux();
2456}
2457
zstein56162b92017-04-24 16:54:35 -07002458TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2459 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002460}
2461
deadbeef953c2ce2017-01-09 14:53:41 -08002462TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002463 Base::SendRtpToRtp();
2464}
2465
deadbeef953c2ce2017-01-09 14:53:41 -08002466TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002467 Base::SendRtcpToRtcp();
2468}
2469
deadbeef953c2ce2017-01-09 14:53:41 -08002470TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002471 Base::SendRtpToRtpOnThread();
2472}
2473
deadbeef953c2ce2017-01-09 14:53:41 -08002474TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002475 Base::SendWithWritabilityLoss();
2476}
2477
Steve Anton8a63f782017-10-23 13:08:53 -07002478TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2479 Base::SocketOptionsMergedOnSetTransport();
2480}
2481
deadbeef953c2ce2017-01-09 14:53:41 -08002482TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483 CreateChannels(0, 0);
2484 EXPECT_TRUE(SendInitiate());
2485 EXPECT_TRUE(SendAccept());
2486
2487 cricket::SendDataParams params;
2488 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002489 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002490 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 cricket::SendDataResult result;
2492 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002493 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2495}
2496
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497// TODO(pthatcher): TestSetReceiver?