blob: c398f07263c2daa37dda48191c0af7810b0c26b7 [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"
18#include "media/base/testutils.h"
19#include "p2p/base/fakecandidatepair.h"
20#include "p2p/base/fakedtlstransport.h"
21#include "p2p/base/fakepackettransport.h"
22#include "pc/channel.h"
23#include "rtc_base/buffer.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/fakeclock.h"
26#include "rtc_base/gunit.h"
27#include "rtc_base/logging.h"
28#include "rtc_base/sslstreamadapter.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
zhihuangb2cdd932017-01-19 16:54:25 -080030using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031using cricket::FakeVoiceMediaChannel;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080033using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080034using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Danil Chapovalov33b01f22016-05-11 19:55:27 +020036namespace {
37const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
38const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070040const cricket::VideoCodec kH264Codec(97, "H264");
41const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020042const cricket::DataCodec kGoogleDataCodec(101, "google-data");
43const uint32_t kSsrc1 = 0x1111;
44const uint32_t kSsrc2 = 0x2222;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020045const int kAudioPts[] = {0, 8};
46const int kVideoPts[] = {97, 99};
47enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010048
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
deadbeefcbecd352015-09-23 11:50:27 -070051template <class ChannelT,
52 class MediaChannelT,
53 class ContentT,
54 class CodecT,
55 class MediaInfoT,
56 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057class Traits {
58 public:
59 typedef ChannelT Channel;
60 typedef MediaChannelT MediaChannel;
61 typedef ContentT Content;
62 typedef CodecT Codec;
63 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020064 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065};
66
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067class VoiceTraits : public Traits<cricket::VoiceChannel,
68 cricket::FakeVoiceMediaChannel,
69 cricket::AudioContentDescription,
70 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020071 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070072 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073
74class VideoTraits : public Traits<cricket::VideoChannel,
75 cricket::FakeVideoMediaChannel,
76 cricket::VideoContentDescription,
77 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020078 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070079 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080
deadbeef953c2ce2017-01-09 14:53:41 -080081class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 cricket::FakeDataMediaChannel,
83 cricket::DataContentDescription,
84 cricket::DataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020085 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070086 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087
deadbeef953c2ce2017-01-09 14:53:41 -080088// Base class for Voice/Video/RtpDataChannel tests
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089template<class T>
90class ChannelTest : public testing::Test, public sigslot::has_slots<> {
91 public:
deadbeefac22f702017-01-12 21:59:29 -080092 enum Flags {
93 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -080094 SSRC_MUX = 0x8,
95 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -080096 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -080097 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -070098 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -080099 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100
Peter Boström34fbfff2015-09-24 19:20:30 +0200101 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200102 rtc::ArrayView<const uint8_t> rtp_data,
103 rtc::ArrayView<const uint8_t> rtcp_data,
104 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200105 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200106 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800107 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200108 if (network_is_worker == NetworkIsWorker::Yes) {
109 network_thread_ = rtc::Thread::Current();
110 } else {
111 network_thread_keeper_ = rtc::Thread::Create();
112 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200113 network_thread_ = network_thread_keeper_.get();
114 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200115 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117 void CreateChannels(int flags1, int flags2) {
Steve Anton8699a322017-11-06 15:53:33 -0800118 CreateChannels(rtc::MakeUnique<typename T::MediaChannel>(
119 nullptr, typename T::Options()),
120 rtc::MakeUnique<typename T::MediaChannel>(
121 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
Steve Anton8699a322017-11-06 15:53:33 -0800124 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
125 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200126 int flags1,
127 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800128 // Network thread is started in CreateChannels, to allow the test to
129 // configure a fake clock before any threads are spawned and attempt to
130 // access the time.
131 if (network_thread_keeper_) {
132 network_thread_keeper_->Start();
133 }
Zhi Huange830e682018-03-30 10:48:35 -0700134
deadbeeff5346592017-01-24 21:51:21 -0800135 // Make sure if using raw packet transports, they're used for both
136 // channels.
137 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800139 media_channel1_ = ch1.get();
140 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800141 rtc::PacketTransportInternal* rtp1 = nullptr;
142 rtc::PacketTransportInternal* rtcp1 = nullptr;
143 rtc::PacketTransportInternal* rtp2 = nullptr;
144 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800145 // Based on flags, create fake DTLS or raw packet transports.
146 if (flags1 & RAW_PACKET_TRANSPORT) {
147 fake_rtp_packet_transport1_.reset(
148 new rtc::FakePacketTransport("channel1_rtp"));
149 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700150 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800151 fake_rtcp_packet_transport1_.reset(
152 new rtc::FakePacketTransport("channel1_rtcp"));
153 rtcp1 = fake_rtcp_packet_transport1_.get();
154 }
155 } else {
156 // Confirmed to work with KT_RSA and KT_ECDSA.
157 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
158 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
159 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700160 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800161 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
162 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
163 rtcp1 = fake_rtcp_dtls_transport1_.get();
164 }
165 if (flags1 & DTLS) {
166 auto cert1 =
167 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
168 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
169 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
170 if (fake_rtcp_dtls_transport1_) {
171 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
172 }
173 }
174 }
175 // Based on flags, create fake DTLS or raw packet transports.
176 if (flags2 & RAW_PACKET_TRANSPORT) {
177 fake_rtp_packet_transport2_.reset(
178 new rtc::FakePacketTransport("channel2_rtp"));
179 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700180 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800181 fake_rtcp_packet_transport2_.reset(
182 new rtc::FakePacketTransport("channel2_rtcp"));
183 rtcp2 = fake_rtcp_packet_transport2_.get();
184 }
185 } else {
186 // Confirmed to work with KT_RSA and KT_ECDSA.
187 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
188 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
189 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700190 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800191 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
192 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
193 rtcp2 = fake_rtcp_dtls_transport2_.get();
194 }
195 if (flags2 & DTLS) {
196 auto cert2 =
197 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
198 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
199 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
200 if (fake_rtcp_dtls_transport2_) {
201 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
202 }
203 }
204 }
Zhi Huange830e682018-03-30 10:48:35 -0700205 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
206 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
207 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
208 flags1);
209 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
210 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
211 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
212 flags2);
213
214 channel1_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
215 std::move(ch1), rtp_transport1_.get(), flags1);
216 channel2_ = CreateChannel(worker_thread, network_thread_, &media_engine_,
217 std::move(ch2), rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800218 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800219 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800220 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800221 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 CreateContent(flags1, kPcmuCodec, kH264Codec,
223 &local_media_content1_);
224 CreateContent(flags2, kPcmuCodec, kH264Codec,
225 &local_media_content2_);
226 CopyContent(local_media_content1_, &remote_media_content1_);
227 CopyContent(local_media_content2_, &remote_media_content2_);
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 // Add stream information (SSRC) to the local content but not to the remote
230 // content. This means that we per default know the SSRC of what we send but
231 // not what we receive.
232 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
233 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
234
235 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
236 if (flags1 & SSRC_MUX) {
237 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
238 }
239 if (flags2 & SSRC_MUX) {
240 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
241 }
Zhi Huange830e682018-03-30 10:48:35 -0700242
243 if (!(flags1 & DTLS)) {
244 channel1_->DisableEncryption(true);
245 }
246 if (!(flags2 & DTLS)) {
247 channel2_->DisableEncryption(true);
248 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249 }
Steve Anton8699a322017-11-06 15:53:33 -0800250 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 rtc::Thread* worker_thread,
252 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700253 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -0800254 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700255 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700256 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800257 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800258 auto channel = rtc::MakeUnique<typename T::Channel>(
259 worker_thread, network_thread, signaling_thread, engine, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -0700260 cricket::CN_AUDIO, (flags & DTLS) != 0, rtc::CryptoOptions());
261 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000262 return channel;
263 }
264
Zhi Huange830e682018-03-30 10:48:35 -0700265 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
266 rtc::PacketTransportInternal* rtp_packet_transport,
267 rtc::PacketTransportInternal* rtcp_packet_transport,
268 DtlsTransportInternal* rtp_dtls_transport,
269 DtlsTransportInternal* rtcp_dtls_transport,
270 int flags) {
271 if (flags & RTCP_MUX) {
272 rtcp_packet_transport = nullptr;
273 rtcp_dtls_transport = nullptr;
274 }
275
276 if (flags & DTLS) {
277 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
278 } else {
279 if (flags & RAW_PACKET_TRANSPORT) {
280 return CreateUnencryptedTransport(rtp_packet_transport,
281 rtcp_packet_transport);
282 } else {
283 return CreateUnencryptedTransport(rtp_dtls_transport,
284 rtcp_dtls_transport);
285 }
286 }
287 }
288
289 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
290 rtc::PacketTransportInternal* rtp_packet_transport,
291 rtc::PacketTransportInternal* rtcp_packet_transport) {
292 bool rtcp_mux_enabled = (rtcp_packet_transport == nullptr);
293 auto rtp_transport =
294 rtc::MakeUnique<webrtc::RtpTransport>(rtcp_mux_enabled);
295
296 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
297 if (rtcp_packet_transport) {
298 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
299 }
300 return rtp_transport;
301 }
302
303 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
304 cricket::DtlsTransportInternal* rtp_dtls_transport,
305 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
306 bool rtcp_mux_enabled = (rtcp_dtls_transport == nullptr);
307 auto srtp_transport =
308 rtc::MakeUnique<webrtc::SrtpTransport>(rtcp_mux_enabled);
309 auto dtls_srtp_transport =
310 rtc::MakeUnique<webrtc::DtlsSrtpTransport>(std::move(srtp_transport));
311
312 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
313 rtcp_dtls_transport);
314 return dtls_srtp_transport;
315 }
316
deadbeeff5346592017-01-24 21:51:21 -0800317 void ConnectFakeTransports() {
318 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
319 bool asymmetric = false;
320 // Depending on test flags, could be using DTLS or raw packet transport.
321 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
322 fake_rtp_dtls_transport1_->SetDestination(
323 fake_rtp_dtls_transport2_.get(), asymmetric);
324 }
325 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
326 fake_rtcp_dtls_transport1_->SetDestination(
327 fake_rtcp_dtls_transport2_.get(), asymmetric);
328 }
329 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
330 fake_rtp_packet_transport1_->SetDestination(
331 fake_rtp_packet_transport2_.get(), asymmetric);
332 }
333 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
334 fake_rtcp_packet_transport1_->SetDestination(
335 fake_rtcp_packet_transport2_.get(), asymmetric);
336 }
337 });
338 }
339
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000340 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000341 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800342 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 if (result) {
344 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000345 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800346 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000347 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800348 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800350 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 }
352 }
353 return result;
354 }
355
356 bool SendAccept() {
357 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800359 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 }
361
362 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000363 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800364 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000365 if (result) {
366 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800368 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 }
370 return result;
371 }
372
373 bool SendProvisionalAnswer() {
374 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800375 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 if (result) {
377 channel2_->Enable(true);
378 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800379 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800380 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 }
382 return result;
383 }
384
385 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000386 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800387 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000388 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000389 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800390 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 return result;
392 }
393
deadbeeff5346592017-01-24 21:51:21 -0800394 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 channel1_.reset();
396 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800397 fake_rtp_dtls_transport1_.reset();
398 fake_rtcp_dtls_transport1_.reset();
399 fake_rtp_dtls_transport2_.reset();
400 fake_rtcp_dtls_transport2_.reset();
401 fake_rtp_packet_transport1_.reset();
402 fake_rtcp_packet_transport1_.reset();
403 fake_rtp_packet_transport2_.reset();
404 fake_rtcp_packet_transport2_.reset();
405 if (network_thread_keeper_) {
406 network_thread_keeper_.reset();
407 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 return true;
409 }
410
411 bool AddStream1(int id) {
412 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
413 }
414 bool RemoveStream1(int id) {
415 return channel1_->RemoveRecvStream(id);
416 }
417
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200418 void SendRtp1() {
419 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
420 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422 void SendRtp2() {
423 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
424 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 void SendRtcp1() {
427 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 void SendRtcp2() {
430 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
432 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
434 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
435 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200437 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
438 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
439 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200441 void SendCustomRtcp1(uint32_t ssrc) {
442 rtc::Buffer data = CreateRtcpData(ssrc);
443 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 void SendCustomRtcp2(uint32_t ssrc) {
446 rtc::Buffer data = CreateRtcpData(ssrc);
447 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200457 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
459 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200460 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 }
462 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200463 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200464 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
465 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200467 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200468 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
469 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200471 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200472 rtc::Buffer data = CreateRtcpData(ssrc);
473 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200475 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Buffer data = CreateRtcpData(ssrc);
477 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
480 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::SetBE32(data.data() + 8, ssrc);
483 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000484 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200485 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000486 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 return data;
488 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
490 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200492 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 return data;
494 }
495
496 bool CheckNoRtp1() {
497 return media_channel1_->CheckNoRtp();
498 }
499 bool CheckNoRtp2() {
500 return media_channel2_->CheckNoRtp();
501 }
502 bool CheckNoRtcp1() {
503 return media_channel1_->CheckNoRtcp();
504 }
505 bool CheckNoRtcp2() {
506 return media_channel2_->CheckNoRtcp();
507 }
508
509 void CreateContent(int flags,
510 const cricket::AudioCodec& audio_codec,
511 const cricket::VideoCodec& video_codec,
512 typename T::Content* content) {
513 // overridden in specialized classes
514 }
515 void CopyContent(const typename T::Content& source,
516 typename T::Content* content) {
517 // overridden in specialized classes
518 }
519
Steve Anton18ee1d52017-09-11 11:32:35 -0700520 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700522 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
523 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700524 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700525 AddLegacyStreamInContent(ssrc, 0, content);
526 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 }
528
ossu292d6582016-03-17 02:31:13 -0700529 // Will manage the lifetime of a CallThread, making sure it's
530 // destroyed before this object goes out of scope.
531 class ScopedCallThread {
532 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 template <class FunctorT>
Steve Anton36b29d12017-10-30 09:57:42 -0700534 explicit ScopedCallThread(const FunctorT& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200535 : thread_(rtc::Thread::Create()),
536 task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
ossu292d6582016-03-17 02:31:13 -0700537 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700538 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700539 }
540
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200541 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700542
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200543 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700544
545 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200546 std::unique_ptr<rtc::Thread> thread_;
547 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700548 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
551 return false; // overridden in specialized classes
552 }
553
deadbeeff5346592017-01-24 21:51:21 -0800554 void OnRtcpMuxFullyActive1(const std::string&) {
555 rtcp_mux_activated_callbacks1_++;
556 }
557 void OnRtcpMuxFullyActive2(const std::string&) {
558 rtcp_mux_activated_callbacks2_++;
559 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560
Honghai Zhangcc411c02016-03-29 17:27:21 -0700561 cricket::CandidatePairInterface* last_selected_candidate_pair() {
562 return last_selected_candidate_pair_;
563 }
564
Peter Boström0c4e06b2015-10-07 12:23:21 +0200565 void AddLegacyStreamInContent(uint32_t ssrc,
566 int flags,
567 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Base implementation.
569 }
570
571 // Tests that can be used by derived classes.
572
573 // Basic sanity check.
574 void TestInit() {
575 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700576 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200578 if (verify_playout_) {
579 EXPECT_FALSE(media_channel1_->playout());
580 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_TRUE(media_channel1_->codecs().empty());
582 EXPECT_TRUE(media_channel1_->recv_streams().empty());
583 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
584 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly configure
588 // the codecs.
589 void TestSetContents() {
590 CreateChannels(0, 0);
591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800593 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800595 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 ASSERT_EQ(1U, media_channel1_->codecs().size());
597 EXPECT_TRUE(CodecMatches(content.codecs()[0],
598 media_channel1_->codecs()[0]));
599 }
600
601 // Test that SetLocalContent and SetRemoteContent properly deals
602 // with an empty offer.
603 void TestSetContentsNullOffer() {
604 CreateChannels(0, 0);
605 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800606 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 CreateContent(0, kPcmuCodec, kH264Codec, &content);
608 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800609 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 ASSERT_EQ(1U, media_channel1_->codecs().size());
611 EXPECT_TRUE(CodecMatches(content.codecs()[0],
612 media_channel1_->codecs()[0]));
613 }
614
615 // Test that SetLocalContent and SetRemoteContent properly set RTCP
616 // mux.
617 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800618 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 typename T::Content content;
620 CreateContent(0, kPcmuCodec, kH264Codec, &content);
621 // Both sides agree on mux. Should no longer be a separate RTCP channel.
622 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800623 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
624 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800626 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800628 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 }
630
631 // Test that SetLocalContent and SetRemoteContent properly set RTCP
632 // mux when a provisional answer is received.
633 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800634 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 typename T::Content content;
636 CreateContent(0, kPcmuCodec, kH264Codec, &content);
637 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800638 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
639 EXPECT_TRUE(
640 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800641 // Both sides agree on mux. Should signal RTCP mux as fully activated.
642 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800644 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800646 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800648 EXPECT_TRUE(
649 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
650 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800651 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 }
653
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Test that Add/RemoveStream properly forward to the media channel.
655 void TestStreams() {
656 CreateChannels(0, 0);
657 EXPECT_TRUE(AddStream1(1));
658 EXPECT_TRUE(AddStream1(2));
659 EXPECT_EQ(2U, media_channel1_->recv_streams().size());
660 EXPECT_TRUE(RemoveStream1(2));
661 EXPECT_EQ(1U, media_channel1_->recv_streams().size());
662 EXPECT_TRUE(RemoveStream1(1));
663 EXPECT_EQ(0U, media_channel1_->recv_streams().size());
664 }
665
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Test that SetLocalContent and SetRemoteContent properly
667 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800668 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 void TestChangeStreamParamsInContent() {
670 cricket::StreamParams stream1;
671 stream1.groupid = "group1";
672 stream1.id = "stream1";
673 stream1.ssrcs.push_back(kSsrc1);
674 stream1.cname = "stream1_cname";
675
676 cricket::StreamParams stream2;
677 stream2.groupid = "group1";
678 stream2.id = "stream2";
679 stream2.ssrcs.push_back(kSsrc2);
680 stream2.cname = "stream2_cname";
681
682 // Setup a call where channel 1 send |stream1| to channel 2.
683 CreateChannels(0, 0);
684 typename T::Content content1;
685 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
686 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800687 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(channel1_->Enable(true));
689 EXPECT_EQ(1u, media_channel1_->send_streams().size());
690
Steve Anton3828c062017-12-06 10:34:51 -0800691 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800693 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // Channel 2 do not send anything.
696 typename T::Content content2;
697 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800698 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_TRUE(channel2_->Enable(true));
702 EXPECT_EQ(0u, media_channel2_->send_streams().size());
703
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200704 SendCustomRtp1(kSsrc1, 0);
705 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
707
708 // Let channel 2 update the content by sending |stream2| and enable SRTP.
709 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700710 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800712 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 ASSERT_EQ(1u, media_channel2_->send_streams().size());
714 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
715
Steve Anton3828c062017-12-06 10:34:51 -0800716 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
718 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
719
720 // Channel 1 replies but stop sending stream1.
721 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700722 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800723 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(0u, media_channel1_->send_streams().size());
725
Steve Anton3828c062017-12-06 10:34:51 -0800726 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
728
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200729 SendCustomRtp2(kSsrc2, 0);
730 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
732 }
733
734 // Test that we only start playout and sending at the right times.
735 void TestPlayoutAndSendingStates() {
736 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200737 if (verify_playout_) {
738 EXPECT_FALSE(media_channel1_->playout());
739 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200741 if (verify_playout_) {
742 EXPECT_FALSE(media_channel2_->playout());
743 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_FALSE(media_channel2_->sending());
745 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200746 if (verify_playout_) {
747 EXPECT_FALSE(media_channel1_->playout());
748 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000750 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800751 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200752 if (verify_playout_) {
753 EXPECT_TRUE(media_channel1_->playout());
754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000756 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800757 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200758 if (verify_playout_) {
759 EXPECT_FALSE(media_channel2_->playout());
760 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800763 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200764 if (verify_playout_) {
765 EXPECT_FALSE(media_channel2_->playout());
766 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800768 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200769 if (verify_playout_) {
770 EXPECT_TRUE(media_channel1_->playout());
771 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_FALSE(media_channel2_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_FALSE(media_channel2_->sending());
777 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_TRUE(media_channel2_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800783 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200784 if (verify_playout_) {
785 EXPECT_TRUE(media_channel1_->playout());
786 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 EXPECT_TRUE(media_channel1_->sending());
788 }
789
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 // Test that changing the MediaContentDirection in the local and remote
791 // session description start playout and sending at the right time.
792 void TestMediaContentDirection() {
793 CreateChannels(0, 0);
794 typename T::Content content1;
795 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
796 typename T::Content content2;
797 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
798 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800799 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 EXPECT_TRUE(channel1_->Enable(true));
802 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 if (verify_playout_) {
804 EXPECT_FALSE(media_channel1_->playout());
805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200807 if (verify_playout_) {
808 EXPECT_FALSE(media_channel2_->playout());
809 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 EXPECT_FALSE(media_channel2_->sending());
811
Steve Anton3828c062017-12-06 10:34:51 -0800812 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
813 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
814 EXPECT_TRUE(
815 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
816 EXPECT_TRUE(
817 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800818 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819
Peter Boström34fbfff2015-09-24 19:20:30 +0200820 if (verify_playout_) {
821 EXPECT_TRUE(media_channel1_->playout());
822 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200824 if (verify_playout_) {
825 EXPECT_FALSE(media_channel2_->playout()); // local InActive
826 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 EXPECT_FALSE(media_channel2_->sending()); // local InActive
828
829 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800830 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800831 EXPECT_TRUE(
832 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
833 EXPECT_TRUE(
834 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835
Peter Boström34fbfff2015-09-24 19:20:30 +0200836 if (verify_playout_) {
837 EXPECT_TRUE(media_channel1_->playout());
838 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200840 if (verify_playout_) {
841 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
842 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
844
845 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800846 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800847 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
848 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849
Peter Boström34fbfff2015-09-24 19:20:30 +0200850 if (verify_playout_) {
851 EXPECT_TRUE(media_channel1_->playout());
852 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200854 if (verify_playout_) {
855 EXPECT_TRUE(media_channel2_->playout());
856 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_TRUE(media_channel2_->sending());
858 }
859
Honghai Zhangcc411c02016-03-29 17:27:21 -0700860 // Tests that when the transport channel signals a candidate pair change
861 // event, the media channel will receive a call on the network route change.
862 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700863 static constexpr uint16_t kLocalNetId = 1;
864 static constexpr uint16_t kRemoteNetId = 2;
865 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800866 // Ipv4(20) + UDP(8).
867 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800868 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200869
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800870 CreateChannels(DTLS, DTLS);
871 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700872
Honghai Zhangcc411c02016-03-29 17:27:21 -0700873 typename T::MediaChannel* media_channel1 =
874 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200875 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700876
Zhi Huang942bc2e2017-11-13 13:26:07 -0800877 // Need to wait for the threads before calling
878 // |set_num_network_route_changes| because the network route would be set
879 // when creating the channel.
880 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200881 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800882 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800883 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800885 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
886
887 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200888 });
889 WaitForThreads();
890 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700891 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200892 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700893
eladalon05b07bb2017-08-24 07:40:16 -0700894 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800895 rtc::NetworkRoute network_route;
896 network_route.connected = true;
897 network_route.local_network_id = kLocalNetId;
898 network_route.remote_network_id = kRemoteNetId;
899 network_route.last_sent_packet_id = kLastPacketId;
900 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800902 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
903
904 rtc::Optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200905 });
906 WaitForThreads();
907 EXPECT_EQ(1, media_channel1->num_network_route_changes());
honghaiz059e1832016-06-24 11:03:55 -0700908 rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200909 kLastPacketId);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700910 EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200911 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700912 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800913 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800914 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700915 }
916
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 // Test setting up a call.
918 void TestCallSetup() {
919 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700920 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200922 if (verify_playout_) {
923 EXPECT_TRUE(media_channel1_->playout());
924 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925 EXPECT_FALSE(media_channel1_->sending());
926 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700927 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_TRUE(media_channel1_->sending());
929 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200930 if (verify_playout_) {
931 EXPECT_TRUE(media_channel2_->playout());
932 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 EXPECT_TRUE(media_channel2_->sending());
934 EXPECT_EQ(1U, media_channel2_->codecs().size());
935 }
936
937 // Test that we don't crash if packets are sent during call teardown
938 // when RTCP mux is enabled. This is a regression test against a specific
939 // race condition that would only occur when a RTCP packet was sent during
940 // teardown of a channel on which RTCP mux was enabled.
941 void TestCallTeardownRtcpMux() {
942 class LastWordMediaChannel : public T::MediaChannel {
943 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200944 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700946 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
947 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
949 }
950 };
Steve Anton8699a322017-11-06 15:53:33 -0800951 CreateChannels(rtc::MakeUnique<LastWordMediaChannel>(),
952 rtc::MakeUnique<LastWordMediaChannel>(), RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 EXPECT_TRUE(SendInitiate());
954 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800955 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 }
957
958 // Send voice RTP data to the other side and ensure it gets there.
959 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700960 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 EXPECT_TRUE(SendInitiate());
962 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700963 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
964 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200965 SendRtp1();
966 SendRtp2();
967 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 EXPECT_TRUE(CheckRtp1());
969 EXPECT_TRUE(CheckRtp2());
970 EXPECT_TRUE(CheckNoRtp1());
971 EXPECT_TRUE(CheckNoRtp2());
972 }
973
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200974 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800975 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200976 EXPECT_TRUE(SendInitiate());
977 EXPECT_TRUE(SendAccept());
978 SendRtp1();
979 SendRtp2();
980 SendRtcp1();
981 SendRtcp2();
982 // Do not wait, destroy channels.
983 channel1_.reset(nullptr);
984 channel2_.reset(nullptr);
985 }
986
deadbeefac22f702017-01-12 21:59:29 -0800987 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -0800989 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 EXPECT_TRUE(SendInitiate());
991 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -0700992 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
993 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200994 SendRtcp1();
995 SendRtcp2();
996 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 EXPECT_TRUE(CheckRtcp1());
998 EXPECT_TRUE(CheckRtcp2());
999 EXPECT_TRUE(CheckNoRtcp1());
1000 EXPECT_TRUE(CheckNoRtcp2());
1001 }
1002
Zhi Huange830e682018-03-30 10:48:35 -07001003 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1004 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001005 EXPECT_FALSE(channel1_->srtp_active());
1006 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001008 WaitForThreads();
1009 EXPECT_TRUE(channel1_->writable());
1010 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001012 EXPECT_TRUE(channel1_->srtp_active());
1013 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001014 SendRtp1();
1015 SendRtp2();
1016 SendRtcp1();
1017 SendRtcp2();
1018 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 EXPECT_TRUE(CheckRtp1());
1020 EXPECT_TRUE(CheckRtp2());
1021 EXPECT_TRUE(CheckNoRtp1());
1022 EXPECT_TRUE(CheckNoRtp2());
1023 EXPECT_TRUE(CheckRtcp1());
1024 EXPECT_TRUE(CheckRtcp2());
1025 EXPECT_TRUE(CheckNoRtcp1());
1026 EXPECT_TRUE(CheckNoRtcp2());
1027 }
1028
1029 // Test that we can send and receive early media when a provisional answer is
1030 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1031 void SendEarlyMediaUsingRtcpMuxSrtp() {
1032 int sequence_number1_1 = 0, sequence_number2_2 = 0;
1033
Zhi Huange830e682018-03-30 10:48:35 -07001034 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 EXPECT_TRUE(SendOffer());
1036 EXPECT_TRUE(SendProvisionalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001037 EXPECT_TRUE(channel1_->srtp_active());
1038 EXPECT_TRUE(channel2_->srtp_active());
Zhi Huange830e682018-03-30 10:48:35 -07001039 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1040 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001041 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1042 SendCustomRtcp1(kSsrc1);
1043 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1044 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1047
1048 // Send packets from callee and verify that it is received.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001049 SendCustomRtcp2(kSsrc2);
1050 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1051 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1054
1055 // Complete call setup and ensure everything is still OK.
1056 EXPECT_TRUE(SendFinalAnswer());
Zhi Huangcf990f52017-09-22 12:12:30 -07001057 EXPECT_TRUE(channel1_->srtp_active());
1058 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001059 SendCustomRtcp1(kSsrc1);
1060 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1061 SendCustomRtcp2(kSsrc2);
1062 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1063 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1068 }
1069
1070 // Test that we properly send RTP without SRTP from a thread.
1071 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001072 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001073 EXPECT_TRUE(SendInitiate());
1074 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001075 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1076 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1077 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1078 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1079 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1080 send_rtcp1.thread(),
1081 send_rtcp2.thread()};
1082 WaitForThreads(involved_threads);
1083 EXPECT_TRUE(CheckRtp1());
1084 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 EXPECT_TRUE(CheckNoRtp1());
1086 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001087 EXPECT_TRUE(CheckRtcp1());
1088 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089 EXPECT_TRUE(CheckNoRtcp1());
1090 EXPECT_TRUE(CheckNoRtcp2());
1091 }
1092
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 // Test that the mediachannel retains its sending state after the transport
1094 // becomes non-writable.
1095 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001096 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_TRUE(SendInitiate());
1098 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001099 EXPECT_EQ(nullptr, channel1_->rtcp_packet_transport());
1100 EXPECT_EQ(nullptr, channel2_->rtcp_packet_transport());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001101 SendRtp1();
1102 SendRtp2();
1103 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_TRUE(CheckRtp1());
1105 EXPECT_TRUE(CheckRtp2());
1106 EXPECT_TRUE(CheckNoRtp1());
1107 EXPECT_TRUE(CheckNoRtp2());
1108
wu@webrtc.org97077a32013-10-25 21:18:33 +00001109 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001110 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1111 fake_rtp_dtls_transport1_->SetWritable(false);
1112 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001113 SendRtp1();
1114 SendRtp2();
1115 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 EXPECT_TRUE(CheckRtp1());
1117 EXPECT_TRUE(CheckNoRtp2());
1118
1119 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001120 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1121 fake_rtp_dtls_transport1_->SetWritable(true);
1122 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001124 SendRtp1();
1125 SendRtp2();
1126 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 EXPECT_TRUE(CheckRtp1());
1128 EXPECT_TRUE(CheckRtp2());
1129 EXPECT_TRUE(CheckNoRtp1());
1130 EXPECT_TRUE(CheckNoRtp2());
1131
1132 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001133 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1134 bool asymmetric = true;
1135 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1136 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 EXPECT_TRUE(media_channel1_->sending());
1138
wu@webrtc.org97077a32013-10-25 21:18:33 +00001139 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001140 SendRtp1();
1141 SendRtp2();
1142 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 EXPECT_TRUE(CheckRtp1());
1144 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001145 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146
1147 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001148 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001149 bool asymmetric = true;
1150 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1151 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001152 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001154 SendRtp1();
1155 SendRtp2();
1156 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157 EXPECT_TRUE(CheckRtp1());
1158 EXPECT_TRUE(CheckRtp2());
1159 EXPECT_TRUE(CheckNoRtp1());
1160 EXPECT_TRUE(CheckNoRtp2());
1161 }
1162
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001163 void SendBundleToBundle(
1164 const int* pl_types, int len, bool rtcp_mux, bool secure) {
1165 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001167 // Only pl_type1 was added to the bundle filter for both |channel1_|
1168 // and |channel2_|.
1169 int pl_type1 = pl_types[0];
1170 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001171 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001172 if (secure)
1173 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001174 if (rtcp_mux) {
1175 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001176 }
1177 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 EXPECT_TRUE(SendAccept());
Zhi Huang95e7dbb2018-03-29 00:08:03 +00001180 EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
1181 EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
1182 EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
1183 EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001184
1185 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001186 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1187 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1188 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001189 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001190 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1191 EXPECT_TRUE(CheckNoRtp1());
1192 EXPECT_TRUE(CheckNoRtp2());
1193
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001194 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
1195 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
1196 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001197 EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001198 EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
1199
Zhi Huange830e682018-03-30 10:48:35 -07001200 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001201 SendCustomRtcp1(kSsrc1);
1202 SendCustomRtcp2(kSsrc2);
1203 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1205 EXPECT_TRUE(CheckNoRtcp1());
1206 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1207 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001209 SendCustomRtcp1(kSsrc2);
1210 SendCustomRtcp2(kSsrc1);
1211 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001212 // Bundle filter shouldn't filter out any RTCP.
1213 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1214 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215 }
1216
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217 void TestSetContentFailure() {
1218 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001219
Peter Thatchera6d24442015-07-09 21:26:36 -07001220 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001221 std::unique_ptr<typename T::Content> content(
1222 CreateMediaContentWithStream(1));
1223
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001225 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001226 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001227 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001228 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001231 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001232 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001233
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001235 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001236 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001237 }
1238
1239 void TestSendTwoOffers() {
1240 CreateChannels(0, 0);
1241
Peter Thatchera6d24442015-07-09 21:26:36 -07001242 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001243 std::unique_ptr<typename T::Content> content1(
1244 CreateMediaContentWithStream(1));
1245 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001246 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1248
Steve Anton18ee1d52017-09-11 11:32:35 -07001249 std::unique_ptr<typename T::Content> content2(
1250 CreateMediaContentWithStream(2));
1251 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001252 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1254 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1255 }
1256
1257 void TestReceiveTwoOffers() {
1258 CreateChannels(0, 0);
1259
Peter Thatchera6d24442015-07-09 21:26:36 -07001260 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001261 std::unique_ptr<typename T::Content> content1(
1262 CreateMediaContentWithStream(1));
1263 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001264 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1266
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_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1272 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1273 }
1274
1275 void TestSendPrAnswer() {
1276 CreateChannels(0, 0);
1277
Peter Thatchera6d24442015-07-09 21:26:36 -07001278 std::string err;
1279 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001280 std::unique_ptr<typename T::Content> content1(
1281 CreateMediaContentWithStream(1));
1282 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001283 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1285
Peter Thatchera6d24442015-07-09 21:26:36 -07001286 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001287 std::unique_ptr<typename T::Content> content2(
1288 CreateMediaContentWithStream(2));
1289 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001290 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1292 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1293
Peter Thatchera6d24442015-07-09 21:26:36 -07001294 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001295 std::unique_ptr<typename T::Content> content3(
1296 CreateMediaContentWithStream(3));
1297 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001298 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001299 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1300 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1301 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1302 }
1303
1304 void TestReceivePrAnswer() {
1305 CreateChannels(0, 0);
1306
Peter Thatchera6d24442015-07-09 21:26:36 -07001307 std::string err;
1308 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001309 std::unique_ptr<typename T::Content> content1(
1310 CreateMediaContentWithStream(1));
1311 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001312 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001313 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1314
Peter Thatchera6d24442015-07-09 21:26:36 -07001315 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001316 std::unique_ptr<typename T::Content> content2(
1317 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001318 EXPECT_TRUE(
1319 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1321 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1322
Peter Thatchera6d24442015-07-09 21:26:36 -07001323 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001324 std::unique_ptr<typename T::Content> content3(
1325 CreateMediaContentWithStream(3));
1326 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001327 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001328 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1329 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1330 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1331 }
1332
1333 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001334 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 EXPECT_TRUE(SendInitiate());
1336 EXPECT_TRUE(SendAccept());
Zhi Huange830e682018-03-30 10:48:35 -07001337 EXPECT_NE(nullptr, channel1_->rtcp_packet_transport());
1338 EXPECT_NE(nullptr, channel2_->rtcp_packet_transport());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001339
1340 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001341 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342 // The sending message is only posted. channel2_ should be empty.
1343 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001344 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1345 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346
1347 // When channel1_ is deleted, the RTCP packet should be sent out to
1348 // channel2_.
1349 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001350 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 EXPECT_TRUE(CheckRtcp2());
1352 }
1353
zstein56162b92017-04-24 16:54:35 -07001354 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001355 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001357
zstein56162b92017-04-24 16:54:35 -07001358 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001359 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(media_channel1_->ready_to_send());
1361
zstein56162b92017-04-24 16:54:35 -07001362 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001363 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 }
1366
skvladdc1c62c2016-03-16 19:07:43 -07001367 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1368 typename T::Content content;
1369 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1370 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001371 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001372 }
1373
deadbeefe702b302017-02-04 12:09:01 -08001374 webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001375 webrtc::RtpParameters parameters;
1376 webrtc::RtpEncodingParameters encoding;
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +01001377 encoding.max_bitrate_bps = std::move(limit);
skvladdc1c62c2016-03-16 19:07:43 -07001378 parameters.encodings.push_back(encoding);
1379 return parameters;
1380 }
1381
1382 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
deadbeefe702b302017-02-04 12:09:01 -08001383 rtc::Optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001384 EXPECT_EQ(1UL, parameters.encodings.size());
1385 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1386 }
1387
1388 void DefaultMaxBitrateIsUnlimited() {
1389 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001390 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1391 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001392 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001393 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001394 rtc::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001395 }
1396
Zhi Huange830e682018-03-30 10:48:35 -07001397 // Test that when a channel gets new RtpTransport with a call to
1398 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1399 // with the options on the new one.
1400
Steve Anton8a63f782017-10-23 13:08:53 -07001401 // For example, audio and video may use separate socket options, but initially
1402 // be unbundled, then later become bundled. When this happens, their preferred
1403 // socket options should be merged to the underlying transport they share.
1404 void SocketOptionsMergedOnSetTransport() {
1405 constexpr int kSndBufSize = 4000;
1406 constexpr int kRcvBufSize = 8000;
1407
Zhi Huange830e682018-03-30 10:48:35 -07001408 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001409
1410 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1411 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1412 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1413 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1414
Zhi Huange830e682018-03-30 10:48:35 -07001415 new_rtp_transport_ = CreateDtlsSrtpTransport(
1416 static_cast<DtlsTransportInternal*>(channel2_->rtp_packet_transport()),
1417 static_cast<DtlsTransportInternal*>(
1418 channel2_->rtcp_packet_transport()));
1419 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001420
1421 int option_val;
Zhi Huange830e682018-03-30 10:48:35 -07001422 ASSERT_TRUE(
1423 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1424 ->GetOption(rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001425 EXPECT_EQ(kSndBufSize, option_val);
Zhi Huange830e682018-03-30 10:48:35 -07001426 ASSERT_TRUE(
1427 static_cast<DtlsTransportInternal*>(channel1_->rtp_packet_transport())
1428 ->GetOption(rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001429 EXPECT_EQ(kRcvBufSize, option_val);
1430 }
1431
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001433 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1434 static void ProcessThreadQueue(rtc::Thread* thread) {
1435 RTC_DCHECK(thread->IsCurrent());
1436 while (!thread->empty()) {
1437 thread->ProcessMessages(0);
1438 }
1439 }
1440 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1441 // |threads| and current thread post packets to network thread.
1442 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001443 thread->Invoke<void>(RTC_FROM_HERE,
1444 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001445 }
1446 ProcessThreadQueue(rtc::Thread::Current());
1447 // Network thread move them around and post back to worker = current thread.
1448 if (!network_thread_->IsCurrent()) {
1449 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001450 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001451 }
1452 // Worker thread = current Thread process received messages.
1453 ProcessThreadQueue(rtc::Thread::Current());
1454 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001455 // TODO(pbos): Remove playout from all media channels and let renderers mute
1456 // themselves.
1457 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001458 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1459 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001460 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1461 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1462 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1463 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1464 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1465 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1466 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1467 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001468 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1469 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1470 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471 cricket::FakeMediaEngine media_engine_;
1472 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001473 typename T::MediaChannel* media_channel1_ = nullptr;
1474 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001475 std::unique_ptr<typename T::Channel> channel1_;
1476 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477 typename T::Content local_media_content1_;
1478 typename T::Content local_media_content2_;
1479 typename T::Content remote_media_content1_;
1480 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001481 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001482 rtc::Buffer rtp_packet_;
1483 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001484 int rtcp_mux_activated_callbacks1_ = 0;
1485 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001486 cricket::CandidatePairInterface* last_selected_candidate_pair_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487};
1488
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001489template<>
1490void ChannelTest<VoiceTraits>::CreateContent(
1491 int flags,
1492 const cricket::AudioCodec& audio_codec,
1493 const cricket::VideoCodec& video_codec,
1494 cricket::AudioContentDescription* audio) {
1495 audio->AddCodec(audio_codec);
1496 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497}
1498
1499template<>
1500void ChannelTest<VoiceTraits>::CopyContent(
1501 const cricket::AudioContentDescription& source,
1502 cricket::AudioContentDescription* audio) {
1503 *audio = source;
1504}
1505
1506template<>
1507bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1508 const cricket::AudioCodec& c2) {
1509 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1510 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
1511}
1512
Peter Boström0c4e06b2015-10-07 12:23:21 +02001513template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001515 uint32_t ssrc,
1516 int flags,
1517 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 audio->AddLegacyStream(ssrc);
1519}
1520
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001521class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 public:
solenberg1dd98f32015-09-10 01:57:14 -07001523 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001524 VoiceChannelSingleThreadTest()
1525 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1526};
1527
1528class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1529 public:
1530 typedef ChannelTest<VoiceTraits> Base;
1531 VoiceChannelDoubleThreadTest()
1532 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533};
1534
jbauch5869f502017-06-29 12:31:36 -07001535class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
1536 : public ChannelTest<VoiceTraits> {
1537 public:
1538 typedef ChannelTest<VoiceTraits> Base;
1539 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
1540 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1541 NetworkIsWorker::Yes) {}
1542};
1543
1544class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
1545 : public ChannelTest<VoiceTraits> {
1546 public:
1547 typedef ChannelTest<VoiceTraits> Base;
1548 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
1549 : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
1550 NetworkIsWorker::No) {}
1551};
1552
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001553// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001554template <>
Steve Anton8699a322017-11-06 15:53:33 -08001555std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001556 rtc::Thread* worker_thread,
1557 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07001558 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08001559 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001560 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001561 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001562 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08001563 auto channel = rtc::MakeUnique<cricket::VideoChannel>(
1564 worker_thread, network_thread, signaling_thread, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -07001565 cricket::CN_VIDEO, (flags & DTLS) != 0, rtc::CryptoOptions());
1566 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567 return channel;
1568}
1569
1570// override to add 0 parameter
1571template<>
1572bool ChannelTest<VideoTraits>::AddStream1(int id) {
1573 return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
1574}
1575
1576template<>
1577void ChannelTest<VideoTraits>::CreateContent(
1578 int flags,
1579 const cricket::AudioCodec& audio_codec,
1580 const cricket::VideoCodec& video_codec,
1581 cricket::VideoContentDescription* video) {
1582 video->AddCodec(video_codec);
1583 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584}
1585
1586template<>
1587void ChannelTest<VideoTraits>::CopyContent(
1588 const cricket::VideoContentDescription& source,
1589 cricket::VideoContentDescription* video) {
1590 *video = source;
1591}
1592
1593template<>
1594bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1595 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001596 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597}
1598
Peter Boström0c4e06b2015-10-07 12:23:21 +02001599template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001601 uint32_t ssrc,
1602 int flags,
1603 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 video->AddLegacyStream(ssrc);
1605}
1606
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001607class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 public:
solenberg1dd98f32015-09-10 01:57:14 -07001609 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001610 VideoChannelSingleThreadTest()
1611 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612};
1613
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1615 public:
1616 typedef ChannelTest<VideoTraits> Base;
1617 VideoChannelDoubleThreadTest()
1618 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1619};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001621TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 Base::TestInit();
1623 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1624 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1625}
1626
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001627TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1628 Base::TestDeinit();
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 Base::TestSetContents();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::TestSetContentsNullOffer();
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 Base::TestSetContentsRtcpMux();
1641}
1642
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001643TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 Base::TestSetContentsRtcpMux();
1645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 Base::TestStreams();
1649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 Base::TestChangeStreamParamsInContent();
1653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 Base::TestPlayoutAndSendingStates();
1657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 Base::TestMediaContentDirection();
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001664 Base::TestNetworkRouteChanges();
1665}
1666
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001667TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 Base::TestCallSetup();
1669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 Base::TestCallTeardownRtcpMux();
1673}
1674
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001675TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 Base::SendRtpToRtp();
1677}
1678
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001679TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 Base::SendRtcpToRtcp();
1681}
1682
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001683TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001684 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001688 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001689}
1690
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001691TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1693}
1694
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001695TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 Base::SendRtpToRtpOnThread();
1697}
1698
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 Base::SendWithWritabilityLoss();
1702}
1703
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001704TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 Base::TestSetContentFailure();
1706}
1707
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001708TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 Base::TestSendTwoOffers();
1710}
1711
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001712TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 Base::TestReceiveTwoOffers();
1714}
1715
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001716TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 Base::TestSendPrAnswer();
1718}
1719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001720TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 Base::TestReceivePrAnswer();
1722}
1723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001724TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725 Base::TestFlushRtcp();
1726}
1727
zstein56162b92017-04-24 16:54:35 -07001728TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1729 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730}
1731
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001732TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001733 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734}
1735
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001736TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001737 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001738}
1739
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001740TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001741 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001742}
1743
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001745 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746}
1747
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001748TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001749 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001750}
1751
Steve Anton8a63f782017-10-23 13:08:53 -07001752TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1753 Base::SocketOptionsMergedOnSetTransport();
1754}
1755
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001756// VoiceChannelDoubleThreadTest
1757TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001759 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1760 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761}
1762
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001763TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1764 Base::TestDeinit();
1765}
1766
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001767TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 Base::TestSetContents();
1769}
1770
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001771TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 Base::TestSetContentsNullOffer();
1773}
1774
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001775TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 Base::TestSetContentsRtcpMux();
1777}
1778
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001779TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 Base::TestSetContentsRtcpMux();
1781}
1782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 Base::TestStreams();
1785}
1786
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001787TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 Base::TestChangeStreamParamsInContent();
1789}
1790
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001791TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 Base::TestPlayoutAndSendingStates();
1793}
1794
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001795TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1796 Base::TestMediaContentDirection();
1797}
1798
1799TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1800 Base::TestNetworkRouteChanges();
1801}
1802
1803TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1804 Base::TestCallSetup();
1805}
1806
1807TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1808 Base::TestCallTeardownRtcpMux();
1809}
1810
1811TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1812 Base::SendRtpToRtp();
1813}
1814
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001815TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1816 Base::SendRtcpToRtcp();
1817}
1818
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001819TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001820 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821}
1822
1823TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001824 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001825}
1826
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1828 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1829}
1830
1831TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1832 Base::SendRtpToRtpOnThread();
1833}
1834
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001835TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1836 Base::SendWithWritabilityLoss();
1837}
1838
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001839TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1840 Base::TestSetContentFailure();
1841}
1842
1843TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1844 Base::TestSendTwoOffers();
1845}
1846
1847TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1848 Base::TestReceiveTwoOffers();
1849}
1850
1851TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1852 Base::TestSendPrAnswer();
1853}
1854
1855TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1856 Base::TestReceivePrAnswer();
1857}
1858
1859TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1860 Base::TestFlushRtcp();
1861}
1862
zstein56162b92017-04-24 16:54:35 -07001863TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1864 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1868 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1869}
1870
1871TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1872 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1873}
1874
1875TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1876 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1877}
1878
1879TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1880 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1881}
1882
1883TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1884 Base::DefaultMaxBitrateIsUnlimited();
1885}
1886
Steve Anton8a63f782017-10-23 13:08:53 -07001887TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1888 Base::SocketOptionsMergedOnSetTransport();
1889}
1890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001891// VideoChannelSingleThreadTest
1892TEST_F(VideoChannelSingleThreadTest, TestInit) {
1893 Base::TestInit();
1894}
1895
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001896TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1897 Base::TestDeinit();
1898}
1899
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001900TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1901 Base::TestSetContents();
1902}
1903
1904TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1905 Base::TestSetContentsNullOffer();
1906}
1907
1908TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1909 Base::TestSetContentsRtcpMux();
1910}
1911
1912TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1913 Base::TestSetContentsRtcpMux();
1914}
1915
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001916TEST_F(VideoChannelSingleThreadTest, TestStreams) {
1917 Base::TestStreams();
1918}
1919
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001920TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1921 Base::TestChangeStreamParamsInContent();
1922}
1923
1924TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1925 Base::TestPlayoutAndSendingStates();
1926}
1927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001928TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 Base::TestMediaContentDirection();
1930}
1931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001932TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001933 Base::TestNetworkRouteChanges();
1934}
1935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001936TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937 Base::TestCallSetup();
1938}
1939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001940TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 Base::TestCallTeardownRtcpMux();
1942}
1943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001944TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 Base::SendRtpToRtp();
1946}
1947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 Base::SendRtcpToRtcp();
1950}
1951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001952TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001953 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954}
1955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001956TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001957 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958}
1959
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001960TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1962}
1963
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001964TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 Base::SendRtpToRtpOnThread();
1966}
1967
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001968TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 Base::SendWithWritabilityLoss();
1970}
1971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001972TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 Base::TestSetContentFailure();
1974}
1975
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001976TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977 Base::TestSendTwoOffers();
1978}
1979
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001980TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001981 Base::TestReceiveTwoOffers();
1982}
1983
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001984TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 Base::TestSendPrAnswer();
1986}
1987
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001988TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989 Base::TestReceivePrAnswer();
1990}
1991
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001992TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993 Base::TestFlushRtcp();
1994}
1995
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001996TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001997 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998}
1999
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002000TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002001 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002002}
2003
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002004TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002005 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002006}
2007
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002008TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002009 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002010}
2011
zstein56162b92017-04-24 16:54:35 -07002012TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2013 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002014}
2015
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002016TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002017 Base::DefaultMaxBitrateIsUnlimited();
2018}
2019
Steve Anton8a63f782017-10-23 13:08:53 -07002020TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2021 Base::SocketOptionsMergedOnSetTransport();
2022}
2023
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002024// VideoChannelDoubleThreadTest
2025TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2026 Base::TestInit();
2027}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002029TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2030 Base::TestDeinit();
2031}
2032
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002033TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2034 Base::TestSetContents();
2035}
2036
2037TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2038 Base::TestSetContentsNullOffer();
2039}
2040
2041TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2042 Base::TestSetContentsRtcpMux();
2043}
2044
2045TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2046 Base::TestSetContentsRtcpMux();
2047}
2048
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002049TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
2050 Base::TestStreams();
2051}
2052
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002053TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2054 Base::TestChangeStreamParamsInContent();
2055}
2056
2057TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2058 Base::TestPlayoutAndSendingStates();
2059}
2060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002061TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2062 Base::TestMediaContentDirection();
2063}
2064
2065TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2066 Base::TestNetworkRouteChanges();
2067}
2068
2069TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2070 Base::TestCallSetup();
2071}
2072
2073TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2074 Base::TestCallTeardownRtcpMux();
2075}
2076
2077TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2078 Base::SendRtpToRtp();
2079}
2080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002081TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2082 Base::SendRtcpToRtcp();
2083}
2084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002085TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002086 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002087}
2088
2089TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002090 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002091}
2092
2093TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2094 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2095}
2096
2097TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2098 Base::SendRtpToRtpOnThread();
2099}
2100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2102 Base::SendWithWritabilityLoss();
2103}
2104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002105TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2106 Base::TestSetContentFailure();
2107}
2108
2109TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2110 Base::TestSendTwoOffers();
2111}
2112
2113TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2114 Base::TestReceiveTwoOffers();
2115}
2116
2117TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2118 Base::TestSendPrAnswer();
2119}
2120
2121TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2122 Base::TestReceivePrAnswer();
2123}
2124
2125TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2126 Base::TestFlushRtcp();
2127}
2128
2129TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2130 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2131}
2132
2133TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2134 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2135}
2136
2137TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2138 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2139}
2140
2141TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2142 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2143}
2144
zstein56162b92017-04-24 16:54:35 -07002145TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2146 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147}
2148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2150 Base::DefaultMaxBitrateIsUnlimited();
2151}
2152
Steve Anton8a63f782017-10-23 13:08:53 -07002153TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2154 Base::SocketOptionsMergedOnSetTransport();
2155}
2156
deadbeef953c2ce2017-01-09 14:53:41 -08002157// RtpDataChannelSingleThreadTest
2158class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002160 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002161 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002162 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2163};
2164
deadbeef953c2ce2017-01-09 14:53:41 -08002165// RtpDataChannelDoubleThreadTest
2166class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002167 public:
2168 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002169 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002170 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171};
2172
2173// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002174template <>
Steve Anton8699a322017-11-06 15:53:33 -08002175std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002176 rtc::Thread* worker_thread,
2177 rtc::Thread* network_thread,
deadbeefcbecd352015-09-23 11:50:27 -07002178 cricket::MediaEngineInterface* engine,
Steve Anton8699a322017-11-06 15:53:33 -08002179 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002180 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002181 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002182 rtc::Thread* signaling_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -08002183 auto channel = rtc::MakeUnique<cricket::RtpDataChannel>(
2184 worker_thread, network_thread, signaling_thread, std::move(ch),
Zhi Huange830e682018-03-30 10:48:35 -07002185 cricket::CN_DATA, (flags & DTLS) != 0, rtc::CryptoOptions());
2186 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187 return channel;
2188}
2189
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002190template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191void ChannelTest<DataTraits>::CreateContent(
2192 int flags,
2193 const cricket::AudioCodec& audio_codec,
2194 const cricket::VideoCodec& video_codec,
2195 cricket::DataContentDescription* data) {
2196 data->AddCodec(kGoogleDataCodec);
2197 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002198}
2199
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002200template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201void ChannelTest<DataTraits>::CopyContent(
2202 const cricket::DataContentDescription& source,
2203 cricket::DataContentDescription* data) {
2204 *data = source;
2205}
2206
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002207template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2209 const cricket::DataCodec& c2) {
2210 return c1.name == c2.name;
2211}
2212
Peter Boström0c4e06b2015-10-07 12:23:21 +02002213template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002215 uint32_t ssrc,
2216 int flags,
2217 cricket::DataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 data->AddLegacyStream(ssrc);
2219}
2220
deadbeef953c2ce2017-01-09 14:53:41 -08002221TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 Base::TestInit();
2223 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2224}
2225
deadbeef953c2ce2017-01-09 14:53:41 -08002226TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002227 Base::TestDeinit();
2228}
2229
deadbeef953c2ce2017-01-09 14:53:41 -08002230TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231 Base::TestSetContents();
2232}
2233
deadbeef953c2ce2017-01-09 14:53:41 -08002234TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235 Base::TestSetContentsNullOffer();
2236}
2237
deadbeef953c2ce2017-01-09 14:53:41 -08002238TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 Base::TestSetContentsRtcpMux();
2240}
2241
deadbeef953c2ce2017-01-09 14:53:41 -08002242TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 Base::TestStreams();
2244}
2245
deadbeef953c2ce2017-01-09 14:53:41 -08002246TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247 Base::TestChangeStreamParamsInContent();
2248}
2249
deadbeef953c2ce2017-01-09 14:53:41 -08002250TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251 Base::TestPlayoutAndSendingStates();
2252}
2253
deadbeef953c2ce2017-01-09 14:53:41 -08002254TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255 Base::TestMediaContentDirection();
2256}
2257
deadbeef953c2ce2017-01-09 14:53:41 -08002258TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259 Base::TestCallSetup();
2260}
2261
deadbeef953c2ce2017-01-09 14:53:41 -08002262TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263 Base::TestCallTeardownRtcpMux();
2264}
2265
zstein56162b92017-04-24 16:54:35 -07002266TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2267 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268}
2269
deadbeef953c2ce2017-01-09 14:53:41 -08002270TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271 Base::SendRtpToRtp();
2272}
2273
deadbeef953c2ce2017-01-09 14:53:41 -08002274TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275 Base::SendRtcpToRtcp();
2276}
2277
deadbeef953c2ce2017-01-09 14:53:41 -08002278TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279 Base::SendRtpToRtpOnThread();
2280}
2281
deadbeef953c2ce2017-01-09 14:53:41 -08002282TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002283 Base::SendWithWritabilityLoss();
2284}
2285
Steve Anton8a63f782017-10-23 13:08:53 -07002286TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2287 Base::SocketOptionsMergedOnSetTransport();
2288}
2289
deadbeef953c2ce2017-01-09 14:53:41 -08002290TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291 CreateChannels(0, 0);
2292 EXPECT_TRUE(SendInitiate());
2293 EXPECT_TRUE(SendAccept());
2294
2295 cricket::SendDataParams params;
2296 params.ssrc = 42;
2297 unsigned char data[] = {'f', 'o', 'o'};
2298 rtc::CopyOnWriteBuffer payload(data, 3);
2299 cricket::SendDataResult result;
2300 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2301 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2302 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2303}
2304
deadbeef953c2ce2017-01-09 14:53:41 -08002305TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002306 Base::TestInit();
2307 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2308}
2309
deadbeef953c2ce2017-01-09 14:53:41 -08002310TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002311 Base::TestDeinit();
2312}
2313
deadbeef953c2ce2017-01-09 14:53:41 -08002314TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002315 Base::TestSetContents();
2316}
2317
deadbeef953c2ce2017-01-09 14:53:41 -08002318TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002319 Base::TestSetContentsNullOffer();
2320}
2321
deadbeef953c2ce2017-01-09 14:53:41 -08002322TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002323 Base::TestSetContentsRtcpMux();
2324}
2325
deadbeef953c2ce2017-01-09 14:53:41 -08002326TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327 Base::TestStreams();
2328}
2329
deadbeef953c2ce2017-01-09 14:53:41 -08002330TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002331 Base::TestChangeStreamParamsInContent();
2332}
2333
deadbeef953c2ce2017-01-09 14:53:41 -08002334TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002335 Base::TestPlayoutAndSendingStates();
2336}
2337
deadbeef953c2ce2017-01-09 14:53:41 -08002338TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002339 Base::TestMediaContentDirection();
2340}
2341
deadbeef953c2ce2017-01-09 14:53:41 -08002342TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002343 Base::TestCallSetup();
2344}
2345
deadbeef953c2ce2017-01-09 14:53:41 -08002346TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002347 Base::TestCallTeardownRtcpMux();
2348}
2349
zstein56162b92017-04-24 16:54:35 -07002350TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2351 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002352}
2353
deadbeef953c2ce2017-01-09 14:53:41 -08002354TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002355 Base::SendRtpToRtp();
2356}
2357
deadbeef953c2ce2017-01-09 14:53:41 -08002358TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002359 Base::SendRtcpToRtcp();
2360}
2361
deadbeef953c2ce2017-01-09 14:53:41 -08002362TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002363 Base::SendRtpToRtpOnThread();
2364}
2365
deadbeef953c2ce2017-01-09 14:53:41 -08002366TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002367 Base::SendWithWritabilityLoss();
2368}
2369
Steve Anton8a63f782017-10-23 13:08:53 -07002370TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2371 Base::SocketOptionsMergedOnSetTransport();
2372}
2373
deadbeef953c2ce2017-01-09 14:53:41 -08002374TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 CreateChannels(0, 0);
2376 EXPECT_TRUE(SendInitiate());
2377 EXPECT_TRUE(SendAccept());
2378
2379 cricket::SendDataParams params;
2380 params.ssrc = 42;
2381 unsigned char data[] = {
2382 'f', 'o', 'o'
2383 };
jbaucheec21bd2016-03-20 06:15:43 -07002384 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385 cricket::SendDataResult result;
2386 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2387 EXPECT_EQ(params.ssrc,
2388 media_channel1_->last_sent_data_params().ssrc);
2389 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2390}
2391
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392// TODO(pthatcher): TestSetReceiver?