blob: fc3f20ac1efde0a9bac56aafb4a59b2423a8f5de [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
kwiberg31022942016-03-11 14:18:21 -080011#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010012#include <utility>
kwiberg31022942016-03-11 14:18:21 -080013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/array_view.h"
15#include "media/base/fakemediaengine.h"
16#include "media/base/fakertp.h"
17#include "media/base/mediachannel.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "p2p/base/fakecandidatepair.h"
19#include "p2p/base/fakedtlstransport.h"
20#include "p2p/base/fakepackettransport.h"
21#include "pc/channel.h"
22#include "rtc_base/buffer.h"
23#include "rtc_base/checks.h"
24#include "rtc_base/fakeclock.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/logging.h"
27#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
zhihuangb2cdd932017-01-19 16:54:25 -080029using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080032using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080033using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034
Danil Chapovalov33b01f22016-05-11 19:55:27 +020035namespace {
36const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
37const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
38const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070039const cricket::VideoCodec kH264Codec(97, "H264");
40const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020041const cricket::DataCodec kGoogleDataCodec(101, "google-data");
42const uint32_t kSsrc1 = 0x1111;
43const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070044const uint32_t kSsrc3 = 0x3333;
45const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020046const int kAudioPts[] = {0, 8};
47const int kVideoPts[] = {97, 99};
48enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010049
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
deadbeefcbecd352015-09-23 11:50:27 -070052template <class ChannelT,
53 class MediaChannelT,
54 class ContentT,
55 class CodecT,
56 class MediaInfoT,
57 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class Traits {
59 public:
60 typedef ChannelT Channel;
61 typedef MediaChannelT MediaChannel;
62 typedef ContentT Content;
63 typedef CodecT Codec;
64 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020065 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066};
67
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068class VoiceTraits : public Traits<cricket::VoiceChannel,
69 cricket::FakeVoiceMediaChannel,
70 cricket::AudioContentDescription,
71 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020072 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070073 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
75class VideoTraits : public Traits<cricket::VideoChannel,
76 cricket::FakeVideoMediaChannel,
77 cricket::VideoContentDescription,
78 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070080 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081
deadbeef953c2ce2017-01-09 14:53:41 -080082class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 cricket::FakeDataMediaChannel,
84 cricket::DataContentDescription,
85 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
deadbeef953c2ce2017-01-09 14:53:41 -080089// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +020090template <class T>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091class ChannelTest : public testing::Test, public sigslot::has_slots<> {
92 public:
deadbeefac22f702017-01-12 21:59:29 -080093 enum Flags {
94 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -080095 SSRC_MUX = 0x8,
96 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080097 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080098 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -070099 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800100 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101
Peter Boström34fbfff2015-09-24 19:20:30 +0200102 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200103 rtc::ArrayView<const uint8_t> rtp_data,
104 rtc::ArrayView<const uint8_t> rtcp_data,
105 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200106 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200107 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800108 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200109 if (network_is_worker == NetworkIsWorker::Yes) {
110 network_thread_ = rtc::Thread::Current();
111 } else {
112 network_thread_keeper_ = rtc::Thread::Create();
113 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200114 network_thread_ = network_thread_keeper_.get();
115 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200116 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200119 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800120 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200121 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800122 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Steve Anton8699a322017-11-06 15:53:33 -0800125 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
126 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200127 int flags1,
128 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800129 // Network thread is started in CreateChannels, to allow the test to
130 // configure a fake clock before any threads are spawned and attempt to
131 // access the time.
132 if (network_thread_keeper_) {
133 network_thread_keeper_->Start();
134 }
Zhi Huange830e682018-03-30 10:48:35 -0700135
deadbeeff5346592017-01-24 21:51:21 -0800136 // Make sure if using raw packet transports, they're used for both
137 // channels.
138 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200139 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800140 media_channel1_ = ch1.get();
141 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800142 rtc::PacketTransportInternal* rtp1 = nullptr;
143 rtc::PacketTransportInternal* rtcp1 = nullptr;
144 rtc::PacketTransportInternal* rtp2 = nullptr;
145 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800146 // Based on flags, create fake DTLS or raw packet transports.
147 if (flags1 & RAW_PACKET_TRANSPORT) {
148 fake_rtp_packet_transport1_.reset(
149 new rtc::FakePacketTransport("channel1_rtp"));
150 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700151 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800152 fake_rtcp_packet_transport1_.reset(
153 new rtc::FakePacketTransport("channel1_rtcp"));
154 rtcp1 = fake_rtcp_packet_transport1_.get();
155 }
156 } else {
157 // Confirmed to work with KT_RSA and KT_ECDSA.
158 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
159 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
160 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700161 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800162 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
163 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
164 rtcp1 = fake_rtcp_dtls_transport1_.get();
165 }
166 if (flags1 & DTLS) {
167 auto cert1 =
168 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
169 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
170 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
171 if (fake_rtcp_dtls_transport1_) {
172 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
173 }
174 }
175 }
176 // Based on flags, create fake DTLS or raw packet transports.
177 if (flags2 & RAW_PACKET_TRANSPORT) {
178 fake_rtp_packet_transport2_.reset(
179 new rtc::FakePacketTransport("channel2_rtp"));
180 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700181 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800182 fake_rtcp_packet_transport2_.reset(
183 new rtc::FakePacketTransport("channel2_rtcp"));
184 rtcp2 = fake_rtcp_packet_transport2_.get();
185 }
186 } else {
187 // Confirmed to work with KT_RSA and KT_ECDSA.
188 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
189 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
190 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700191 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800192 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
193 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
194 rtcp2 = fake_rtcp_dtls_transport2_.get();
195 }
196 if (flags2 & DTLS) {
197 auto cert2 =
198 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
199 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
200 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
201 if (fake_rtcp_dtls_transport2_) {
202 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
203 }
204 }
205 }
Zhi Huange830e682018-03-30 10:48:35 -0700206 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
207 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
208 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
209 flags1);
210 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
211 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
212 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
213 flags2);
214
215 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
216 std::move(ch1), rtp_transport1_.get(), flags1);
217 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
218 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800219 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800220 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800221 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800222 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200223 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
224 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000225 CopyContent(local_media_content1_, &remote_media_content1_);
226 CopyContent(local_media_content2_, &remote_media_content2_);
227
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228 // Add stream information (SSRC) to the local content but not to the remote
229 // content. This means that we per default know the SSRC of what we send but
230 // not what we receive.
231 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
232 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
233
234 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
235 if (flags1 & SSRC_MUX) {
236 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
237 }
238 if (flags2 & SSRC_MUX) {
239 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
240 }
241 }
Steve Anton8699a322017-11-06 15:53:33 -0800242 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200243 rtc::Thread* worker_thread,
244 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700245 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800246 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700247 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700248 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800249 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200250 auto channel = absl::make_unique<typename T::Channel>(
Steve Anton8699a322017-11-06 15:53:33 -0800251 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700252 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700253 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000254 return channel;
255 }
256
Zhi Huange830e682018-03-30 10:48:35 -0700257 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
258 rtc::PacketTransportInternal* rtp_packet_transport,
259 rtc::PacketTransportInternal* rtcp_packet_transport,
260 DtlsTransportInternal* rtp_dtls_transport,
261 DtlsTransportInternal* rtcp_dtls_transport,
262 int flags) {
263 if (flags & RTCP_MUX) {
264 rtcp_packet_transport = nullptr;
265 rtcp_dtls_transport = nullptr;
266 }
267
268 if (flags & DTLS) {
269 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
270 } else {
271 if (flags & RAW_PACKET_TRANSPORT) {
272 return CreateUnencryptedTransport(rtp_packet_transport,
273 rtcp_packet_transport);
274 } else {
275 return CreateUnencryptedTransport(rtp_dtls_transport,
276 rtcp_dtls_transport);
277 }
278 }
279 }
280
281 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
282 rtc::PacketTransportInternal* rtp_packet_transport,
283 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200284 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
285 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700286
287 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
288 if (rtcp_packet_transport) {
289 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
290 }
291 return rtp_transport;
292 }
293
294 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
295 cricket::DtlsTransportInternal* rtp_dtls_transport,
296 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200297 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700298 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700299
300 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
301 rtcp_dtls_transport);
302 return dtls_srtp_transport;
303 }
304
deadbeeff5346592017-01-24 21:51:21 -0800305 void ConnectFakeTransports() {
306 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
307 bool asymmetric = false;
308 // Depending on test flags, could be using DTLS or raw packet transport.
309 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
310 fake_rtp_dtls_transport1_->SetDestination(
311 fake_rtp_dtls_transport2_.get(), asymmetric);
312 }
313 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
314 fake_rtcp_dtls_transport1_->SetDestination(
315 fake_rtcp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
318 fake_rtp_packet_transport1_->SetDestination(
319 fake_rtp_packet_transport2_.get(), asymmetric);
320 }
321 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
322 fake_rtcp_packet_transport1_->SetDestination(
323 fake_rtcp_packet_transport2_.get(), asymmetric);
324 }
325 });
326 }
327
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000328 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000329 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800330 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331 if (result) {
332 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800334 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800336 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800338 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 }
340 }
341 return result;
342 }
343
344 bool SendAccept() {
345 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000346 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800347 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 }
349
350 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800352 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 if (result) {
354 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800356 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 }
358 return result;
359 }
360
361 bool SendProvisionalAnswer() {
362 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 if (result) {
365 channel2_->Enable(true);
366 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800367 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800368 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 }
370 return result;
371 }
372
373 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000374 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800375 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000377 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800378 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 return result;
380 }
381
deadbeeff5346592017-01-24 21:51:21 -0800382 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 channel1_.reset();
384 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800385 fake_rtp_dtls_transport1_.reset();
386 fake_rtcp_dtls_transport1_.reset();
387 fake_rtp_dtls_transport2_.reset();
388 fake_rtcp_dtls_transport2_.reset();
389 fake_rtp_packet_transport1_.reset();
390 fake_rtcp_packet_transport1_.reset();
391 fake_rtp_packet_transport2_.reset();
392 fake_rtcp_packet_transport2_.reset();
393 if (network_thread_keeper_) {
394 network_thread_keeper_.reset();
395 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 return true;
397 }
398
399 bool AddStream1(int id) {
400 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
401 }
Yves Gerey665174f2018-06-19 15:03:05 +0200402 bool RemoveStream1(int id) { return channel1_->RemoveRecvStream(id); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200404 void SendRtp1() {
405 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
406 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200408 void SendRtp2() {
409 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
410 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendRtcp1() {
413 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendRtcp2() {
416 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
418 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
424 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
425 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200427 void SendCustomRtcp1(uint32_t ssrc) {
428 rtc::Buffer data = CreateRtcpData(ssrc);
429 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200431 void SendCustomRtcp2(uint32_t ssrc) {
432 rtc::Buffer data = CreateRtcpData(ssrc);
433 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
439 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200440 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
442 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
445 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 }
448 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200449 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200450 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
451 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200453 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
455 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200457 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 rtc::Buffer data = CreateRtcpData(ssrc);
459 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200461 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200462 rtc::Buffer data = CreateRtcpData(ssrc);
463 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
466 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::SetBE32(data.data() + 8, ssrc);
469 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000470 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200471 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000472 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 return data;
474 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200475 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
476 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200478 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 return data;
480 }
481
Yves Gerey665174f2018-06-19 15:03:05 +0200482 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
483 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
484 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
485 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486
487 void CreateContent(int flags,
488 const cricket::AudioCodec& audio_codec,
489 const cricket::VideoCodec& video_codec,
490 typename T::Content* content) {
491 // overridden in specialized classes
492 }
493 void CopyContent(const typename T::Content& source,
494 typename T::Content* content) {
495 // overridden in specialized classes
496 }
497
Steve Anton18ee1d52017-09-11 11:32:35 -0700498 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700500 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
501 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700502 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700503 AddLegacyStreamInContent(ssrc, 0, content);
504 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 }
506
ossu292d6582016-03-17 02:31:13 -0700507 // Will manage the lifetime of a CallThread, making sure it's
508 // destroyed before this object goes out of scope.
509 class ScopedCallThread {
510 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200511 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700512 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200513 : thread_(rtc::Thread::Create()),
514 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700515 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700516 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700517 }
518
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200519 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700520
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200521 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700522
523 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 std::unique_ptr<rtc::Thread> thread_;
525 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700526 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
529 return false; // overridden in specialized classes
530 }
531
deadbeeff5346592017-01-24 21:51:21 -0800532 void OnRtcpMuxFullyActive1(const std::string&) {
533 rtcp_mux_activated_callbacks1_++;
534 }
535 void OnRtcpMuxFullyActive2(const std::string&) {
536 rtcp_mux_activated_callbacks2_++;
537 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538
Honghai Zhangcc411c02016-03-29 17:27:21 -0700539 cricket::CandidatePairInterface* last_selected_candidate_pair() {
540 return last_selected_candidate_pair_;
541 }
542
Peter Boström0c4e06b2015-10-07 12:23:21 +0200543 void AddLegacyStreamInContent(uint32_t ssrc,
544 int flags,
545 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 // Base implementation.
547 }
548
549 // Tests that can be used by derived classes.
550
551 // Basic sanity check.
552 void TestInit() {
553 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700554 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200556 if (verify_playout_) {
557 EXPECT_FALSE(media_channel1_->playout());
558 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 EXPECT_TRUE(media_channel1_->codecs().empty());
560 EXPECT_TRUE(media_channel1_->recv_streams().empty());
561 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
562 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
563 }
564
565 // Test that SetLocalContent and SetRemoteContent properly configure
566 // the codecs.
567 void TestSetContents() {
568 CreateChannels(0, 0);
569 typename T::Content content;
570 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800571 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800573 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200575 EXPECT_TRUE(
576 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 }
578
579 // Test that SetLocalContent and SetRemoteContent properly deals
580 // with an empty offer.
581 void TestSetContentsNullOffer() {
582 CreateChannels(0, 0);
583 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800584 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 CreateContent(0, kPcmuCodec, kH264Codec, &content);
586 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800587 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200589 EXPECT_TRUE(
590 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 }
592
593 // Test that SetLocalContent and SetRemoteContent properly set RTCP
594 // mux.
595 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800596 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 typename T::Content content;
598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 // Both sides agree on mux. Should no longer be a separate RTCP channel.
600 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800601 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
602 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800604 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800606 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 }
608
609 // Test that SetLocalContent and SetRemoteContent properly set RTCP
610 // mux when a provisional answer is received.
611 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800612 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 typename T::Content content;
614 CreateContent(0, kPcmuCodec, kH264Codec, &content);
615 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800616 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
617 EXPECT_TRUE(
618 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800619 // Both sides agree on mux. Should signal RTCP mux as fully activated.
620 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800621 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800622 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800624 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800626 EXPECT_TRUE(
627 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
628 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800629 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 }
631
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 // Test that Add/RemoveStream properly forward to the media channel.
633 void TestStreams() {
634 CreateChannels(0, 0);
635 EXPECT_TRUE(AddStream1(1));
636 EXPECT_TRUE(AddStream1(2));
637 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
638 EXPECT_TRUE(RemoveStream1(2));
639 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
640 EXPECT_TRUE(RemoveStream1(1));
641 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
642 }
643
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 // Test that SetLocalContent and SetRemoteContent properly
645 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800646 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 void TestChangeStreamParamsInContent() {
648 cricket::StreamParams stream1;
649 stream1.groupid = "group1";
650 stream1.id = "stream1";
651 stream1.ssrcs.push_back(kSsrc1);
652 stream1.cname = "stream1_cname";
653
654 cricket::StreamParams stream2;
655 stream2.groupid = "group1";
656 stream2.id = "stream2";
657 stream2.ssrcs.push_back(kSsrc2);
658 stream2.cname = "stream2_cname";
659
660 // Setup a call where channel 1 send |stream1| to channel 2.
661 CreateChannels(0, 0);
662 typename T::Content content1;
663 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
664 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800665 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(channel1_->Enable(true));
667 EXPECT_EQ(1u, media_channel1_->send_streams().size());
668
Steve Anton3828c062017-12-06 10:34:51 -0800669 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800671 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672
673 // Channel 2 do not send anything.
674 typename T::Content content2;
675 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800676 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800678 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_TRUE(channel2_->Enable(true));
680 EXPECT_EQ(0u, media_channel2_->send_streams().size());
681
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200682 SendCustomRtp1(kSsrc1, 0);
683 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
685
686 // Let channel 2 update the content by sending |stream2| and enable SRTP.
687 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700688 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800690 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 ASSERT_EQ(1u, media_channel2_->send_streams().size());
692 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
693
Steve Anton3828c062017-12-06 10:34:51 -0800694 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
696 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
697
698 // Channel 1 replies but stop sending stream1.
699 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700700 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800701 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 EXPECT_EQ(0u, media_channel1_->send_streams().size());
703
Steve Anton3828c062017-12-06 10:34:51 -0800704 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
706
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200707 SendCustomRtp2(kSsrc2, 0);
708 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
710 }
711
712 // Test that we only start playout and sending at the right times.
713 void TestPlayoutAndSendingStates() {
714 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200715 if (verify_playout_) {
716 EXPECT_FALSE(media_channel1_->playout());
717 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200719 if (verify_playout_) {
720 EXPECT_FALSE(media_channel2_->playout());
721 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_FALSE(media_channel2_->sending());
723 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200724 if (verify_playout_) {
725 EXPECT_FALSE(media_channel1_->playout());
726 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000728 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800729 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 if (verify_playout_) {
731 EXPECT_TRUE(media_channel1_->playout());
732 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000734 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800735 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
737 EXPECT_FALSE(media_channel2_->playout());
738 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800741 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200742 if (verify_playout_) {
743 EXPECT_FALSE(media_channel2_->playout());
744 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800746 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 if (verify_playout_) {
748 EXPECT_TRUE(media_channel1_->playout());
749 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 if (verify_playout_) {
752 EXPECT_FALSE(media_channel2_->playout());
753 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 EXPECT_FALSE(media_channel2_->sending());
755 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200756 if (verify_playout_) {
757 EXPECT_TRUE(media_channel2_->playout());
758 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000760 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800761 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200762 if (verify_playout_) {
763 EXPECT_TRUE(media_channel1_->playout());
764 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765 EXPECT_TRUE(media_channel1_->sending());
766 }
767
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 // Test that changing the MediaContentDirection in the local and remote
769 // session description start playout and sending at the right time.
770 void TestMediaContentDirection() {
771 CreateChannels(0, 0);
772 typename T::Content content1;
773 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
774 typename T::Content content2;
775 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
776 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800777 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778
779 EXPECT_TRUE(channel1_->Enable(true));
780 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200781 if (verify_playout_) {
782 EXPECT_FALSE(media_channel1_->playout());
783 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200785 if (verify_playout_) {
786 EXPECT_FALSE(media_channel2_->playout());
787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 EXPECT_FALSE(media_channel2_->sending());
789
Steve Anton3828c062017-12-06 10:34:51 -0800790 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
791 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
792 EXPECT_TRUE(
793 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
794 EXPECT_TRUE(
795 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800796 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
Peter Boström34fbfff2015-09-24 19:20:30 +0200798 if (verify_playout_) {
799 EXPECT_TRUE(media_channel1_->playout());
800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200802 if (verify_playout_) {
803 EXPECT_FALSE(media_channel2_->playout()); // local InActive
804 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805 EXPECT_FALSE(media_channel2_->sending()); // local InActive
806
807 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800808 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800809 EXPECT_TRUE(
810 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
811 EXPECT_TRUE(
812 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813
Peter Boström34fbfff2015-09-24 19:20:30 +0200814 if (verify_playout_) {
815 EXPECT_TRUE(media_channel1_->playout());
816 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200818 if (verify_playout_) {
819 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
820 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
822
823 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800824 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800825 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
826 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827
Peter Boström34fbfff2015-09-24 19:20:30 +0200828 if (verify_playout_) {
829 EXPECT_TRUE(media_channel1_->playout());
830 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200832 if (verify_playout_) {
833 EXPECT_TRUE(media_channel2_->playout());
834 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 EXPECT_TRUE(media_channel2_->sending());
836 }
837
Honghai Zhangcc411c02016-03-29 17:27:21 -0700838 // Tests that when the transport channel signals a candidate pair change
839 // event, the media channel will receive a call on the network route change.
840 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700841 static constexpr uint16_t kLocalNetId = 1;
842 static constexpr uint16_t kRemoteNetId = 2;
843 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800844 // Ipv4(20) + UDP(8).
845 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800846 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200847
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800848 CreateChannels(DTLS, DTLS);
849 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700850
Honghai Zhangcc411c02016-03-29 17:27:21 -0700851 typename T::MediaChannel* media_channel1 =
852 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200853 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700854
Zhi Huang942bc2e2017-11-13 13:26:07 -0800855 // Need to wait for the threads before calling
856 // |set_num_network_route_changes| because the network route would be set
857 // when creating the channel.
858 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200859 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800860 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800861 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200862 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800863 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
864
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200865 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200866 });
867 WaitForThreads();
868 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700869 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200870 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700871
eladalon05b07bb2017-08-24 07:40:16 -0700872 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800873 rtc::NetworkRoute network_route;
874 network_route.connected = true;
875 network_route.local_network_id = kLocalNetId;
876 network_route.remote_network_id = kRemoteNetId;
877 network_route.last_sent_packet_id = kLastPacketId;
878 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200879 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800880 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
881
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200882 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200883 });
884 WaitForThreads();
885 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Steve Antonea1bb352018-07-23 10:12:37 -0700886 rtc::NetworkRoute expected_network_route;
887 expected_network_route.connected = true;
888 expected_network_route.local_network_id = kLocalNetId;
889 expected_network_route.remote_network_id = kRemoteNetId;
890 expected_network_route.last_sent_packet_id = kLastPacketId;
Honghai Zhangcc411c02016-03-29 17:27:21 -0700891 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700893 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800894 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800895 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700896 }
897
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898 // Test setting up a call.
899 void TestCallSetup() {
900 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700901 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200903 if (verify_playout_) {
904 EXPECT_TRUE(media_channel1_->playout());
905 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 EXPECT_FALSE(media_channel1_->sending());
907 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700908 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_TRUE(media_channel1_->sending());
910 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200911 if (verify_playout_) {
912 EXPECT_TRUE(media_channel2_->playout());
913 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 EXPECT_TRUE(media_channel2_->sending());
915 EXPECT_EQ(1U, media_channel2_->codecs().size());
916 }
917
918 // Test that we don't crash if packets are sent during call teardown
919 // when RTCP mux is enabled. This is a regression test against a specific
920 // race condition that would only occur when a RTCP packet was sent during
921 // teardown of a channel on which RTCP mux was enabled.
922 void TestCallTeardownRtcpMux() {
923 class LastWordMediaChannel : public T::MediaChannel {
924 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200925 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700927 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
928 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
930 }
931 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200932 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
933 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
934 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935 EXPECT_TRUE(SendInitiate());
936 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800937 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 }
939
940 // Send voice RTP data to the other side and ensure it gets there.
941 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700942 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 EXPECT_TRUE(SendInitiate());
944 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700945 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
946 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200947 SendRtp1();
948 SendRtp2();
949 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950 EXPECT_TRUE(CheckRtp1());
951 EXPECT_TRUE(CheckRtp2());
952 EXPECT_TRUE(CheckNoRtp1());
953 EXPECT_TRUE(CheckNoRtp2());
954 }
955
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200956 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800957 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200958 EXPECT_TRUE(SendInitiate());
959 EXPECT_TRUE(SendAccept());
960 SendRtp1();
961 SendRtp2();
962 SendRtcp1();
963 SendRtcp2();
964 // Do not wait, destroy channels.
965 channel1_.reset(nullptr);
966 channel2_.reset(nullptr);
967 }
968
deadbeefac22f702017-01-12 21:59:29 -0800969 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800971 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972 EXPECT_TRUE(SendInitiate());
973 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700974 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
975 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200976 SendRtcp1();
977 SendRtcp2();
978 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 EXPECT_TRUE(CheckRtcp1());
980 EXPECT_TRUE(CheckRtcp2());
981 EXPECT_TRUE(CheckNoRtcp1());
982 EXPECT_TRUE(CheckNoRtcp2());
983 }
984
Zhi Huange830e682018-03-30 10:48:35 -0700985 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
986 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700987 EXPECT_FALSE(channel1_->srtp_active());
988 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200990 WaitForThreads();
991 EXPECT_TRUE(channel1_->writable());
992 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000993 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700994 EXPECT_TRUE(channel1_->srtp_active());
995 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200996 SendRtp1();
997 SendRtp2();
998 SendRtcp1();
999 SendRtcp2();
1000 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 EXPECT_TRUE(CheckRtp1());
1002 EXPECT_TRUE(CheckRtp2());
1003 EXPECT_TRUE(CheckNoRtp1());
1004 EXPECT_TRUE(CheckNoRtp2());
1005 EXPECT_TRUE(CheckRtcp1());
1006 EXPECT_TRUE(CheckRtcp2());
1007 EXPECT_TRUE(CheckNoRtcp1());
1008 EXPECT_TRUE(CheckNoRtcp2());
1009 }
1010
1011 // Test that we can send and receive early media when a provisional answer is
1012 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1013 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001014 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015
Yves Gerey665174f2018-06-19 15:03:05 +02001016 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1017 EXPECT_TRUE(SendOffer());
1018 EXPECT_TRUE(SendProvisionalAnswer());
1019 EXPECT_TRUE(channel1_->srtp_active());
1020 EXPECT_TRUE(channel2_->srtp_active());
1021 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1022 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
1023 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1024 SendCustomRtcp1(kSsrc1);
1025 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1026 WaitForThreads();
1027 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1028 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029
Yves Gerey665174f2018-06-19 15:03:05 +02001030 // Send packets from callee and verify that it is received.
1031 SendCustomRtcp2(kSsrc2);
1032 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1033 WaitForThreads();
1034 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1035 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036
Yves Gerey665174f2018-06-19 15:03:05 +02001037 // Complete call setup and ensure everything is still OK.
1038 EXPECT_TRUE(SendFinalAnswer());
1039 EXPECT_TRUE(channel1_->srtp_active());
1040 EXPECT_TRUE(channel2_->srtp_active());
1041 SendCustomRtcp1(kSsrc1);
1042 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1043 SendCustomRtcp2(kSsrc2);
1044 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1045 WaitForThreads();
1046 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1047 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1048 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1049 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 }
1051
1052 // Test that we properly send RTP without SRTP from a thread.
1053 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001054 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 EXPECT_TRUE(SendInitiate());
1056 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001057 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1058 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1059 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1060 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1061 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1062 send_rtcp1.thread(),
1063 send_rtcp2.thread()};
1064 WaitForThreads(involved_threads);
1065 EXPECT_TRUE(CheckRtp1());
1066 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 EXPECT_TRUE(CheckNoRtp1());
1068 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001069 EXPECT_TRUE(CheckRtcp1());
1070 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 EXPECT_TRUE(CheckNoRtcp1());
1072 EXPECT_TRUE(CheckNoRtcp2());
1073 }
1074
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 // Test that the mediachannel retains its sending state after the transport
1076 // becomes non-writable.
1077 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001078 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_TRUE(SendInitiate());
1080 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001081 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1082 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 SendRtp1();
1084 SendRtp2();
1085 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(CheckRtp1());
1087 EXPECT_TRUE(CheckRtp2());
1088 EXPECT_TRUE(CheckNoRtp1());
1089 EXPECT_TRUE(CheckNoRtp2());
1090
wu@webrtc.org97077a32013-10-25 21:18:33 +00001091 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001092 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1093 fake_rtp_dtls_transport1_->SetWritable(false);
1094 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001095 SendRtp1();
1096 SendRtp2();
1097 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(CheckRtp1());
1099 EXPECT_TRUE(CheckNoRtp2());
1100
1101 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001102 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1103 fake_rtp_dtls_transport1_->SetWritable(true);
1104 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001106 SendRtp1();
1107 SendRtp2();
1108 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_TRUE(CheckRtp1());
1110 EXPECT_TRUE(CheckRtp2());
1111 EXPECT_TRUE(CheckNoRtp1());
1112 EXPECT_TRUE(CheckNoRtp2());
1113
1114 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001115 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1116 bool asymmetric = true;
1117 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1118 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_TRUE(media_channel1_->sending());
1120
wu@webrtc.org97077a32013-10-25 21:18:33 +00001121 // Should fail also.
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());
zhihuangb2cdd932017-01-19 16:54:25 -08001127 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128
1129 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001130 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001131 bool asymmetric = true;
1132 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1133 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001134 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001136 SendRtp1();
1137 SendRtp2();
1138 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(CheckRtp1());
1140 EXPECT_TRUE(CheckRtp2());
1141 EXPECT_TRUE(CheckNoRtp1());
1142 EXPECT_TRUE(CheckNoRtp2());
1143 }
1144
Yves Gerey665174f2018-06-19 15:03:05 +02001145 void SendBundleToBundle(const int* pl_types,
1146 int len,
1147 bool rtcp_mux,
1148 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001149 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001151 // Only pl_type1 was added to the bundle filter for both |channel1_|
1152 // and |channel2_|.
1153 int pl_type1 = pl_types[0];
1154 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001155 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001156 if (secure)
1157 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001158 if (rtcp_mux) {
1159 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001160 }
1161 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001164
1165 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001166 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1167 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1168 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001169 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001170 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1171 EXPECT_TRUE(CheckNoRtp1());
1172 EXPECT_TRUE(CheckNoRtp2());
1173
Zhi Huang365381f2018-04-13 16:44:34 -07001174 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1175 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001176 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001177 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1178 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001179
Zhi Huange830e682018-03-30 10:48:35 -07001180 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001181 SendCustomRtcp1(kSsrc1);
1182 SendCustomRtcp2(kSsrc2);
1183 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1185 EXPECT_TRUE(CheckNoRtcp1());
1186 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1187 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001189 SendCustomRtcp1(kSsrc2);
1190 SendCustomRtcp2(kSsrc1);
1191 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001192 // Bundle filter shouldn't filter out any RTCP.
1193 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1194 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 }
1196
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197 void TestSetContentFailure() {
1198 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199
Peter Thatchera6d24442015-07-09 21:26:36 -07001200 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001201 std::unique_ptr<typename T::Content> content(
1202 CreateMediaContentWithStream(1));
1203
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001205 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001206 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001207 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001208 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001209
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001211 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001212 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001213
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001214 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001215 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001216 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217 }
1218
1219 void TestSendTwoOffers() {
1220 CreateChannels(0, 0);
1221
Peter Thatchera6d24442015-07-09 21:26:36 -07001222 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001223 std::unique_ptr<typename T::Content> content1(
1224 CreateMediaContentWithStream(1));
1225 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001226 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1228
Steve Anton18ee1d52017-09-11 11:32:35 -07001229 std::unique_ptr<typename T::Content> content2(
1230 CreateMediaContentWithStream(2));
1231 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001232 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1234 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1235 }
1236
1237 void TestReceiveTwoOffers() {
1238 CreateChannels(0, 0);
1239
Peter Thatchera6d24442015-07-09 21:26:36 -07001240 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001241 std::unique_ptr<typename T::Content> content1(
1242 CreateMediaContentWithStream(1));
1243 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001244 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1246
Steve Anton18ee1d52017-09-11 11:32:35 -07001247 std::unique_ptr<typename T::Content> content2(
1248 CreateMediaContentWithStream(2));
1249 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001250 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1252 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1253 }
1254
1255 void TestSendPrAnswer() {
1256 CreateChannels(0, 0);
1257
Peter Thatchera6d24442015-07-09 21:26:36 -07001258 std::string err;
1259 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001260 std::unique_ptr<typename T::Content> content1(
1261 CreateMediaContentWithStream(1));
1262 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001263 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001264 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1265
Peter Thatchera6d24442015-07-09 21:26:36 -07001266 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001267 std::unique_ptr<typename T::Content> content2(
1268 CreateMediaContentWithStream(2));
1269 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001270 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1272 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1273
Peter Thatchera6d24442015-07-09 21:26:36 -07001274 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001275 std::unique_ptr<typename T::Content> content3(
1276 CreateMediaContentWithStream(3));
1277 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001278 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001279 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1280 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1281 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1282 }
1283
1284 void TestReceivePrAnswer() {
1285 CreateChannels(0, 0);
1286
Peter Thatchera6d24442015-07-09 21:26:36 -07001287 std::string err;
1288 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001289 std::unique_ptr<typename T::Content> content1(
1290 CreateMediaContentWithStream(1));
1291 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001292 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1294
Peter Thatchera6d24442015-07-09 21:26:36 -07001295 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001296 std::unique_ptr<typename T::Content> content2(
1297 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001298 EXPECT_TRUE(
1299 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1301 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1302
Peter Thatchera6d24442015-07-09 21:26:36 -07001303 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001304 std::unique_ptr<typename T::Content> content3(
1305 CreateMediaContentWithStream(3));
1306 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001307 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001308 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1309 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1310 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1311 }
1312
1313 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001314 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_TRUE(SendInitiate());
1316 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001317 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1318 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001319
1320 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001321 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 // The sending message is only posted. channel2_ should be empty.
1323 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001324 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1325 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326
1327 // When channel1_ is deleted, the RTCP packet should be sent out to
1328 // channel2_.
1329 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001330 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331 EXPECT_TRUE(CheckRtcp2());
1332 }
1333
zstein56162b92017-04-24 16:54:35 -07001334 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001335 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001337
zstein56162b92017-04-24 16:54:35 -07001338 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001339 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(media_channel1_->ready_to_send());
1341
zstein56162b92017-04-24 16:54:35 -07001342 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001343 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001344 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 }
1346
skvladdc1c62c2016-03-16 19:07:43 -07001347 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1348 typename T::Content content;
1349 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1350 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001351 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001352 }
1353
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001354 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001355 webrtc::RtpParameters parameters;
1356 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001357 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001358 parameters.encodings.push_back(encoding);
1359 return parameters;
1360 }
1361
1362 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001363 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001364 EXPECT_EQ(1UL, parameters.encodings.size());
1365 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1366 }
1367
1368 void DefaultMaxBitrateIsUnlimited() {
1369 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001370 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1371 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001372 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001373 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001374 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001375 }
1376
Zhi Huange830e682018-03-30 10:48:35 -07001377 // Test that when a channel gets new RtpTransport with a call to
1378 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1379 // with the options on the new one.
1380
Steve Anton8a63f782017-10-23 13:08:53 -07001381 // For example, audio and video may use separate socket options, but initially
1382 // be unbundled, then later become bundled. When this happens, their preferred
1383 // socket options should be merged to the underlying transport they share.
1384 void SocketOptionsMergedOnSetTransport() {
1385 constexpr int kSndBufSize = 4000;
1386 constexpr int kRcvBufSize = 8000;
1387
Zhi Huange830e682018-03-30 10:48:35 -07001388 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001389
1390 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1391 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1392 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1393 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1394
Zhi Huange830e682018-03-30 10:48:35 -07001395 new_rtp_transport_ = CreateDtlsSrtpTransport(
1396 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1397 static_cast<DtlsTransportInternal*>(
1398 channel2_->rtcp_packet_transport()));
1399 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001400
1401 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001402 ASSERT_TRUE(
1403 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1404 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001405 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001406 ASSERT_TRUE(
1407 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1408 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001409 EXPECT_EQ(kRcvBufSize, option_val);
1410 }
1411
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001412 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001413 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1414 static void ProcessThreadQueue(rtc::Thread* thread) {
1415 RTC_DCHECK(thread->IsCurrent());
1416 while (!thread->empty()) {
1417 thread->ProcessMessages(0);
1418 }
1419 }
1420 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1421 // |threads| and current thread post packets to network thread.
1422 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001423 thread->Invoke<void>(RTC_FROM_HERE,
1424 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001425 }
1426 ProcessThreadQueue(rtc::Thread::Current());
1427 // Network thread move them around and post back to worker = current thread.
1428 if (!network_thread_->IsCurrent()) {
1429 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001430 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001431 }
1432 // Worker thread = current Thread process received messages.
1433 ProcessThreadQueue(rtc::Thread::Current());
1434 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001435 // TODO(pbos): Remove playout from all media channels and let renderers mute
1436 // themselves.
1437 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1439 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001440 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1441 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1442 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1443 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1444 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1445 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1446 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1447 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001448 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1449 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1450 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451 cricket::FakeMediaEngine media_engine_;
1452 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001453 typename T::MediaChannel* media_channel1_ = nullptr;
1454 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001455 std::unique_ptr<typename T::Channel> channel1_;
1456 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 typename T::Content local_media_content1_;
1458 typename T::Content local_media_content2_;
1459 typename T::Content remote_media_content1_;
1460 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001462 rtc::Buffer rtp_packet_;
1463 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001464 int rtcp_mux_activated_callbacks1_ = 0;
1465 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001466 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467};
1468
Yves Gerey665174f2018-06-19 15:03:05 +02001469template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470void ChannelTest<VoiceTraits>::CreateContent(
1471 int flags,
1472 const cricket::AudioCodec& audio_codec,
1473 const cricket::VideoCodec& video_codec,
1474 cricket::AudioContentDescription* audio) {
1475 audio->AddCodec(audio_codec);
1476 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477}
1478
Yves Gerey665174f2018-06-19 15:03:05 +02001479template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480void ChannelTest<VoiceTraits>::CopyContent(
1481 const cricket::AudioContentDescription& source,
1482 cricket::AudioContentDescription* audio) {
1483 *audio = source;
1484}
1485
Yves Gerey665174f2018-06-19 15:03:05 +02001486template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1488 const cricket::AudioCodec& c2) {
1489 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001490 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491}
1492
Peter Boström0c4e06b2015-10-07 12:23:21 +02001493template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001494void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001495 uint32_t ssrc,
1496 int flags,
1497 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 audio->AddLegacyStream(ssrc);
1499}
1500
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001501class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502 public:
solenberg1dd98f32015-09-10 01:57:14 -07001503 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 VoiceChannelSingleThreadTest()
1505 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1506};
1507
1508class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1509 public:
1510 typedef ChannelTest<VoiceTraits> Base;
1511 VoiceChannelDoubleThreadTest()
1512 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513};
1514
jbauch5869f502017-06-29 12:31:36 -07001515class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001516 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001517 public:
1518 typedef ChannelTest<VoiceTraits> Base;
1519 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001520 : Base(true,
1521 kPcmuFrameWithExtensions,
1522 kRtcpReport,
1523 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001524};
1525
1526class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001527 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001528 public:
1529 typedef ChannelTest<VoiceTraits> Base;
1530 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001531 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1532 }
jbauch5869f502017-06-29 12:31:36 -07001533};
1534
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001536template <>
Steve Anton8699a322017-11-06 15:53:33 -08001537std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001538 rtc::Thread* worker_thread,
1539 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001540 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001541 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001542 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001543 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001544 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001545 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001546 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001547 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions());
Anton Sukhanov98a462c2018-10-17 13:15:42 -07001548 channel->Init_w(rtp_transport, /*media_transport=*/nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549 return channel;
1550}
1551
1552// override to add 0 parameter
Yves Gerey665174f2018-06-19 15:03:05 +02001553template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554bool ChannelTest<VideoTraits>::AddStream1(int id) {
1555 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1556}
1557
Yves Gerey665174f2018-06-19 15:03:05 +02001558template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559void ChannelTest<VideoTraits>::CreateContent(
1560 int flags,
1561 const cricket::AudioCodec& audio_codec,
1562 const cricket::VideoCodec& video_codec,
1563 cricket::VideoContentDescription* video) {
1564 video->AddCodec(video_codec);
1565 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566}
1567
Yves Gerey665174f2018-06-19 15:03:05 +02001568template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569void ChannelTest<VideoTraits>::CopyContent(
1570 const cricket::VideoContentDescription& source,
1571 cricket::VideoContentDescription* video) {
1572 *video = source;
1573}
1574
Yves Gerey665174f2018-06-19 15:03:05 +02001575template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1577 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001578 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579}
1580
Peter Boström0c4e06b2015-10-07 12:23:21 +02001581template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001583 uint32_t ssrc,
1584 int flags,
1585 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586 video->AddLegacyStream(ssrc);
1587}
1588
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001589class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 public:
solenberg1dd98f32015-09-10 01:57:14 -07001591 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001592 VideoChannelSingleThreadTest()
1593 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594};
1595
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001596class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1597 public:
1598 typedef ChannelTest<VideoTraits> Base;
1599 VideoChannelDoubleThreadTest()
1600 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1601};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001603TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 Base::TestInit();
1605 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1606 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1607}
1608
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001609TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1610 Base::TestDeinit();
1611}
1612
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001613TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 Base::TestSetContents();
1615}
1616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001617TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 Base::TestSetContentsNullOffer();
1619}
1620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001621TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 Base::TestSetContentsRtcpMux();
1623}
1624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 Base::TestSetContentsRtcpMux();
1627}
1628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001629TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 Base::TestStreams();
1631}
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 Base::TestChangeStreamParamsInContent();
1635}
1636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001638 Base::TestPlayoutAndSendingStates();
1639}
1640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 Base::TestMediaContentDirection();
1643}
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001646 Base::TestNetworkRouteChanges();
1647}
1648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001649TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001650 Base::TestCallSetup();
1651}
1652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 Base::TestCallTeardownRtcpMux();
1655}
1656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001657TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 Base::SendRtpToRtp();
1659}
1660
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001661TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 Base::SendRtcpToRtcp();
1663}
1664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001666 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667}
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001670 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001671}
1672
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001673TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 Base::SendRtpToRtpOnThread();
1679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 Base::SendWithWritabilityLoss();
1683}
1684
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001685TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 Base::TestSetContentFailure();
1687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 Base::TestSendTwoOffers();
1691}
1692
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001693TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 Base::TestReceiveTwoOffers();
1695}
1696
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001697TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 Base::TestSendPrAnswer();
1699}
1700
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001701TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 Base::TestReceivePrAnswer();
1703}
1704
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001705TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 Base::TestFlushRtcp();
1707}
1708
zstein56162b92017-04-24 16:54:35 -07001709TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1710 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711}
1712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001714 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001718 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001719}
1720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001721TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001722 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001723}
1724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001726 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727}
1728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001729TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001730 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001731}
1732
Steve Anton8a63f782017-10-23 13:08:53 -07001733TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1734 Base::SocketOptionsMergedOnSetTransport();
1735}
1736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737// VoiceChannelDoubleThreadTest
1738TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1741 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742}
1743
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001744TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1745 Base::TestDeinit();
1746}
1747
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001748TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 Base::TestSetContents();
1750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753 Base::TestSetContentsNullOffer();
1754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 Base::TestSetContentsRtcpMux();
1758}
1759
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001760TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 Base::TestSetContentsRtcpMux();
1762}
1763
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 Base::TestStreams();
1766}
1767
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001768TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 Base::TestChangeStreamParamsInContent();
1770}
1771
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001772TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001773 Base::TestPlayoutAndSendingStates();
1774}
1775
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001776TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1777 Base::TestMediaContentDirection();
1778}
1779
1780TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1781 Base::TestNetworkRouteChanges();
1782}
1783
1784TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1785 Base::TestCallSetup();
1786}
1787
1788TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1789 Base::TestCallTeardownRtcpMux();
1790}
1791
1792TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1793 Base::SendRtpToRtp();
1794}
1795
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001796TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1797 Base::SendRtcpToRtcp();
1798}
1799
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001800TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001801 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001802}
1803
1804TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001805 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001806}
1807
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001808TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1809 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1810}
1811
1812TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1813 Base::SendRtpToRtpOnThread();
1814}
1815
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001816TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1817 Base::SendWithWritabilityLoss();
1818}
1819
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001820TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1821 Base::TestSetContentFailure();
1822}
1823
1824TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1825 Base::TestSendTwoOffers();
1826}
1827
1828TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1829 Base::TestReceiveTwoOffers();
1830}
1831
1832TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1833 Base::TestSendPrAnswer();
1834}
1835
1836TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1837 Base::TestReceivePrAnswer();
1838}
1839
1840TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1841 Base::TestFlushRtcp();
1842}
1843
zstein56162b92017-04-24 16:54:35 -07001844TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1845 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001846}
1847
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001848TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1849 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1850}
1851
1852TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1853 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1854}
1855
1856TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1857 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1858}
1859
1860TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1861 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1862}
1863
1864TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1865 Base::DefaultMaxBitrateIsUnlimited();
1866}
1867
Steve Anton8a63f782017-10-23 13:08:53 -07001868TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1869 Base::SocketOptionsMergedOnSetTransport();
1870}
1871
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001872// VideoChannelSingleThreadTest
1873TEST_F(VideoChannelSingleThreadTest, TestInit) {
1874 Base::TestInit();
1875}
1876
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001877TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1878 Base::TestDeinit();
1879}
1880
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001881TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1882 Base::TestSetContents();
1883}
1884
1885TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1886 Base::TestSetContentsNullOffer();
1887}
1888
1889TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1890 Base::TestSetContentsRtcpMux();
1891}
1892
1893TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1894 Base::TestSetContentsRtcpMux();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1898 Base::TestStreams();
1899}
1900
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001901TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1902 Base::TestChangeStreamParamsInContent();
1903}
1904
1905TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1906 Base::TestPlayoutAndSendingStates();
1907}
1908
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001909TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 Base::TestMediaContentDirection();
1911}
1912
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001913TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001914 Base::TestNetworkRouteChanges();
1915}
1916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918 Base::TestCallSetup();
1919}
1920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 Base::TestCallTeardownRtcpMux();
1923}
1924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001925TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 Base::SendRtpToRtp();
1927}
1928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001929TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930 Base::SendRtcpToRtcp();
1931}
1932
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001933TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001934 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935}
1936
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001937TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001938 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939}
1940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1943}
1944
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001945TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 Base::SendRtpToRtpOnThread();
1947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 Base::SendWithWritabilityLoss();
1951}
1952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001953TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 Base::TestSetContentFailure();
1955}
1956
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001957TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 Base::TestSendTwoOffers();
1959}
1960
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001961TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 Base::TestReceiveTwoOffers();
1963}
1964
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001965TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 Base::TestSendPrAnswer();
1967}
1968
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001969TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970 Base::TestReceivePrAnswer();
1971}
1972
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001973TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 Base::TestFlushRtcp();
1975}
1976
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001977TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001978 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979}
1980
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001981TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001982 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001983}
1984
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001985TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001986 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001987}
1988
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001989TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001990 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991}
1992
zstein56162b92017-04-24 16:54:35 -07001993TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1994 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001995}
1996
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001997TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001998 Base::DefaultMaxBitrateIsUnlimited();
1999}
2000
Steve Anton8a63f782017-10-23 13:08:53 -07002001TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2002 Base::SocketOptionsMergedOnSetTransport();
2003}
2004
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002005// VideoChannelDoubleThreadTest
2006TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2007 Base::TestInit();
2008}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002009
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002010TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2011 Base::TestDeinit();
2012}
2013
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002014TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2015 Base::TestSetContents();
2016}
2017
2018TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2019 Base::TestSetContentsNullOffer();
2020}
2021
2022TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2023 Base::TestSetContentsRtcpMux();
2024}
2025
2026TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2027 Base::TestSetContentsRtcpMux();
2028}
2029
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002030TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2031 Base::TestStreams();
2032}
2033
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002034TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2035 Base::TestChangeStreamParamsInContent();
2036}
2037
2038TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2039 Base::TestPlayoutAndSendingStates();
2040}
2041
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002042TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2043 Base::TestMediaContentDirection();
2044}
2045
2046TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2047 Base::TestNetworkRouteChanges();
2048}
2049
2050TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2051 Base::TestCallSetup();
2052}
2053
2054TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2055 Base::TestCallTeardownRtcpMux();
2056}
2057
2058TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2059 Base::SendRtpToRtp();
2060}
2061
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002062TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2063 Base::SendRtcpToRtcp();
2064}
2065
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002066TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002067 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002068}
2069
2070TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002071 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002072}
2073
2074TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2075 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2076}
2077
2078TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2079 Base::SendRtpToRtpOnThread();
2080}
2081
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002082TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2083 Base::SendWithWritabilityLoss();
2084}
2085
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002086TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2087 Base::TestSetContentFailure();
2088}
2089
2090TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2091 Base::TestSendTwoOffers();
2092}
2093
2094TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2095 Base::TestReceiveTwoOffers();
2096}
2097
2098TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2099 Base::TestSendPrAnswer();
2100}
2101
2102TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2103 Base::TestReceivePrAnswer();
2104}
2105
2106TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2107 Base::TestFlushRtcp();
2108}
2109
2110TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2111 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2112}
2113
2114TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2115 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2116}
2117
2118TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2119 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2120}
2121
2122TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2123 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2124}
2125
zstein56162b92017-04-24 16:54:35 -07002126TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2127 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002128}
2129
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002130TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2131 Base::DefaultMaxBitrateIsUnlimited();
2132}
2133
Steve Anton8a63f782017-10-23 13:08:53 -07002134TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2135 Base::SocketOptionsMergedOnSetTransport();
2136}
2137
deadbeef953c2ce2017-01-09 14:53:41 -08002138// RtpDataChannelSingleThreadTest
2139class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002140 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002141 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002142 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002143 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2144};
2145
deadbeef953c2ce2017-01-09 14:53:41 -08002146// RtpDataChannelDoubleThreadTest
2147class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002148 public:
2149 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002150 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002151 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152};
2153
2154// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002155template <>
Steve Anton8699a322017-11-06 15:53:33 -08002156std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002157 rtc::Thread* worker_thread,
2158 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002159 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002160 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002161 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002162 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002163 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002164 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002165 worker_thread, network_thread, signaling_thread, std::move(ch),
Benjamin Wrighta54daf12018-10-11 15:33:17 -07002166 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions());
Zhi Huange830e682018-03-30 10:48:35 -07002167 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002168 return channel;
2169}
2170
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002171template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172void ChannelTest<DataTraits>::CreateContent(
2173 int flags,
2174 const cricket::AudioCodec& audio_codec,
2175 const cricket::VideoCodec& video_codec,
2176 cricket::DataContentDescription* data) {
2177 data->AddCodec(kGoogleDataCodec);
2178 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179}
2180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002181template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002182void ChannelTest<DataTraits>::CopyContent(
2183 const cricket::DataContentDescription& source,
2184 cricket::DataContentDescription* data) {
2185 *data = source;
2186}
2187
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002188template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2190 const cricket::DataCodec& c2) {
2191 return c1.name == c2.name;
2192}
2193
Peter Boström0c4e06b2015-10-07 12:23:21 +02002194template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002196 uint32_t ssrc,
2197 int flags,
2198 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199 data->AddLegacyStream(ssrc);
2200}
2201
deadbeef953c2ce2017-01-09 14:53:41 -08002202TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203 Base::TestInit();
2204 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2205}
2206
deadbeef953c2ce2017-01-09 14:53:41 -08002207TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002208 Base::TestDeinit();
2209}
2210
deadbeef953c2ce2017-01-09 14:53:41 -08002211TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 Base::TestSetContents();
2213}
2214
deadbeef953c2ce2017-01-09 14:53:41 -08002215TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216 Base::TestSetContentsNullOffer();
2217}
2218
deadbeef953c2ce2017-01-09 14:53:41 -08002219TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 Base::TestSetContentsRtcpMux();
2221}
2222
deadbeef953c2ce2017-01-09 14:53:41 -08002223TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224 Base::TestStreams();
2225}
2226
deadbeef953c2ce2017-01-09 14:53:41 -08002227TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228 Base::TestChangeStreamParamsInContent();
2229}
2230
deadbeef953c2ce2017-01-09 14:53:41 -08002231TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232 Base::TestPlayoutAndSendingStates();
2233}
2234
deadbeef953c2ce2017-01-09 14:53:41 -08002235TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002236 Base::TestMediaContentDirection();
2237}
2238
deadbeef953c2ce2017-01-09 14:53:41 -08002239TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 Base::TestCallSetup();
2241}
2242
deadbeef953c2ce2017-01-09 14:53:41 -08002243TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244 Base::TestCallTeardownRtcpMux();
2245}
2246
zstein56162b92017-04-24 16:54:35 -07002247TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2248 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249}
2250
deadbeef953c2ce2017-01-09 14:53:41 -08002251TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252 Base::SendRtpToRtp();
2253}
2254
deadbeef953c2ce2017-01-09 14:53:41 -08002255TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 Base::SendRtcpToRtcp();
2257}
2258
deadbeef953c2ce2017-01-09 14:53:41 -08002259TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260 Base::SendRtpToRtpOnThread();
2261}
2262
deadbeef953c2ce2017-01-09 14:53:41 -08002263TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264 Base::SendWithWritabilityLoss();
2265}
2266
Steve Anton8a63f782017-10-23 13:08:53 -07002267TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2268 Base::SocketOptionsMergedOnSetTransport();
2269}
2270
deadbeef953c2ce2017-01-09 14:53:41 -08002271TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002272 CreateChannels(0, 0);
2273 EXPECT_TRUE(SendInitiate());
2274 EXPECT_TRUE(SendAccept());
2275
2276 cricket::SendDataParams params;
2277 params.ssrc = 42;
2278 unsigned char data[] = {'f', 'o', 'o'};
2279 rtc::CopyOnWriteBuffer payload(data, 3);
2280 cricket::SendDataResult result;
2281 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2282 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2283 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2284}
2285
deadbeef953c2ce2017-01-09 14:53:41 -08002286TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287 Base::TestInit();
2288 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2289}
2290
deadbeef953c2ce2017-01-09 14:53:41 -08002291TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002292 Base::TestDeinit();
2293}
2294
deadbeef953c2ce2017-01-09 14:53:41 -08002295TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002296 Base::TestSetContents();
2297}
2298
deadbeef953c2ce2017-01-09 14:53:41 -08002299TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002300 Base::TestSetContentsNullOffer();
2301}
2302
deadbeef953c2ce2017-01-09 14:53:41 -08002303TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002304 Base::TestSetContentsRtcpMux();
2305}
2306
deadbeef953c2ce2017-01-09 14:53:41 -08002307TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308 Base::TestStreams();
2309}
2310
deadbeef953c2ce2017-01-09 14:53:41 -08002311TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002312 Base::TestChangeStreamParamsInContent();
2313}
2314
deadbeef953c2ce2017-01-09 14:53:41 -08002315TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002316 Base::TestPlayoutAndSendingStates();
2317}
2318
deadbeef953c2ce2017-01-09 14:53:41 -08002319TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002320 Base::TestMediaContentDirection();
2321}
2322
deadbeef953c2ce2017-01-09 14:53:41 -08002323TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002324 Base::TestCallSetup();
2325}
2326
deadbeef953c2ce2017-01-09 14:53:41 -08002327TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002328 Base::TestCallTeardownRtcpMux();
2329}
2330
zstein56162b92017-04-24 16:54:35 -07002331TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2332 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002333}
2334
deadbeef953c2ce2017-01-09 14:53:41 -08002335TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002336 Base::SendRtpToRtp();
2337}
2338
deadbeef953c2ce2017-01-09 14:53:41 -08002339TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002340 Base::SendRtcpToRtcp();
2341}
2342
deadbeef953c2ce2017-01-09 14:53:41 -08002343TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002344 Base::SendRtpToRtpOnThread();
2345}
2346
deadbeef953c2ce2017-01-09 14:53:41 -08002347TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002348 Base::SendWithWritabilityLoss();
2349}
2350
Steve Anton8a63f782017-10-23 13:08:53 -07002351TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2352 Base::SocketOptionsMergedOnSetTransport();
2353}
2354
deadbeef953c2ce2017-01-09 14:53:41 -08002355TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 CreateChannels(0, 0);
2357 EXPECT_TRUE(SendInitiate());
2358 EXPECT_TRUE(SendAccept());
2359
2360 cricket::SendDataParams params;
2361 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002362 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002363 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364 cricket::SendDataResult result;
2365 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002366 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2368}
2369
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370// TODO(pthatcher): TestSetReceiver?