blob: db0e8a8d02cdbb1a7d5b6082f2189716e14d8b69 [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
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080014#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010015#include <utility>
kwiberg31022942016-03-11 14:18:21 -080016
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "api/audio_options.h"
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070020#include "api/media_transport_config.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "media/base/fake_media_engine.h"
24#include "media/base/fake_rtp.h"
25#include "media/base/media_channel.h"
26#include "p2p/base/candidate_pair_interface.h"
27#include "p2p/base/fake_dtls_transport.h"
28#include "p2p/base/fake_packet_transport.h"
29#include "p2p/base/ice_transport_internal.h"
30#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "pc/dtls_srtp_transport.h"
32#include "pc/jsep_transport.h"
33#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020037#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080038#include "rtc_base/rtc_certificate.h"
39#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020040#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010041#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042
zhihuangb2cdd932017-01-19 16:54:25 -080043using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080045using cricket::RidDescription;
46using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080048using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080049using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
Danil Chapovalov33b01f22016-05-11 19:55:27 +020051namespace {
52const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
53const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
54const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070055const cricket::VideoCodec kH264Codec(97, "H264");
56const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020057const cricket::DataCodec kGoogleDataCodec(101, "google-data");
58const uint32_t kSsrc1 = 0x1111;
59const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070060const uint32_t kSsrc3 = 0x3333;
61const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020062const int kAudioPts[] = {0, 8};
63const int kVideoPts[] = {97, 99};
64enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010065
Danil Chapovalov33b01f22016-05-11 19:55:27 +020066} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067
deadbeefcbecd352015-09-23 11:50:27 -070068template <class ChannelT,
69 class MediaChannelT,
70 class ContentT,
71 class CodecT,
72 class MediaInfoT,
73 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074class Traits {
75 public:
76 typedef ChannelT Channel;
77 typedef MediaChannelT MediaChannel;
78 typedef ContentT Content;
79 typedef CodecT Codec;
80 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020081 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082};
83
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084class VoiceTraits : public Traits<cricket::VoiceChannel,
85 cricket::FakeVoiceMediaChannel,
86 cricket::AudioContentDescription,
87 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020088 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070089 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
91class VideoTraits : public Traits<cricket::VideoChannel,
92 cricket::FakeVideoMediaChannel,
93 cricket::VideoContentDescription,
94 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020095 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070096 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097
deadbeef953c2ce2017-01-09 14:53:41 -080098class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200100 cricket::RtpDataContentDescription,
101 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200102 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700103 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104
deadbeef953c2ce2017-01-09 14:53:41 -0800105// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200106template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200107class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 public:
deadbeefac22f702017-01-12 21:59:29 -0800109 enum Flags {
110 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800111 SSRC_MUX = 0x8,
112 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800113 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800114 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700115 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800116 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117
Peter Boström34fbfff2015-09-24 19:20:30 +0200118 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200119 rtc::ArrayView<const uint8_t> rtp_data,
120 rtc::ArrayView<const uint8_t> rtcp_data,
121 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200122 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800124 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200125 if (network_is_worker == NetworkIsWorker::Yes) {
126 network_thread_ = rtc::Thread::Current();
127 } else {
128 network_thread_keeper_ = rtc::Thread::Create();
129 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 network_thread_ = network_thread_keeper_.get();
131 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200132 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 void CreateChannels(int flags1, int flags2) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200135 CreateChannels(absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800136 nullptr, typename T::Options()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200137 absl::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800138 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200139 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 }
Steve Anton8699a322017-11-06 15:53:33 -0800141 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
142 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200143 int flags1,
144 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800145 // Network thread is started in CreateChannels, to allow the test to
146 // configure a fake clock before any threads are spawned and attempt to
147 // access the time.
148 if (network_thread_keeper_) {
149 network_thread_keeper_->Start();
150 }
Zhi Huange830e682018-03-30 10:48:35 -0700151
deadbeeff5346592017-01-24 21:51:21 -0800152 // Make sure if using raw packet transports, they're used for both
153 // channels.
154 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200155 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800156 media_channel1_ = ch1.get();
157 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800158 rtc::PacketTransportInternal* rtp1 = nullptr;
159 rtc::PacketTransportInternal* rtcp1 = nullptr;
160 rtc::PacketTransportInternal* rtp2 = nullptr;
161 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800162 // Based on flags, create fake DTLS or raw packet transports.
163 if (flags1 & RAW_PACKET_TRANSPORT) {
164 fake_rtp_packet_transport1_.reset(
165 new rtc::FakePacketTransport("channel1_rtp"));
166 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700167 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800168 fake_rtcp_packet_transport1_.reset(
169 new rtc::FakePacketTransport("channel1_rtcp"));
170 rtcp1 = fake_rtcp_packet_transport1_.get();
171 }
172 } else {
173 // Confirmed to work with KT_RSA and KT_ECDSA.
174 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
175 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
176 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700177 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800178 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
179 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
180 rtcp1 = fake_rtcp_dtls_transport1_.get();
181 }
182 if (flags1 & DTLS) {
183 auto cert1 =
184 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
185 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
186 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
187 if (fake_rtcp_dtls_transport1_) {
188 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
189 }
190 }
191 }
192 // Based on flags, create fake DTLS or raw packet transports.
193 if (flags2 & RAW_PACKET_TRANSPORT) {
194 fake_rtp_packet_transport2_.reset(
195 new rtc::FakePacketTransport("channel2_rtp"));
196 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700197 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800198 fake_rtcp_packet_transport2_.reset(
199 new rtc::FakePacketTransport("channel2_rtcp"));
200 rtcp2 = fake_rtcp_packet_transport2_.get();
201 }
202 } else {
203 // Confirmed to work with KT_RSA and KT_ECDSA.
204 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
205 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
206 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700207 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800208 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
209 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
210 rtcp2 = fake_rtcp_dtls_transport2_.get();
211 }
212 if (flags2 & DTLS) {
213 auto cert2 =
214 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
215 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
216 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
217 if (fake_rtcp_dtls_transport2_) {
218 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
219 }
220 }
221 }
Zhi Huange830e682018-03-30 10:48:35 -0700222 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
223 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
224 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
225 flags1);
226 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
227 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
228 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
229 flags2);
230
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800231 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
232 rtp_transport1_.get(), flags1);
233 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
234 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800235 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800236 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800237 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800238 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200239 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
240 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 CopyContent(local_media_content1_, &remote_media_content1_);
242 CopyContent(local_media_content2_, &remote_media_content2_);
243
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000244 // Add stream information (SSRC) to the local content but not to the remote
245 // content. This means that we per default know the SSRC of what we send but
246 // not what we receive.
247 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
248 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
249
250 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
251 if (flags1 & SSRC_MUX) {
252 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
253 }
254 if (flags2 & SSRC_MUX) {
255 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
256 }
257 }
Steve Anton8699a322017-11-06 15:53:33 -0800258 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200259 rtc::Thread* worker_thread,
260 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800261 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700262 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -0700263 int flags) {
deadbeeff5346592017-01-24 21:51:21 -0800264 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200265 auto channel = absl::make_unique<typename T::Channel>(
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800266 worker_thread, network_thread, signaling_thread, std::move(ch),
267 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
268 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700269 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000270 return channel;
271 }
272
Zhi Huange830e682018-03-30 10:48:35 -0700273 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
274 rtc::PacketTransportInternal* rtp_packet_transport,
275 rtc::PacketTransportInternal* rtcp_packet_transport,
276 DtlsTransportInternal* rtp_dtls_transport,
277 DtlsTransportInternal* rtcp_dtls_transport,
278 int flags) {
279 if (flags & RTCP_MUX) {
280 rtcp_packet_transport = nullptr;
281 rtcp_dtls_transport = nullptr;
282 }
283
284 if (flags & DTLS) {
285 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
286 } else {
287 if (flags & RAW_PACKET_TRANSPORT) {
288 return CreateUnencryptedTransport(rtp_packet_transport,
289 rtcp_packet_transport);
290 } else {
291 return CreateUnencryptedTransport(rtp_dtls_transport,
292 rtcp_dtls_transport);
293 }
294 }
295 }
296
297 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
298 rtc::PacketTransportInternal* rtp_packet_transport,
299 rtc::PacketTransportInternal* rtcp_packet_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200300 auto rtp_transport = absl::make_unique<webrtc::RtpTransport>(
301 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700302
303 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
304 if (rtcp_packet_transport) {
305 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
306 }
307 return rtp_transport;
308 }
309
310 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
311 cricket::DtlsTransportInternal* rtp_dtls_transport,
312 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200313 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700314 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700315
316 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
317 rtcp_dtls_transport);
318 return dtls_srtp_transport;
319 }
320
deadbeeff5346592017-01-24 21:51:21 -0800321 void ConnectFakeTransports() {
322 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
323 bool asymmetric = false;
324 // Depending on test flags, could be using DTLS or raw packet transport.
325 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
326 fake_rtp_dtls_transport1_->SetDestination(
327 fake_rtp_dtls_transport2_.get(), asymmetric);
328 }
329 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
330 fake_rtcp_dtls_transport1_->SetDestination(
331 fake_rtcp_dtls_transport2_.get(), asymmetric);
332 }
333 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
334 fake_rtp_packet_transport1_->SetDestination(
335 fake_rtp_packet_transport2_.get(), asymmetric);
336 }
337 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
338 fake_rtcp_packet_transport1_->SetDestination(
339 fake_rtcp_packet_transport2_.get(), asymmetric);
340 }
341 });
342 }
343
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000344 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000345 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800346 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000347 if (result) {
348 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000349 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800350 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800352 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356 }
357 return result;
358 }
359
360 bool SendAccept() {
361 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365
366 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000367 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800368 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 if (result) {
370 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000371 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800372 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 }
374 return result;
375 }
376
377 bool SendProvisionalAnswer() {
378 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800379 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 if (result) {
381 channel2_->Enable(true);
382 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800383 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800384 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385 }
386 return result;
387 }
388
389 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000390 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800391 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000392 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000393 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800394 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 return result;
396 }
397
deadbeeff5346592017-01-24 21:51:21 -0800398 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 channel1_.reset();
400 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800401 fake_rtp_dtls_transport1_.reset();
402 fake_rtcp_dtls_transport1_.reset();
403 fake_rtp_dtls_transport2_.reset();
404 fake_rtcp_dtls_transport2_.reset();
405 fake_rtp_packet_transport1_.reset();
406 fake_rtcp_packet_transport1_.reset();
407 fake_rtp_packet_transport2_.reset();
408 fake_rtcp_packet_transport2_.reset();
409 if (network_thread_keeper_) {
410 network_thread_keeper_.reset();
411 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 return true;
413 }
414
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendRtp1() {
416 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
417 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendRtp2() {
420 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
421 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423 void SendRtcp1() {
424 media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 void SendRtcp2() {
427 media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
429 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200430 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
431 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
432 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200434 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
435 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
436 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200438 void SendCustomRtcp1(uint32_t ssrc) {
439 rtc::Buffer data = CreateRtcpData(ssrc);
440 media_channel1_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 void SendCustomRtcp2(uint32_t ssrc) {
443 rtc::Buffer data = CreateRtcpData(ssrc);
444 media_channel2_->SendRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200448 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449 }
450 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200451 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 }
453 bool CheckRtcp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200454 return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 }
456 bool CheckRtcp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200457 return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 }
459 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200460 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200461 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
462 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200464 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200465 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
466 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200468 bool CheckCustomRtcp1(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200469 rtc::Buffer data = CreateRtcpData(ssrc);
470 return media_channel1_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200472 bool CheckCustomRtcp2(uint32_t ssrc) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200473 rtc::Buffer data = CreateRtcpData(ssrc);
474 return media_channel2_->CheckRtcp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200476 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
477 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 rtc::SetBE32(data.data() + 8, ssrc);
480 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000481 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200482 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000483 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 return data;
485 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 rtc::Buffer CreateRtcpData(uint32_t ssrc) {
487 rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488 // Set SSRC in the rtcp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200489 rtc::SetBE32(data.data() + 4, ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490 return data;
491 }
492
Yves Gerey665174f2018-06-19 15:03:05 +0200493 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
494 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
495 bool CheckNoRtcp1() { return media_channel1_->CheckNoRtcp(); }
496 bool CheckNoRtcp2() { return media_channel2_->CheckNoRtcp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497
498 void CreateContent(int flags,
499 const cricket::AudioCodec& audio_codec,
500 const cricket::VideoCodec& video_codec,
501 typename T::Content* content) {
502 // overridden in specialized classes
503 }
504 void CopyContent(const typename T::Content& source,
505 typename T::Content* content) {
506 // overridden in specialized classes
507 }
508
Steve Anton18ee1d52017-09-11 11:32:35 -0700509 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700511 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
512 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700513 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700514 AddLegacyStreamInContent(ssrc, 0, content);
515 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 }
517
ossu292d6582016-03-17 02:31:13 -0700518 // Will manage the lifetime of a CallThread, making sure it's
519 // destroyed before this object goes out of scope.
520 class ScopedCallThread {
521 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200522 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100523 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200524 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100525 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
526 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700527 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700528 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700529 }
530
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200531 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700532
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200533 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700534
535 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200536 std::unique_ptr<rtc::Thread> thread_;
537 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700538 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
541 return false; // overridden in specialized classes
542 }
543
deadbeeff5346592017-01-24 21:51:21 -0800544 void OnRtcpMuxFullyActive1(const std::string&) {
545 rtcp_mux_activated_callbacks1_++;
546 }
547 void OnRtcpMuxFullyActive2(const std::string&) {
548 rtcp_mux_activated_callbacks2_++;
549 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550
Honghai Zhangcc411c02016-03-29 17:27:21 -0700551 cricket::CandidatePairInterface* last_selected_candidate_pair() {
552 return last_selected_candidate_pair_;
553 }
554
Peter Boström0c4e06b2015-10-07 12:23:21 +0200555 void AddLegacyStreamInContent(uint32_t ssrc,
556 int flags,
557 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Base implementation.
559 }
560
561 // Tests that can be used by derived classes.
562
563 // Basic sanity check.
564 void TestInit() {
565 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700566 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200568 if (verify_playout_) {
569 EXPECT_FALSE(media_channel1_->playout());
570 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 EXPECT_TRUE(media_channel1_->codecs().empty());
572 EXPECT_TRUE(media_channel1_->recv_streams().empty());
573 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
574 EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
575 }
576
577 // Test that SetLocalContent and SetRemoteContent properly configure
578 // the codecs.
579 void TestSetContents() {
580 CreateChannels(0, 0);
581 typename T::Content content;
582 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800583 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800585 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200587 EXPECT_TRUE(
588 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 }
590
Johannes Kron9190b822018-10-29 11:22:05 +0100591 // Test that SetLocalContent and SetRemoteContent properly configure
592 // extmap-allow-mixed.
593 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
594 // For a caller, SetLocalContent() is called first with an offer and next
595 // SetRemoteContent() is called with the answer.
596 CreateChannels(0, 0);
597 typename T::Content content;
598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
600 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
601 content.set_extmap_allow_mixed_enum(offer_enum);
602 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
603 content.set_extmap_allow_mixed_enum(answer_enum);
604 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
605 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
606 }
607 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
608 // For a callee, SetRemoteContent() is called first with an offer and next
609 // SetLocalContent() is called with the answer.
610 CreateChannels(0, 0);
611 typename T::Content content;
612 CreateContent(0, kPcmuCodec, kH264Codec, &content);
613 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
614 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
615 content.set_extmap_allow_mixed_enum(offer_enum);
616 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
617 content.set_extmap_allow_mixed_enum(answer_enum);
618 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
619 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
620 }
621
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 // Test that SetLocalContent and SetRemoteContent properly deals
623 // with an empty offer.
624 void TestSetContentsNullOffer() {
625 CreateChannels(0, 0);
626 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800627 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 CreateContent(0, kPcmuCodec, kH264Codec, &content);
629 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800630 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200632 EXPECT_TRUE(
633 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 }
635
636 // Test that SetLocalContent and SetRemoteContent properly set RTCP
637 // mux.
638 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800639 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 typename T::Content content;
641 CreateContent(0, kPcmuCodec, kH264Codec, &content);
642 // Both sides agree on mux. Should no longer be a separate RTCP channel.
643 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800644 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
645 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800649 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 }
651
652 // Test that SetLocalContent and SetRemoteContent properly set RTCP
653 // mux when a provisional answer is received.
654 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800655 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 typename T::Content content;
657 CreateContent(0, kPcmuCodec, kH264Codec, &content);
658 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800659 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
660 EXPECT_TRUE(
661 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800662 // Both sides agree on mux. Should signal RTCP mux as fully activated.
663 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800664 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800665 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800667 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800669 EXPECT_TRUE(
670 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
671 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800672 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 }
674
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 // Test that SetLocalContent and SetRemoteContent properly
676 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800677 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 void TestChangeStreamParamsInContent() {
679 cricket::StreamParams stream1;
680 stream1.groupid = "group1";
681 stream1.id = "stream1";
682 stream1.ssrcs.push_back(kSsrc1);
683 stream1.cname = "stream1_cname";
684
685 cricket::StreamParams stream2;
686 stream2.groupid = "group1";
687 stream2.id = "stream2";
688 stream2.ssrcs.push_back(kSsrc2);
689 stream2.cname = "stream2_cname";
690
691 // Setup a call where channel 1 send |stream1| to channel 2.
692 CreateChannels(0, 0);
693 typename T::Content content1;
694 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
695 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800696 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_TRUE(channel1_->Enable(true));
698 EXPECT_EQ(1u, media_channel1_->send_streams().size());
699
Steve Anton3828c062017-12-06 10:34:51 -0800700 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800702 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703
704 // Channel 2 do not send anything.
705 typename T::Content content2;
706 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800707 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800709 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_TRUE(channel2_->Enable(true));
711 EXPECT_EQ(0u, media_channel2_->send_streams().size());
712
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200713 SendCustomRtp1(kSsrc1, 0);
714 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
716
717 // Let channel 2 update the content by sending |stream2| and enable SRTP.
718 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700719 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800721 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 ASSERT_EQ(1u, media_channel2_->send_streams().size());
723 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
724
Steve Anton3828c062017-12-06 10:34:51 -0800725 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
727 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
728
729 // Channel 1 replies but stop sending stream1.
730 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700731 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800732 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_EQ(0u, media_channel1_->send_streams().size());
734
Steve Anton3828c062017-12-06 10:34:51 -0800735 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
737
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200738 SendCustomRtp2(kSsrc2, 0);
739 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
741 }
742
743 // Test that we only start playout and sending at the right times.
744 void TestPlayoutAndSendingStates() {
745 CreateChannels(0, 0);
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());
Peter Boström34fbfff2015-09-24 19:20:30 +0200750 if (verify_playout_) {
751 EXPECT_FALSE(media_channel2_->playout());
752 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_FALSE(media_channel2_->sending());
754 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200755 if (verify_playout_) {
756 EXPECT_FALSE(media_channel1_->playout());
757 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000759 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800760 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
762 EXPECT_TRUE(media_channel1_->playout());
763 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000765 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800766 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
768 EXPECT_FALSE(media_channel2_->playout());
769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000771 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800772 SdpType::kAnswer, NULL));
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());
deadbeeff5346592017-01-24 21:51:21 -0800777 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200778 if (verify_playout_) {
779 EXPECT_TRUE(media_channel1_->playout());
780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200782 if (verify_playout_) {
783 EXPECT_FALSE(media_channel2_->playout());
784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_FALSE(media_channel2_->sending());
786 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
788 EXPECT_TRUE(media_channel2_->playout());
789 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000791 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800792 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200793 if (verify_playout_) {
794 EXPECT_TRUE(media_channel1_->playout());
795 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 EXPECT_TRUE(media_channel1_->sending());
797 }
798
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799 // Test that changing the MediaContentDirection in the local and remote
800 // session description start playout and sending at the right time.
801 void TestMediaContentDirection() {
802 CreateChannels(0, 0);
803 typename T::Content content1;
804 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
805 typename T::Content content2;
806 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
807 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800808 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
810 EXPECT_TRUE(channel1_->Enable(true));
811 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200812 if (verify_playout_) {
813 EXPECT_FALSE(media_channel1_->playout());
814 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200816 if (verify_playout_) {
817 EXPECT_FALSE(media_channel2_->playout());
818 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819 EXPECT_FALSE(media_channel2_->sending());
820
Steve Anton3828c062017-12-06 10:34:51 -0800821 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
822 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
823 EXPECT_TRUE(
824 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
825 EXPECT_TRUE(
826 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800827 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828
Peter Boström34fbfff2015-09-24 19:20:30 +0200829 if (verify_playout_) {
830 EXPECT_TRUE(media_channel1_->playout());
831 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000832 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200833 if (verify_playout_) {
834 EXPECT_FALSE(media_channel2_->playout()); // local InActive
835 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000836 EXPECT_FALSE(media_channel2_->sending()); // local InActive
837
838 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800839 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800840 EXPECT_TRUE(
841 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
842 EXPECT_TRUE(
843 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844
Peter Boström34fbfff2015-09-24 19:20:30 +0200845 if (verify_playout_) {
846 EXPECT_TRUE(media_channel1_->playout());
847 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200849 if (verify_playout_) {
850 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
851 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
853
854 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800855 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800856 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
857 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858
Peter Boström34fbfff2015-09-24 19:20:30 +0200859 if (verify_playout_) {
860 EXPECT_TRUE(media_channel1_->playout());
861 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200863 if (verify_playout_) {
864 EXPECT_TRUE(media_channel2_->playout());
865 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000866 EXPECT_TRUE(media_channel2_->sending());
867 }
868
Honghai Zhangcc411c02016-03-29 17:27:21 -0700869 // Tests that when the transport channel signals a candidate pair change
870 // event, the media channel will receive a call on the network route change.
871 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700872 static constexpr uint16_t kLocalNetId = 1;
873 static constexpr uint16_t kRemoteNetId = 2;
874 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800875 // Ipv4(20) + UDP(8).
876 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800877 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200878
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800879 CreateChannels(DTLS, DTLS);
880 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700881
Honghai Zhangcc411c02016-03-29 17:27:21 -0700882 typename T::MediaChannel* media_channel1 =
883 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200884 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700885
Zhi Huang942bc2e2017-11-13 13:26:07 -0800886 // Need to wait for the threads before calling
887 // |set_num_network_route_changes| because the network route would be set
888 // when creating the channel.
889 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200890 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800891 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800892 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200893 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800894 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
895
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200896 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200897 });
898 WaitForThreads();
899 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700900 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200901 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700902
eladalon05b07bb2017-08-24 07:40:16 -0700903 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800904 rtc::NetworkRoute network_route;
905 network_route.connected = true;
906 network_route.local_network_id = kLocalNetId;
907 network_route.remote_network_id = kRemoteNetId;
908 network_route.last_sent_packet_id = kLastPacketId;
909 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200910 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800911 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
912
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200913 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200914 });
915 WaitForThreads();
916 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100917 EXPECT_TRUE(media_channel1->last_network_route().connected);
918 EXPECT_EQ(kLocalNetId,
919 media_channel1->last_network_route().local_network_id);
920 EXPECT_EQ(kRemoteNetId,
921 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200922 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700923 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800924 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800925 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700926 }
927
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 // Test setting up a call.
929 void TestCallSetup() {
930 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700931 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200933 if (verify_playout_) {
934 EXPECT_TRUE(media_channel1_->playout());
935 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 EXPECT_FALSE(media_channel1_->sending());
937 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700938 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 EXPECT_TRUE(media_channel1_->sending());
940 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200941 if (verify_playout_) {
942 EXPECT_TRUE(media_channel2_->playout());
943 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 EXPECT_TRUE(media_channel2_->sending());
945 EXPECT_EQ(1U, media_channel2_->codecs().size());
946 }
947
948 // Test that we don't crash if packets are sent during call teardown
949 // when RTCP mux is enabled. This is a regression test against a specific
950 // race condition that would only occur when a RTCP packet was sent during
951 // teardown of a channel on which RTCP mux was enabled.
952 void TestCallTeardownRtcpMux() {
953 class LastWordMediaChannel : public T::MediaChannel {
954 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200955 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700957 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
958 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
960 }
961 };
Karl Wiberg918f50c2018-07-05 11:40:33 +0200962 CreateChannels(absl::make_unique<LastWordMediaChannel>(),
963 absl::make_unique<LastWordMediaChannel>(), RTCP_MUX,
964 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 EXPECT_TRUE(SendInitiate());
966 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800967 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968 }
969
970 // Send voice RTP data to the other side and ensure it gets there.
971 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700972 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 EXPECT_TRUE(SendInitiate());
974 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700975 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
976 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200977 SendRtp1();
978 SendRtp2();
979 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 EXPECT_TRUE(CheckRtp1());
981 EXPECT_TRUE(CheckRtp2());
982 EXPECT_TRUE(CheckNoRtp1());
983 EXPECT_TRUE(CheckNoRtp2());
984 }
985
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200986 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800987 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200988 EXPECT_TRUE(SendInitiate());
989 EXPECT_TRUE(SendAccept());
990 SendRtp1();
991 SendRtp2();
992 SendRtcp1();
993 SendRtcp2();
994 // Do not wait, destroy channels.
995 channel1_.reset(nullptr);
996 channel2_.reset(nullptr);
997 }
998
deadbeefac22f702017-01-12 21:59:29 -0800999 // Check that RTCP can be transmitted between both sides.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 void SendRtcpToRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001001 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 EXPECT_TRUE(SendInitiate());
1003 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001004 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
1005 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001006 SendRtcp1();
1007 SendRtcp2();
1008 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 EXPECT_TRUE(CheckRtcp1());
1010 EXPECT_TRUE(CheckRtcp2());
1011 EXPECT_TRUE(CheckNoRtcp1());
1012 EXPECT_TRUE(CheckNoRtcp2());
1013 }
1014
Zhi Huange830e682018-03-30 10:48:35 -07001015 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
1016 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -07001017 EXPECT_FALSE(channel1_->srtp_active());
1018 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001020 WaitForThreads();
1021 EXPECT_TRUE(channel1_->writable());
1022 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -07001024 EXPECT_TRUE(channel1_->srtp_active());
1025 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001026 SendRtp1();
1027 SendRtp2();
1028 SendRtcp1();
1029 SendRtcp2();
1030 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 EXPECT_TRUE(CheckRtp1());
1032 EXPECT_TRUE(CheckRtp2());
1033 EXPECT_TRUE(CheckNoRtp1());
1034 EXPECT_TRUE(CheckNoRtp2());
1035 EXPECT_TRUE(CheckRtcp1());
1036 EXPECT_TRUE(CheckRtcp2());
1037 EXPECT_TRUE(CheckNoRtcp1());
1038 EXPECT_TRUE(CheckNoRtcp2());
1039 }
1040
1041 // Test that we can send and receive early media when a provisional answer is
1042 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
1043 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +02001044 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045
Yves Gerey665174f2018-06-19 15:03:05 +02001046 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
1047 EXPECT_TRUE(SendOffer());
1048 EXPECT_TRUE(SendProvisionalAnswer());
1049 EXPECT_TRUE(channel1_->srtp_active());
1050 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001051 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1052 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +02001053 WaitForThreads(); // Wait for 'sending' flag go through network thread.
1054 SendCustomRtcp1(kSsrc1);
1055 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1056 WaitForThreads();
1057 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1058 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059
Yves Gerey665174f2018-06-19 15:03:05 +02001060 // Send packets from callee and verify that it is received.
1061 SendCustomRtcp2(kSsrc2);
1062 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1063 WaitForThreads();
1064 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1065 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066
Yves Gerey665174f2018-06-19 15:03:05 +02001067 // Complete call setup and ensure everything is still OK.
1068 EXPECT_TRUE(SendFinalAnswer());
1069 EXPECT_TRUE(channel1_->srtp_active());
1070 EXPECT_TRUE(channel2_->srtp_active());
1071 SendCustomRtcp1(kSsrc1);
1072 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1073 SendCustomRtcp2(kSsrc2);
1074 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1075 WaitForThreads();
1076 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1077 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1078 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1079 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 }
1081
1082 // Test that we properly send RTP without SRTP from a thread.
1083 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001084 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 EXPECT_TRUE(SendInitiate());
1086 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001087 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1088 ScopedCallThread send_rtp2([this] { SendRtp2(); });
1089 ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
1090 ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
1091 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
1092 send_rtcp1.thread(),
1093 send_rtcp2.thread()};
1094 WaitForThreads(involved_threads);
1095 EXPECT_TRUE(CheckRtp1());
1096 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_TRUE(CheckNoRtp1());
1098 EXPECT_TRUE(CheckNoRtp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001099 EXPECT_TRUE(CheckRtcp1());
1100 EXPECT_TRUE(CheckRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 EXPECT_TRUE(CheckNoRtcp1());
1102 EXPECT_TRUE(CheckNoRtcp2());
1103 }
1104
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 // Test that the mediachannel retains its sending state after the transport
1106 // becomes non-writable.
1107 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001108 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_TRUE(SendInitiate());
1110 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001111 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1112 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
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(CheckRtp2());
1118 EXPECT_TRUE(CheckNoRtp1());
1119 EXPECT_TRUE(CheckNoRtp2());
1120
wu@webrtc.org97077a32013-10-25 21:18:33 +00001121 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001122 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1123 fake_rtp_dtls_transport1_->SetWritable(false);
1124 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001125 SendRtp1();
1126 SendRtp2();
1127 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(CheckRtp1());
1129 EXPECT_TRUE(CheckNoRtp2());
1130
1131 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001132 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1133 fake_rtp_dtls_transport1_->SetWritable(true);
1134 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001136 SendRtp1();
1137 SendRtp2();
1138 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(CheckRtp1());
1140 EXPECT_TRUE(CheckRtp2());
1141 EXPECT_TRUE(CheckNoRtp1());
1142 EXPECT_TRUE(CheckNoRtp2());
1143
1144 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001145 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1146 bool asymmetric = true;
1147 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1148 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 EXPECT_TRUE(media_channel1_->sending());
1150
wu@webrtc.org97077a32013-10-25 21:18:33 +00001151 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001152 SendRtp1();
1153 SendRtp2();
1154 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_TRUE(CheckRtp1());
1156 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001157 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158
1159 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001160 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001161 bool asymmetric = true;
1162 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1163 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001164 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001166 SendRtp1();
1167 SendRtp2();
1168 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(CheckRtp1());
1170 EXPECT_TRUE(CheckRtp2());
1171 EXPECT_TRUE(CheckNoRtp1());
1172 EXPECT_TRUE(CheckNoRtp2());
1173 }
1174
Yves Gerey665174f2018-06-19 15:03:05 +02001175 void SendBundleToBundle(const int* pl_types,
1176 int len,
1177 bool rtcp_mux,
1178 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001179 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001181 // Only pl_type1 was added to the bundle filter for both |channel1_|
1182 // and |channel2_|.
1183 int pl_type1 = pl_types[0];
1184 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001185 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001186 if (secure)
1187 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001188 if (rtcp_mux) {
1189 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001190 }
1191 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001194
1195 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001196 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1197 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1198 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001199 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001200 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1201 EXPECT_TRUE(CheckNoRtp1());
1202 EXPECT_TRUE(CheckNoRtp2());
1203
Zhi Huang365381f2018-04-13 16:44:34 -07001204 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1205 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001206 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001207 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1208 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001209
Zhi Huange830e682018-03-30 10:48:35 -07001210 // RTCP test
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001211 SendCustomRtcp1(kSsrc1);
1212 SendCustomRtcp2(kSsrc2);
1213 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001214 EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
1215 EXPECT_TRUE(CheckNoRtcp1());
1216 EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
1217 EXPECT_TRUE(CheckNoRtcp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001219 SendCustomRtcp1(kSsrc2);
1220 SendCustomRtcp2(kSsrc1);
1221 WaitForThreads();
pbos482b12e2015-11-16 10:19:58 -08001222 // Bundle filter shouldn't filter out any RTCP.
1223 EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
1224 EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 }
1226
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 void TestSetContentFailure() {
1228 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229
Peter Thatchera6d24442015-07-09 21:26:36 -07001230 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001231 std::unique_ptr<typename T::Content> content(
1232 CreateMediaContentWithStream(1));
1233
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001235 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001236 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001237 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001238 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001241 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001242 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001243
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001245 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001246 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 }
1248
1249 void TestSendTwoOffers() {
1250 CreateChannels(0, 0);
1251
Peter Thatchera6d24442015-07-09 21:26:36 -07001252 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001253 std::unique_ptr<typename T::Content> content1(
1254 CreateMediaContentWithStream(1));
1255 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001256 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1258
Steve Anton18ee1d52017-09-11 11:32:35 -07001259 std::unique_ptr<typename T::Content> content2(
1260 CreateMediaContentWithStream(2));
1261 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001262 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1264 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1265 }
1266
1267 void TestReceiveTwoOffers() {
1268 CreateChannels(0, 0);
1269
Peter Thatchera6d24442015-07-09 21:26:36 -07001270 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001271 std::unique_ptr<typename T::Content> content1(
1272 CreateMediaContentWithStream(1));
1273 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001274 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001275 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1276
Steve Anton18ee1d52017-09-11 11:32:35 -07001277 std::unique_ptr<typename T::Content> content2(
1278 CreateMediaContentWithStream(2));
1279 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001280 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001281 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1282 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1283 }
1284
1285 void TestSendPrAnswer() {
1286 CreateChannels(0, 0);
1287
Peter Thatchera6d24442015-07-09 21:26:36 -07001288 std::string err;
1289 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001290 std::unique_ptr<typename T::Content> content1(
1291 CreateMediaContentWithStream(1));
1292 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001293 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1295
Peter Thatchera6d24442015-07-09 21:26:36 -07001296 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001297 std::unique_ptr<typename T::Content> content2(
1298 CreateMediaContentWithStream(2));
1299 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001300 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001301 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1302 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1303
Peter Thatchera6d24442015-07-09 21:26:36 -07001304 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001305 std::unique_ptr<typename T::Content> content3(
1306 CreateMediaContentWithStream(3));
1307 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001308 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1310 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1311 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1312 }
1313
1314 void TestReceivePrAnswer() {
1315 CreateChannels(0, 0);
1316
Peter Thatchera6d24442015-07-09 21:26:36 -07001317 std::string err;
1318 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001319 std::unique_ptr<typename T::Content> content1(
1320 CreateMediaContentWithStream(1));
1321 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001322 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1324
Peter Thatchera6d24442015-07-09 21:26:36 -07001325 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001326 std::unique_ptr<typename T::Content> content2(
1327 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001328 EXPECT_TRUE(
1329 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1331 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1332
Peter Thatchera6d24442015-07-09 21:26:36 -07001333 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001334 std::unique_ptr<typename T::Content> content3(
1335 CreateMediaContentWithStream(3));
1336 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001337 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001338 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1339 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1340 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1341 }
1342
1343 void TestFlushRtcp() {
deadbeefac22f702017-01-12 21:59:29 -08001344 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 EXPECT_TRUE(SendInitiate());
1346 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001347 EXPECT_FALSE(channel1_->rtp_transport()->rtcp_mux_enabled());
1348 EXPECT_FALSE(channel2_->rtp_transport()->rtcp_mux_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349
1350 // Send RTCP1 from a different thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001351 ScopedCallThread send_rtcp([this] { SendRtcp1(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 // The sending message is only posted. channel2_ should be empty.
1353 EXPECT_TRUE(CheckNoRtcp2());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001354 rtc::Thread* wait_for[] = {send_rtcp.thread()};
1355 WaitForThreads(wait_for); // Ensure rtcp was posted
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001356
1357 // When channel1_ is deleted, the RTCP packet should be sent out to
1358 // channel2_.
1359 channel1_.reset();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001360 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 EXPECT_TRUE(CheckRtcp2());
1362 }
1363
zstein56162b92017-04-24 16:54:35 -07001364 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001365 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001367
zstein56162b92017-04-24 16:54:35 -07001368 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001369 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 EXPECT_TRUE(media_channel1_->ready_to_send());
1371
zstein56162b92017-04-24 16:54:35 -07001372 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001373 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001374 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001375 }
1376
skvladdc1c62c2016-03-16 19:07:43 -07001377 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1378 typename T::Content content;
1379 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1380 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001381 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001382 }
1383
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001384 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001385 webrtc::RtpParameters parameters;
1386 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001387 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001388 parameters.encodings.push_back(encoding);
1389 return parameters;
1390 }
1391
1392 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001393 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001394 EXPECT_EQ(1UL, parameters.encodings.size());
1395 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1396 }
1397
1398 void DefaultMaxBitrateIsUnlimited() {
1399 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001400 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1401 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001402 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001403 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001404 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001405 }
1406
Zhi Huange830e682018-03-30 10:48:35 -07001407 // Test that when a channel gets new RtpTransport with a call to
1408 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1409 // with the options on the new one.
1410
Steve Anton8a63f782017-10-23 13:08:53 -07001411 // For example, audio and video may use separate socket options, but initially
1412 // be unbundled, then later become bundled. When this happens, their preferred
1413 // socket options should be merged to the underlying transport they share.
1414 void SocketOptionsMergedOnSetTransport() {
1415 constexpr int kSndBufSize = 4000;
1416 constexpr int kRcvBufSize = 8000;
1417
Zhi Huange830e682018-03-30 10:48:35 -07001418 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001419
1420 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1421 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1422 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1423 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1424
Zhi Huange830e682018-03-30 10:48:35 -07001425 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001426 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001427 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001428
1429 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001430 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1431 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001432 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001433 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1434 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001435 EXPECT_EQ(kRcvBufSize, option_val);
1436 }
1437
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001438 void CreateSimulcastContent(const std::vector<std::string>& rids,
1439 typename T::Content* content) {
1440 std::vector<RidDescription> rid_descriptions;
1441 for (const std::string name : rids) {
1442 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1443 }
1444
1445 StreamParams stream;
1446 stream.set_rids(rid_descriptions);
1447 CreateContent(0, kPcmuCodec, kH264Codec, content);
1448 // This is for unified plan, so there can be only one StreamParams.
1449 content->mutable_streams().clear();
1450 content->AddStream(stream);
1451 }
1452
1453 void VerifySimulcastStreamParams(const StreamParams& expected,
1454 const typename T::Channel* channel) {
1455 const std::vector<StreamParams>& streams = channel->local_streams();
1456 ASSERT_EQ(1u, streams.size());
1457 const StreamParams& result = streams[0];
1458 EXPECT_EQ(expected.rids(), result.rids());
1459 EXPECT_TRUE(result.has_ssrcs());
1460 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1461 std::vector<uint32_t> primary_ssrcs;
1462 result.GetPrimarySsrcs(&primary_ssrcs);
1463 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1464 }
1465
1466 void TestUpdateLocalStreamsWithSimulcast() {
1467 CreateChannels(0, 0);
1468 typename T::Content content1, content2, content3;
1469 CreateSimulcastContent({"f", "h", "q"}, &content1);
1470 EXPECT_TRUE(
1471 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1472 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1473 StreamParams stream1 = channel1_->local_streams()[0];
1474
1475 // Create a similar offer. SetLocalContent should not remove and add.
1476 CreateSimulcastContent({"f", "h", "q"}, &content2);
1477 EXPECT_TRUE(
1478 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1479 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1480 StreamParams stream2 = channel1_->local_streams()[0];
1481 // Check that the streams are identical (SSRCs didn't change).
1482 EXPECT_EQ(stream1, stream2);
1483
1484 // Create third offer that has same RIDs in different order.
1485 CreateSimulcastContent({"f", "q", "h"}, &content3);
1486 EXPECT_TRUE(
1487 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1488 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1489 }
1490
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001492 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1493 static void ProcessThreadQueue(rtc::Thread* thread) {
1494 RTC_DCHECK(thread->IsCurrent());
1495 while (!thread->empty()) {
1496 thread->ProcessMessages(0);
1497 }
1498 }
1499 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1500 // |threads| and current thread post packets to network thread.
1501 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001502 thread->Invoke<void>(RTC_FROM_HERE,
1503 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001504 }
1505 ProcessThreadQueue(rtc::Thread::Current());
1506 // Network thread move them around and post back to worker = current thread.
1507 if (!network_thread_->IsCurrent()) {
1508 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001509 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001510 }
1511 // Worker thread = current Thread process received messages.
1512 ProcessThreadQueue(rtc::Thread::Current());
1513 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001514 // TODO(pbos): Remove playout from all media channels and let renderers mute
1515 // themselves.
1516 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001517 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1518 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001519 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1520 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1521 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1522 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1523 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1524 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1525 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1526 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001527 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1528 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1529 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 cricket::FakeMediaEngine media_engine_;
1531 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001532 typename T::MediaChannel* media_channel1_ = nullptr;
1533 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001534 std::unique_ptr<typename T::Channel> channel1_;
1535 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536 typename T::Content local_media_content1_;
1537 typename T::Content local_media_content2_;
1538 typename T::Content remote_media_content1_;
1539 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001541 rtc::Buffer rtp_packet_;
1542 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001543 int rtcp_mux_activated_callbacks1_ = 0;
1544 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001545 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001546 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547};
1548
Yves Gerey665174f2018-06-19 15:03:05 +02001549template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550void ChannelTest<VoiceTraits>::CreateContent(
1551 int flags,
1552 const cricket::AudioCodec& audio_codec,
1553 const cricket::VideoCodec& video_codec,
1554 cricket::AudioContentDescription* audio) {
1555 audio->AddCodec(audio_codec);
1556 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557}
1558
Yves Gerey665174f2018-06-19 15:03:05 +02001559template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560void ChannelTest<VoiceTraits>::CopyContent(
1561 const cricket::AudioContentDescription& source,
1562 cricket::AudioContentDescription* audio) {
1563 *audio = source;
1564}
1565
Yves Gerey665174f2018-06-19 15:03:05 +02001566template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1568 const cricket::AudioCodec& c2) {
1569 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001570 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571}
1572
Peter Boström0c4e06b2015-10-07 12:23:21 +02001573template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001574void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001575 uint32_t ssrc,
1576 int flags,
1577 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 audio->AddLegacyStream(ssrc);
1579}
1580
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001581class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 public:
solenberg1dd98f32015-09-10 01:57:14 -07001583 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001584 VoiceChannelSingleThreadTest()
1585 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1586};
1587
1588class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1589 public:
1590 typedef ChannelTest<VoiceTraits> Base;
1591 VoiceChannelDoubleThreadTest()
1592 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593};
1594
jbauch5869f502017-06-29 12:31:36 -07001595class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001596 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001597 public:
1598 typedef ChannelTest<VoiceTraits> Base;
1599 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001600 : Base(true,
1601 kPcmuFrameWithExtensions,
1602 kRtcpReport,
1603 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001604};
1605
1606class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001607 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001608 public:
1609 typedef ChannelTest<VoiceTraits> Base;
1610 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001611 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1612 }
jbauch5869f502017-06-29 12:31:36 -07001613};
1614
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001616template <>
Steve Anton8699a322017-11-06 15:53:33 -08001617std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618 rtc::Thread* worker_thread,
1619 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001620 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001621 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001622 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001623 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02001624 auto channel = absl::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001625 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001626 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1627 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001628 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629 return channel;
1630}
1631
Yves Gerey665174f2018-06-19 15:03:05 +02001632template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633void ChannelTest<VideoTraits>::CreateContent(
1634 int flags,
1635 const cricket::AudioCodec& audio_codec,
1636 const cricket::VideoCodec& video_codec,
1637 cricket::VideoContentDescription* video) {
1638 video->AddCodec(video_codec);
1639 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640}
1641
Yves Gerey665174f2018-06-19 15:03:05 +02001642template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643void ChannelTest<VideoTraits>::CopyContent(
1644 const cricket::VideoContentDescription& source,
1645 cricket::VideoContentDescription* video) {
1646 *video = source;
1647}
1648
Yves Gerey665174f2018-06-19 15:03:05 +02001649template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001650bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1651 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001652 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653}
1654
Peter Boström0c4e06b2015-10-07 12:23:21 +02001655template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001657 uint32_t ssrc,
1658 int flags,
1659 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 video->AddLegacyStream(ssrc);
1661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 public:
solenberg1dd98f32015-09-10 01:57:14 -07001665 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666 VideoChannelSingleThreadTest()
1667 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668};
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1671 public:
1672 typedef ChannelTest<VideoTraits> Base;
1673 VideoChannelDoubleThreadTest()
1674 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1675};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001677TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 Base::TestInit();
1679 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1680 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1681}
1682
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001683TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1684 Base::TestDeinit();
1685}
1686
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001687TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 Base::TestSetContents();
1689}
1690
Johannes Kron9190b822018-10-29 11:22:05 +01001691TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1692 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1693}
1694
1695TEST_F(VoiceChannelSingleThreadTest,
1696 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1697 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1698}
1699
1700TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1701 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1702}
1703
1704TEST_F(VoiceChannelSingleThreadTest,
1705 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1706 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1707}
1708
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001709TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 Base::TestSetContentsNullOffer();
1711}
1712
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 Base::TestSetContentsRtcpMux();
1715}
1716
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001717TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 Base::TestSetContentsRtcpMux();
1719}
1720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001721TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722 Base::TestChangeStreamParamsInContent();
1723}
1724
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001725TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 Base::TestPlayoutAndSendingStates();
1727}
1728
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001729TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730 Base::TestMediaContentDirection();
1731}
1732
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001733TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001734 Base::TestNetworkRouteChanges();
1735}
1736
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001737TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 Base::TestCallSetup();
1739}
1740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 Base::TestCallTeardownRtcpMux();
1743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 Base::SendRtpToRtp();
1747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 Base::SendRtcpToRtcp();
1751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001754 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755}
1756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001757TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001758 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001759}
1760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001761TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1763}
1764
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001765TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 Base::SendRtpToRtpOnThread();
1767}
1768
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001769TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 Base::SendWithWritabilityLoss();
1771}
1772
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001773TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 Base::TestSetContentFailure();
1775}
1776
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001777TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001778 Base::TestSendTwoOffers();
1779}
1780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001782 Base::TestReceiveTwoOffers();
1783}
1784
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001785TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786 Base::TestSendPrAnswer();
1787}
1788
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 Base::TestReceivePrAnswer();
1791}
1792
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001793TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 Base::TestFlushRtcp();
1795}
1796
zstein56162b92017-04-24 16:54:35 -07001797TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1798 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799}
1800
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001801TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001802 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803}
1804
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001805TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001806 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001807}
1808
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001809TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001810 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001811}
1812
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001813TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001814 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815}
1816
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001817TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001818 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001819}
1820
Steve Anton8a63f782017-10-23 13:08:53 -07001821TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1822 Base::SocketOptionsMergedOnSetTransport();
1823}
1824
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001825// VoiceChannelDoubleThreadTest
1826TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001828 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1829 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830}
1831
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001832TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1833 Base::TestDeinit();
1834}
1835
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001836TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837 Base::TestSetContents();
1838}
1839
Johannes Kron9190b822018-10-29 11:22:05 +01001840TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1841 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1842}
1843
1844TEST_F(VoiceChannelDoubleThreadTest,
1845 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1846 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1847}
1848
1849TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1850 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1851}
1852
1853TEST_F(VoiceChannelDoubleThreadTest,
1854 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1855 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1856}
1857
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001858TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 Base::TestSetContentsNullOffer();
1860}
1861
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001862TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 Base::TestSetContentsRtcpMux();
1864}
1865
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001866TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867 Base::TestSetContentsRtcpMux();
1868}
1869
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001870TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871 Base::TestChangeStreamParamsInContent();
1872}
1873
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001874TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001875 Base::TestPlayoutAndSendingStates();
1876}
1877
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001878TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1879 Base::TestMediaContentDirection();
1880}
1881
1882TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1883 Base::TestNetworkRouteChanges();
1884}
1885
1886TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1887 Base::TestCallSetup();
1888}
1889
1890TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1891 Base::TestCallTeardownRtcpMux();
1892}
1893
1894TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1895 Base::SendRtpToRtp();
1896}
1897
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001898TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
1899 Base::SendRtcpToRtcp();
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001903 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001904}
1905
1906TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001907 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001908}
1909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001910TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1911 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1912}
1913
1914TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1915 Base::SendRtpToRtpOnThread();
1916}
1917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1919 Base::SendWithWritabilityLoss();
1920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1923 Base::TestSetContentFailure();
1924}
1925
1926TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1927 Base::TestSendTwoOffers();
1928}
1929
1930TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1931 Base::TestReceiveTwoOffers();
1932}
1933
1934TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1935 Base::TestSendPrAnswer();
1936}
1937
1938TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1939 Base::TestReceivePrAnswer();
1940}
1941
1942TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
1943 Base::TestFlushRtcp();
1944}
1945
zstein56162b92017-04-24 16:54:35 -07001946TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1947 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1951 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1952}
1953
1954TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1955 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1956}
1957
1958TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1959 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1960}
1961
1962TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1963 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1964}
1965
1966TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1967 Base::DefaultMaxBitrateIsUnlimited();
1968}
1969
Steve Anton8a63f782017-10-23 13:08:53 -07001970TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1971 Base::SocketOptionsMergedOnSetTransport();
1972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974// VideoChannelSingleThreadTest
1975TEST_F(VideoChannelSingleThreadTest, TestInit) {
1976 Base::TestInit();
1977}
1978
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001979TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1980 Base::TestDeinit();
1981}
1982
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001983TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1984 Base::TestSetContents();
1985}
1986
Johannes Kron9190b822018-10-29 11:22:05 +01001987TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1988 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1989}
1990
1991TEST_F(VideoChannelSingleThreadTest,
1992 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1993 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1994}
1995
1996TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1997 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1998}
1999
2000TEST_F(VideoChannelSingleThreadTest,
2001 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2002 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2003}
2004
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002005TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
2006 Base::TestSetContentsNullOffer();
2007}
2008
2009TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
2010 Base::TestSetContentsRtcpMux();
2011}
2012
2013TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2014 Base::TestSetContentsRtcpMux();
2015}
2016
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002017TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
2018 Base::TestChangeStreamParamsInContent();
2019}
2020
2021TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
2022 Base::TestPlayoutAndSendingStates();
2023}
2024
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002025TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 Base::TestMediaContentDirection();
2027}
2028
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002029TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07002030 Base::TestNetworkRouteChanges();
2031}
2032
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002033TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034 Base::TestCallSetup();
2035}
2036
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002037TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038 Base::TestCallTeardownRtcpMux();
2039}
2040
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002041TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002042 Base::SendRtpToRtp();
2043}
2044
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002045TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002046 Base::SendRtcpToRtcp();
2047}
2048
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002049TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002050 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051}
2052
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002053TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002054 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055}
2056
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002057TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2059}
2060
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002061TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 Base::SendRtpToRtpOnThread();
2063}
2064
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002065TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066 Base::SendWithWritabilityLoss();
2067}
2068
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002069TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 Base::TestSetContentFailure();
2071}
2072
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002073TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074 Base::TestSendTwoOffers();
2075}
2076
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002077TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002078 Base::TestReceiveTwoOffers();
2079}
2080
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002081TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002082 Base::TestSendPrAnswer();
2083}
2084
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002085TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086 Base::TestReceivePrAnswer();
2087}
2088
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002089TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 Base::TestFlushRtcp();
2091}
2092
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002093TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08002094 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095}
2096
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002097TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002098 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002099}
2100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08002102 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00002103}
2104
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002105TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08002106 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002107}
2108
zstein56162b92017-04-24 16:54:35 -07002109TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
2110 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111}
2112
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002113TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07002114 Base::DefaultMaxBitrateIsUnlimited();
2115}
2116
Steve Anton8a63f782017-10-23 13:08:53 -07002117TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2118 Base::SocketOptionsMergedOnSetTransport();
2119}
2120
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002121TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2122 Base::TestUpdateLocalStreamsWithSimulcast();
2123}
2124
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02002125TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2126 const cricket::VideoCodec kVp8Codec(97, "VP8");
2127 cricket::VideoCodec vp9_codec(98, "VP9");
2128 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2129 cricket::VideoContentDescription video;
2130 video.set_codecs({kVp8Codec, vp9_codec});
2131
2132 CreateChannels(0, 0);
2133
2134 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2135 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2136 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2137 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2138 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2139 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2140 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2141 cricket::kPacketizationParamRaw);
2142}
2143
2144TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2145 const cricket::VideoCodec kVp8Codec(97, "VP8");
2146 cricket::VideoCodec vp9_codec(98, "VP9");
2147 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2148 cricket::VideoContentDescription video;
2149 video.set_codecs({kVp8Codec, vp9_codec});
2150
2151 CreateChannels(0, 0);
2152
2153 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2154 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2155 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2156 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2157 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2158 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2159 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2160 cricket::kPacketizationParamRaw);
2161}
2162
2163TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2164 const cricket::VideoCodec kVp8Codec(97, "VP8");
2165 cricket::VideoCodec vp9_codec(98, "VP9");
2166 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2167 cricket::VideoContentDescription video;
2168 video.set_codecs({kVp8Codec, vp9_codec});
2169
2170 CreateChannels(0, 0);
2171
2172 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2173 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2174 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2175 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2176 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2177 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2178 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2179 cricket::kPacketizationParamRaw);
2180 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2181 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2182 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2183 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2184 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2185 cricket::kPacketizationParamRaw);
2186}
2187
2188TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2189 const cricket::VideoCodec kLocalCodec(98, "VP8");
2190 cricket::VideoCodec remote_codec(99, "VP8");
2191 remote_codec.packetization = cricket::kPacketizationParamRaw;
2192 cricket::VideoContentDescription local_video;
2193 local_video.set_codecs({kLocalCodec});
2194 cricket::VideoContentDescription remote_video;
2195 remote_video.set_codecs({remote_codec});
2196
2197 CreateChannels(0, 0);
2198
2199 EXPECT_TRUE(
2200 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2201 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2202 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2203 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2204 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2205 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2206}
2207
2208TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2209 cricket::VideoCodec local_codec(98, "VP8");
2210 local_codec.packetization = cricket::kPacketizationParamRaw;
2211 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2212 cricket::VideoContentDescription local_video;
2213 local_video.set_codecs({local_codec});
2214 cricket::VideoContentDescription remote_video;
2215 remote_video.set_codecs({kRemoteCodec});
2216
2217 CreateChannels(0, 0);
2218
2219 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2220 EXPECT_TRUE(
2221 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2222 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2223 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2224 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2225 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2226}
2227
2228TEST_F(VideoChannelSingleThreadTest,
2229 TestSetRemoteAnswerWithInvalidPacketization) {
2230 cricket::VideoCodec local_codec(98, "VP8");
2231 local_codec.packetization = cricket::kPacketizationParamRaw;
2232 cricket::VideoCodec remote_codec(99, "VP8");
2233 remote_codec.packetization = "unknownpacketizationattributevalue";
2234 cricket::VideoContentDescription local_video;
2235 local_video.set_codecs({local_codec});
2236 cricket::VideoContentDescription remote_video;
2237 remote_video.set_codecs({remote_codec});
2238
2239 CreateChannels(0, 0);
2240
2241 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2242 EXPECT_FALSE(
2243 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2244 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2245 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2246 cricket::kPacketizationParamRaw);
2247 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2248}
2249
2250TEST_F(VideoChannelSingleThreadTest,
2251 TestSetLocalAnswerWithInvalidPacketization) {
2252 cricket::VideoCodec local_codec(98, "VP8");
2253 local_codec.packetization = cricket::kPacketizationParamRaw;
2254 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2255 cricket::VideoContentDescription local_video;
2256 local_video.set_codecs({local_codec});
2257 cricket::VideoContentDescription remote_video;
2258 remote_video.set_codecs({kRemoteCodec});
2259
2260 CreateChannels(0, 0);
2261
2262 EXPECT_TRUE(
2263 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2264 EXPECT_FALSE(
2265 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2266 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2267 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2268 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2269}
2270
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271// VideoChannelDoubleThreadTest
2272TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2273 Base::TestInit();
2274}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002276TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2277 Base::TestDeinit();
2278}
2279
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2281 Base::TestSetContents();
2282}
2283
Johannes Kron9190b822018-10-29 11:22:05 +01002284TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2285 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2286}
2287
2288TEST_F(VideoChannelDoubleThreadTest,
2289 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2290 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2291}
2292
2293TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2294 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2295}
2296
2297TEST_F(VideoChannelDoubleThreadTest,
2298 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2299 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2300}
2301
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002302TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2303 Base::TestSetContentsNullOffer();
2304}
2305
2306TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2307 Base::TestSetContentsRtcpMux();
2308}
2309
2310TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2311 Base::TestSetContentsRtcpMux();
2312}
2313
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002314TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2315 Base::TestChangeStreamParamsInContent();
2316}
2317
2318TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2319 Base::TestPlayoutAndSendingStates();
2320}
2321
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002322TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2323 Base::TestMediaContentDirection();
2324}
2325
2326TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2327 Base::TestNetworkRouteChanges();
2328}
2329
2330TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2331 Base::TestCallSetup();
2332}
2333
2334TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2335 Base::TestCallTeardownRtcpMux();
2336}
2337
2338TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2339 Base::SendRtpToRtp();
2340}
2341
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002342TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
2343 Base::SendRtcpToRtcp();
2344}
2345
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002346TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002347 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002348}
2349
2350TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002351 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002352}
2353
2354TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2355 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2356}
2357
2358TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2359 Base::SendRtpToRtpOnThread();
2360}
2361
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002362TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2363 Base::SendWithWritabilityLoss();
2364}
2365
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002366TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2367 Base::TestSetContentFailure();
2368}
2369
2370TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2371 Base::TestSendTwoOffers();
2372}
2373
2374TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2375 Base::TestReceiveTwoOffers();
2376}
2377
2378TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2379 Base::TestSendPrAnswer();
2380}
2381
2382TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2383 Base::TestReceivePrAnswer();
2384}
2385
2386TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
2387 Base::TestFlushRtcp();
2388}
2389
2390TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2391 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2392}
2393
2394TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2395 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2396}
2397
2398TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2399 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2400}
2401
2402TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2403 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2404}
2405
zstein56162b92017-04-24 16:54:35 -07002406TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2407 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002408}
2409
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002410TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2411 Base::DefaultMaxBitrateIsUnlimited();
2412}
2413
Steve Anton8a63f782017-10-23 13:08:53 -07002414TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2415 Base::SocketOptionsMergedOnSetTransport();
2416}
2417
deadbeef953c2ce2017-01-09 14:53:41 -08002418// RtpDataChannelSingleThreadTest
2419class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002421 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002422 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002423 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2424};
2425
deadbeef953c2ce2017-01-09 14:53:41 -08002426// RtpDataChannelDoubleThreadTest
2427class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002428 public:
2429 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002430 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432};
2433
2434// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002435template <>
Steve Anton8699a322017-11-06 15:53:33 -08002436std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437 rtc::Thread* worker_thread,
2438 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002439 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002440 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002441 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002442 rtc::Thread* signaling_thread = rtc::Thread::Current();
Karl Wiberg918f50c2018-07-05 11:40:33 +02002443 auto channel = absl::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002444 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002445 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2446 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002447 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 return channel;
2449}
2450
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452void ChannelTest<DataTraits>::CreateContent(
2453 int flags,
2454 const cricket::AudioCodec& audio_codec,
2455 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002456 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002457 data->AddCodec(kGoogleDataCodec);
2458 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459}
2460
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002461template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002463 const cricket::RtpDataContentDescription& source,
2464 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 *data = source;
2466}
2467
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002468template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2470 const cricket::DataCodec& c2) {
2471 return c1.name == c2.name;
2472}
2473
Peter Boström0c4e06b2015-10-07 12:23:21 +02002474template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002476 uint32_t ssrc,
2477 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002478 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 data->AddLegacyStream(ssrc);
2480}
2481
deadbeef953c2ce2017-01-09 14:53:41 -08002482TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483 Base::TestInit();
2484 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2485}
2486
deadbeef953c2ce2017-01-09 14:53:41 -08002487TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002488 Base::TestDeinit();
2489}
2490
deadbeef953c2ce2017-01-09 14:53:41 -08002491TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 Base::TestSetContents();
2493}
2494
deadbeef953c2ce2017-01-09 14:53:41 -08002495TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 Base::TestSetContentsNullOffer();
2497}
2498
deadbeef953c2ce2017-01-09 14:53:41 -08002499TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 Base::TestSetContentsRtcpMux();
2501}
2502
deadbeef953c2ce2017-01-09 14:53:41 -08002503TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 Base::TestChangeStreamParamsInContent();
2505}
2506
deadbeef953c2ce2017-01-09 14:53:41 -08002507TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 Base::TestPlayoutAndSendingStates();
2509}
2510
deadbeef953c2ce2017-01-09 14:53:41 -08002511TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 Base::TestMediaContentDirection();
2513}
2514
deadbeef953c2ce2017-01-09 14:53:41 -08002515TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 Base::TestCallSetup();
2517}
2518
deadbeef953c2ce2017-01-09 14:53:41 -08002519TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 Base::TestCallTeardownRtcpMux();
2521}
2522
zstein56162b92017-04-24 16:54:35 -07002523TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2524 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525}
2526
deadbeef953c2ce2017-01-09 14:53:41 -08002527TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 Base::SendRtpToRtp();
2529}
2530
deadbeef953c2ce2017-01-09 14:53:41 -08002531TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 Base::SendRtcpToRtcp();
2533}
2534
deadbeef953c2ce2017-01-09 14:53:41 -08002535TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 Base::SendRtpToRtpOnThread();
2537}
2538
deadbeef953c2ce2017-01-09 14:53:41 -08002539TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 Base::SendWithWritabilityLoss();
2541}
2542
Steve Anton8a63f782017-10-23 13:08:53 -07002543TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2544 Base::SocketOptionsMergedOnSetTransport();
2545}
2546
deadbeef953c2ce2017-01-09 14:53:41 -08002547TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002548 CreateChannels(0, 0);
2549 EXPECT_TRUE(SendInitiate());
2550 EXPECT_TRUE(SendAccept());
2551
2552 cricket::SendDataParams params;
2553 params.ssrc = 42;
2554 unsigned char data[] = {'f', 'o', 'o'};
2555 rtc::CopyOnWriteBuffer payload(data, 3);
2556 cricket::SendDataResult result;
2557 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2558 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2559 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2560}
2561
deadbeef953c2ce2017-01-09 14:53:41 -08002562TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002563 Base::TestInit();
2564 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2565}
2566
deadbeef953c2ce2017-01-09 14:53:41 -08002567TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002568 Base::TestDeinit();
2569}
2570
deadbeef953c2ce2017-01-09 14:53:41 -08002571TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002572 Base::TestSetContents();
2573}
2574
deadbeef953c2ce2017-01-09 14:53:41 -08002575TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002576 Base::TestSetContentsNullOffer();
2577}
2578
deadbeef953c2ce2017-01-09 14:53:41 -08002579TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002580 Base::TestSetContentsRtcpMux();
2581}
2582
deadbeef953c2ce2017-01-09 14:53:41 -08002583TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002584 Base::TestChangeStreamParamsInContent();
2585}
2586
deadbeef953c2ce2017-01-09 14:53:41 -08002587TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002588 Base::TestPlayoutAndSendingStates();
2589}
2590
deadbeef953c2ce2017-01-09 14:53:41 -08002591TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002592 Base::TestMediaContentDirection();
2593}
2594
deadbeef953c2ce2017-01-09 14:53:41 -08002595TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002596 Base::TestCallSetup();
2597}
2598
deadbeef953c2ce2017-01-09 14:53:41 -08002599TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002600 Base::TestCallTeardownRtcpMux();
2601}
2602
zstein56162b92017-04-24 16:54:35 -07002603TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2604 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002605}
2606
deadbeef953c2ce2017-01-09 14:53:41 -08002607TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002608 Base::SendRtpToRtp();
2609}
2610
deadbeef953c2ce2017-01-09 14:53:41 -08002611TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002612 Base::SendRtcpToRtcp();
2613}
2614
deadbeef953c2ce2017-01-09 14:53:41 -08002615TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002616 Base::SendRtpToRtpOnThread();
2617}
2618
deadbeef953c2ce2017-01-09 14:53:41 -08002619TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002620 Base::SendWithWritabilityLoss();
2621}
2622
Steve Anton8a63f782017-10-23 13:08:53 -07002623TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2624 Base::SocketOptionsMergedOnSetTransport();
2625}
2626
deadbeef953c2ce2017-01-09 14:53:41 -08002627TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 CreateChannels(0, 0);
2629 EXPECT_TRUE(SendInitiate());
2630 EXPECT_TRUE(SendAccept());
2631
2632 cricket::SendDataParams params;
2633 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002634 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002635 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 cricket::SendDataResult result;
2637 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002638 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2640}
2641
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002642// TODO(pthatcher): TestSetReceiver?