blob: d88b70681e23aaa55c4871bce3987fc7c43978ea [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_parameters.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020020#include "api/transport/media/media_transport_config.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "media/base/fake_media_engine.h"
23#include "media/base/fake_rtp.h"
24#include "media/base/media_channel.h"
25#include "p2p/base/candidate_pair_interface.h"
26#include "p2p/base/fake_dtls_transport.h"
27#include "p2p/base/fake_packet_transport.h"
28#include "p2p/base/ice_transport_internal.h"
29#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "pc/dtls_srtp_transport.h"
31#include "pc/jsep_transport.h"
32#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020036#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "rtc_base/rtc_certificate.h"
38#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020039#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041
zhihuangb2cdd932017-01-19 16:54:25 -080042using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080044using cricket::RidDescription;
45using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080047using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080048using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049
Danil Chapovalov33b01f22016-05-11 19:55:27 +020050namespace {
51const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
52const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
53const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070054const cricket::VideoCodec kH264Codec(97, "H264");
55const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020056const cricket::DataCodec kGoogleDataCodec(101, "google-data");
57const uint32_t kSsrc1 = 0x1111;
58const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070059const uint32_t kSsrc3 = 0x3333;
60const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020061const int kAudioPts[] = {0, 8};
62const int kVideoPts[] = {97, 99};
63enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010064
Danil Chapovalov33b01f22016-05-11 19:55:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
deadbeefcbecd352015-09-23 11:50:27 -070067template <class ChannelT,
68 class MediaChannelT,
69 class ContentT,
70 class CodecT,
71 class MediaInfoT,
72 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073class Traits {
74 public:
75 typedef ChannelT Channel;
76 typedef MediaChannelT MediaChannel;
77 typedef ContentT Content;
78 typedef CodecT Codec;
79 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081};
82
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083class VoiceTraits : public Traits<cricket::VoiceChannel,
84 cricket::FakeVoiceMediaChannel,
85 cricket::AudioContentDescription,
86 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070088 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
90class VideoTraits : public Traits<cricket::VideoChannel,
91 cricket::FakeVideoMediaChannel,
92 cricket::VideoContentDescription,
93 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020094 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070095 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096
deadbeef953c2ce2017-01-09 14:53:41 -080097class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020099 cricket::RtpDataContentDescription,
100 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200101 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700102 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103
deadbeef953c2ce2017-01-09 14:53:41 -0800104// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200105template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200106class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107 public:
deadbeefac22f702017-01-12 21:59:29 -0800108 enum Flags {
109 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800110 SSRC_MUX = 0x8,
111 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800112 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800113 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700114 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800115 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116
Peter Boström34fbfff2015-09-24 19:20:30 +0200117 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200118 rtc::ArrayView<const uint8_t> rtp_data,
119 rtc::ArrayView<const uint8_t> rtcp_data,
120 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200121 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200122 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800123 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200124 if (network_is_worker == NetworkIsWorker::Yes) {
125 network_thread_ = rtc::Thread::Current();
126 } else {
127 network_thread_keeper_ = rtc::Thread::Create();
128 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200129 network_thread_ = network_thread_keeper_.get();
130 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200134 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800135 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200136 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800137 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200138 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Steve Anton8699a322017-11-06 15:53:33 -0800140 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
141 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200142 int flags1,
143 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800144 // Network thread is started in CreateChannels, to allow the test to
145 // configure a fake clock before any threads are spawned and attempt to
146 // access the time.
147 if (network_thread_keeper_) {
148 network_thread_keeper_->Start();
149 }
Zhi Huange830e682018-03-30 10:48:35 -0700150
deadbeeff5346592017-01-24 21:51:21 -0800151 // Make sure if using raw packet transports, they're used for both
152 // channels.
153 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200154 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800155 media_channel1_ = ch1.get();
156 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800157 rtc::PacketTransportInternal* rtp1 = nullptr;
158 rtc::PacketTransportInternal* rtcp1 = nullptr;
159 rtc::PacketTransportInternal* rtp2 = nullptr;
160 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800161 // Based on flags, create fake DTLS or raw packet transports.
162 if (flags1 & RAW_PACKET_TRANSPORT) {
163 fake_rtp_packet_transport1_.reset(
164 new rtc::FakePacketTransport("channel1_rtp"));
165 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700166 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800167 fake_rtcp_packet_transport1_.reset(
168 new rtc::FakePacketTransport("channel1_rtcp"));
169 rtcp1 = fake_rtcp_packet_transport1_.get();
170 }
171 } else {
172 // Confirmed to work with KT_RSA and KT_ECDSA.
173 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
174 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
175 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700176 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800177 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
178 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
179 rtcp1 = fake_rtcp_dtls_transport1_.get();
180 }
181 if (flags1 & DTLS) {
182 auto cert1 =
183 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
184 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
185 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
186 if (fake_rtcp_dtls_transport1_) {
187 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
188 }
189 }
190 }
191 // Based on flags, create fake DTLS or raw packet transports.
192 if (flags2 & RAW_PACKET_TRANSPORT) {
193 fake_rtp_packet_transport2_.reset(
194 new rtc::FakePacketTransport("channel2_rtp"));
195 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700196 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800197 fake_rtcp_packet_transport2_.reset(
198 new rtc::FakePacketTransport("channel2_rtcp"));
199 rtcp2 = fake_rtcp_packet_transport2_.get();
200 }
201 } else {
202 // Confirmed to work with KT_RSA and KT_ECDSA.
203 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
204 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
205 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700206 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800207 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
208 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
209 rtcp2 = fake_rtcp_dtls_transport2_.get();
210 }
211 if (flags2 & DTLS) {
212 auto cert2 =
213 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
214 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
215 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
216 if (fake_rtcp_dtls_transport2_) {
217 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
218 }
219 }
220 }
Zhi Huange830e682018-03-30 10:48:35 -0700221 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
222 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
223 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
224 flags1);
225 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
226 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
227 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
228 flags2);
229
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800230 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
231 rtp_transport1_.get(), flags1);
232 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
233 rtp_transport2_.get(), flags2);
deadbeefac22f702017-01-12 21:59:29 -0800234 channel1_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800235 this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
deadbeefac22f702017-01-12 21:59:29 -0800236 channel2_->SignalRtcpMuxFullyActive.connect(
deadbeeff5346592017-01-24 21:51:21 -0800237 this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
Yves Gerey665174f2018-06-19 15:03:05 +0200238 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
239 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240 CopyContent(local_media_content1_, &remote_media_content1_);
241 CopyContent(local_media_content2_, &remote_media_content2_);
242
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 // Add stream information (SSRC) to the local content but not to the remote
244 // content. This means that we per default know the SSRC of what we send but
245 // not what we receive.
246 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
247 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
248
249 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
250 if (flags1 & SSRC_MUX) {
251 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
252 }
253 if (flags2 & SSRC_MUX) {
254 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
255 }
256 }
Steve Anton8699a322017-11-06 15:53:33 -0800257 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200258 rtc::Thread* worker_thread,
259 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800260 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700261 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200262 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263
Zhi Huange830e682018-03-30 10:48:35 -0700264 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
265 rtc::PacketTransportInternal* rtp_packet_transport,
266 rtc::PacketTransportInternal* rtcp_packet_transport,
267 DtlsTransportInternal* rtp_dtls_transport,
268 DtlsTransportInternal* rtcp_dtls_transport,
269 int flags) {
270 if (flags & RTCP_MUX) {
271 rtcp_packet_transport = nullptr;
272 rtcp_dtls_transport = nullptr;
273 }
274
275 if (flags & DTLS) {
276 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
277 } else {
278 if (flags & RAW_PACKET_TRANSPORT) {
279 return CreateUnencryptedTransport(rtp_packet_transport,
280 rtcp_packet_transport);
281 } else {
282 return CreateUnencryptedTransport(rtp_dtls_transport,
283 rtcp_dtls_transport);
284 }
285 }
286 }
287
288 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
289 rtc::PacketTransportInternal* rtp_packet_transport,
290 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200291 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200292 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700293
294 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
295 if (rtcp_packet_transport) {
296 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
297 }
298 return rtp_transport;
299 }
300
301 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
302 cricket::DtlsTransportInternal* rtp_dtls_transport,
303 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200304 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700305 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700306
307 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
308 rtcp_dtls_transport);
309 return dtls_srtp_transport;
310 }
311
deadbeeff5346592017-01-24 21:51:21 -0800312 void ConnectFakeTransports() {
313 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
314 bool asymmetric = false;
315 // Depending on test flags, could be using DTLS or raw packet transport.
316 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
317 fake_rtp_dtls_transport1_->SetDestination(
318 fake_rtp_dtls_transport2_.get(), asymmetric);
319 }
320 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
321 fake_rtcp_dtls_transport1_->SetDestination(
322 fake_rtcp_dtls_transport2_.get(), asymmetric);
323 }
324 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
325 fake_rtp_packet_transport1_->SetDestination(
326 fake_rtp_packet_transport2_.get(), asymmetric);
327 }
328 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
329 fake_rtcp_packet_transport1_->SetDestination(
330 fake_rtcp_packet_transport2_.get(), asymmetric);
331 }
332 });
333 }
334
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000336 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800337 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 if (result) {
339 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000340 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800341 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800343 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000344 result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800345 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346 }
347 }
348 return result;
349 }
350
351 bool SendAccept() {
352 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000353 return channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800354 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 }
356
357 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000358 bool result = channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800359 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 if (result) {
361 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000362 result = channel2_->SetRemoteContent(&remote_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800363 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 }
365 return result;
366 }
367
368 bool SendProvisionalAnswer() {
369 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800370 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 if (result) {
372 channel2_->Enable(true);
373 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800374 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800375 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 }
377 return result;
378 }
379
380 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 bool result = channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000384 result = channel1_->SetRemoteContent(&remote_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800385 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 return result;
387 }
388
deadbeeff5346592017-01-24 21:51:21 -0800389 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 channel1_.reset();
391 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800392 fake_rtp_dtls_transport1_.reset();
393 fake_rtcp_dtls_transport1_.reset();
394 fake_rtp_dtls_transport2_.reset();
395 fake_rtcp_dtls_transport2_.reset();
396 fake_rtp_packet_transport1_.reset();
397 fake_rtcp_packet_transport1_.reset();
398 fake_rtp_packet_transport2_.reset();
399 fake_rtcp_packet_transport2_.reset();
400 if (network_thread_keeper_) {
401 network_thread_keeper_.reset();
402 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 return true;
404 }
405
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200406 void SendRtp1() {
407 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
408 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200410 void SendRtp2() {
411 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
412 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200415 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
416 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
417 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200419 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
420 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
421 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200423
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
427 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200428 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200431 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
433 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200435 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
437 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
440 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::SetBE32(data.data() + 8, ssrc);
443 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000444 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200445 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000446 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447 return data;
448 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
Yves Gerey665174f2018-06-19 15:03:05 +0200450 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
451 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452
453 void CreateContent(int flags,
454 const cricket::AudioCodec& audio_codec,
455 const cricket::VideoCodec& video_codec,
456 typename T::Content* content) {
457 // overridden in specialized classes
458 }
459 void CopyContent(const typename T::Content& source,
460 typename T::Content* content) {
461 // overridden in specialized classes
462 }
463
Steve Anton18ee1d52017-09-11 11:32:35 -0700464 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700466 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
467 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700468 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700469 AddLegacyStreamInContent(ssrc, 0, content);
470 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 }
472
ossu292d6582016-03-17 02:31:13 -0700473 // Will manage the lifetime of a CallThread, making sure it's
474 // destroyed before this object goes out of scope.
475 class ScopedCallThread {
476 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200477 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100478 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200479 : thread_(rtc::Thread::Create()),
Artem Titovd8bd7502019-01-09 21:10:00 +0100480 task_(new rtc::FunctorMessageHandler<void, FunctorT>(
481 std::forward<FunctorT>(functor))) {
ossu292d6582016-03-17 02:31:13 -0700482 thread_->Start();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700483 thread_->Post(RTC_FROM_HERE, task_.get());
ossu292d6582016-03-17 02:31:13 -0700484 }
485
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700487
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200488 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700489
490 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200491 std::unique_ptr<rtc::Thread> thread_;
492 std::unique_ptr<rtc::MessageHandler> task_;
ossu292d6582016-03-17 02:31:13 -0700493 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
496 return false; // overridden in specialized classes
497 }
498
deadbeeff5346592017-01-24 21:51:21 -0800499 void OnRtcpMuxFullyActive1(const std::string&) {
500 rtcp_mux_activated_callbacks1_++;
501 }
502 void OnRtcpMuxFullyActive2(const std::string&) {
503 rtcp_mux_activated_callbacks2_++;
504 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505
Honghai Zhangcc411c02016-03-29 17:27:21 -0700506 cricket::CandidatePairInterface* last_selected_candidate_pair() {
507 return last_selected_candidate_pair_;
508 }
509
Peter Boström0c4e06b2015-10-07 12:23:21 +0200510 void AddLegacyStreamInContent(uint32_t ssrc,
511 int flags,
512 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 // Base implementation.
514 }
515
516 // Tests that can be used by derived classes.
517
518 // Basic sanity check.
519 void TestInit() {
520 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700521 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000522 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200523 if (verify_playout_) {
524 EXPECT_FALSE(media_channel1_->playout());
525 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 EXPECT_TRUE(media_channel1_->codecs().empty());
527 EXPECT_TRUE(media_channel1_->recv_streams().empty());
528 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529 }
530
531 // Test that SetLocalContent and SetRemoteContent properly configure
532 // the codecs.
533 void TestSetContents() {
534 CreateChannels(0, 0);
535 typename T::Content content;
536 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800537 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800539 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200541 EXPECT_TRUE(
542 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 }
544
Johannes Kron9190b822018-10-29 11:22:05 +0100545 // Test that SetLocalContent and SetRemoteContent properly configure
546 // extmap-allow-mixed.
547 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
548 // For a caller, SetLocalContent() is called first with an offer and next
549 // SetRemoteContent() is called with the answer.
550 CreateChannels(0, 0);
551 typename T::Content content;
552 CreateContent(0, kPcmuCodec, kH264Codec, &content);
553 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
554 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
555 content.set_extmap_allow_mixed_enum(offer_enum);
556 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
557 content.set_extmap_allow_mixed_enum(answer_enum);
558 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
559 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
560 }
561 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
562 // For a callee, SetRemoteContent() is called first with an offer and next
563 // SetLocalContent() is called with the answer.
564 CreateChannels(0, 0);
565 typename T::Content content;
566 CreateContent(0, kPcmuCodec, kH264Codec, &content);
567 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
568 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
569 content.set_extmap_allow_mixed_enum(offer_enum);
570 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
571 content.set_extmap_allow_mixed_enum(answer_enum);
572 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
573 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
574 }
575
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 // Test that SetLocalContent and SetRemoteContent properly deals
577 // with an empty offer.
578 void TestSetContentsNullOffer() {
579 CreateChannels(0, 0);
580 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800581 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 CreateContent(0, kPcmuCodec, kH264Codec, &content);
583 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800584 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200586 EXPECT_TRUE(
587 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588 }
589
590 // Test that SetLocalContent and SetRemoteContent properly set RTCP
591 // mux.
592 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800593 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 typename T::Content content;
595 CreateContent(0, kPcmuCodec, kH264Codec, &content);
596 // Both sides agree on mux. Should no longer be a separate RTCP channel.
597 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800598 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
599 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800601 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800603 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 }
605
606 // Test that SetLocalContent and SetRemoteContent properly set RTCP
607 // mux when a provisional answer is received.
608 void TestSetContentsRtcpMuxWithPrAnswer() {
deadbeefac22f702017-01-12 21:59:29 -0800609 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 typename T::Content content;
611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800613 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
614 EXPECT_TRUE(
615 channel1_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800616 // Both sides agree on mux. Should signal RTCP mux as fully activated.
617 EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800619 EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800621 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800623 EXPECT_TRUE(
624 channel2_->SetRemoteContent(&content, SdpType::kPrAnswer, NULL));
625 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800626 EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 }
628
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 // Test that SetLocalContent and SetRemoteContent properly
630 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800631 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 void TestChangeStreamParamsInContent() {
633 cricket::StreamParams stream1;
634 stream1.groupid = "group1";
635 stream1.id = "stream1";
636 stream1.ssrcs.push_back(kSsrc1);
637 stream1.cname = "stream1_cname";
638
639 cricket::StreamParams stream2;
640 stream2.groupid = "group1";
641 stream2.id = "stream2";
642 stream2.ssrcs.push_back(kSsrc2);
643 stream2.cname = "stream2_cname";
644
645 // Setup a call where channel 1 send |stream1| to channel 2.
646 CreateChannels(0, 0);
647 typename T::Content content1;
648 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
649 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800650 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_TRUE(channel1_->Enable(true));
652 EXPECT_EQ(1u, media_channel1_->send_streams().size());
653
Steve Anton3828c062017-12-06 10:34:51 -0800654 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800656 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657
658 // Channel 2 do not send anything.
659 typename T::Content content2;
660 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800661 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800663 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 EXPECT_TRUE(channel2_->Enable(true));
665 EXPECT_EQ(0u, media_channel2_->send_streams().size());
666
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200667 SendCustomRtp1(kSsrc1, 0);
668 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
670
671 // Let channel 2 update the content by sending |stream2| and enable SRTP.
672 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700673 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800675 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 ASSERT_EQ(1u, media_channel2_->send_streams().size());
677 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
678
Steve Anton3828c062017-12-06 10:34:51 -0800679 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
681 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
682
683 // Channel 1 replies but stop sending stream1.
684 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700685 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800686 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_EQ(0u, media_channel1_->send_streams().size());
688
Steve Anton3828c062017-12-06 10:34:51 -0800689 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
691
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200692 SendCustomRtp2(kSsrc2, 0);
693 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
695 }
696
697 // Test that we only start playout and sending at the right times.
698 void TestPlayoutAndSendingStates() {
699 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200700 if (verify_playout_) {
701 EXPECT_FALSE(media_channel1_->playout());
702 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200704 if (verify_playout_) {
705 EXPECT_FALSE(media_channel2_->playout());
706 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_FALSE(media_channel2_->sending());
708 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200709 if (verify_playout_) {
710 EXPECT_FALSE(media_channel1_->playout());
711 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000713 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800714 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200715 if (verify_playout_) {
716 EXPECT_TRUE(media_channel1_->playout());
717 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000719 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800720 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200721 if (verify_playout_) {
722 EXPECT_FALSE(media_channel2_->playout());
723 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000725 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800726 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200727 if (verify_playout_) {
728 EXPECT_FALSE(media_channel2_->playout());
729 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800731 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200732 if (verify_playout_) {
733 EXPECT_TRUE(media_channel1_->playout());
734 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200736 if (verify_playout_) {
737 EXPECT_FALSE(media_channel2_->playout());
738 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_FALSE(media_channel2_->sending());
740 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200741 if (verify_playout_) {
742 EXPECT_TRUE(media_channel2_->playout());
743 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000745 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800746 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 if (verify_playout_) {
748 EXPECT_TRUE(media_channel1_->playout());
749 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_TRUE(media_channel1_->sending());
751 }
752
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 // Test that changing the MediaContentDirection in the local and remote
754 // session description start playout and sending at the right time.
755 void TestMediaContentDirection() {
756 CreateChannels(0, 0);
757 typename T::Content content1;
758 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
759 typename T::Content content2;
760 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
761 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800762 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
764 EXPECT_TRUE(channel1_->Enable(true));
765 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200766 if (verify_playout_) {
767 EXPECT_FALSE(media_channel1_->playout());
768 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200770 if (verify_playout_) {
771 EXPECT_FALSE(media_channel2_->playout());
772 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_FALSE(media_channel2_->sending());
774
Steve Anton3828c062017-12-06 10:34:51 -0800775 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
776 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
777 EXPECT_TRUE(
778 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
779 EXPECT_TRUE(
780 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800781 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782
Peter Boström34fbfff2015-09-24 19:20:30 +0200783 if (verify_playout_) {
784 EXPECT_TRUE(media_channel1_->playout());
785 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
788 EXPECT_FALSE(media_channel2_->playout()); // local InActive
789 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 EXPECT_FALSE(media_channel2_->sending()); // local InActive
791
792 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800793 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800794 EXPECT_TRUE(
795 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
796 EXPECT_TRUE(
797 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Peter Boström34fbfff2015-09-24 19:20:30 +0200799 if (verify_playout_) {
800 EXPECT_TRUE(media_channel1_->playout());
801 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200803 if (verify_playout_) {
804 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
807
808 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800809 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800810 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
811 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812
Peter Boström34fbfff2015-09-24 19:20:30 +0200813 if (verify_playout_) {
814 EXPECT_TRUE(media_channel1_->playout());
815 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200817 if (verify_playout_) {
818 EXPECT_TRUE(media_channel2_->playout());
819 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 EXPECT_TRUE(media_channel2_->sending());
821 }
822
Honghai Zhangcc411c02016-03-29 17:27:21 -0700823 // Tests that when the transport channel signals a candidate pair change
824 // event, the media channel will receive a call on the network route change.
825 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700826 static constexpr uint16_t kLocalNetId = 1;
827 static constexpr uint16_t kRemoteNetId = 2;
828 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800829 // Ipv4(20) + UDP(8).
830 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800831 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200832
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800833 CreateChannels(DTLS, DTLS);
834 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700835
Honghai Zhangcc411c02016-03-29 17:27:21 -0700836 typename T::MediaChannel* media_channel1 =
837 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200838 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700839
Zhi Huang942bc2e2017-11-13 13:26:07 -0800840 // Need to wait for the threads before calling
841 // |set_num_network_route_changes| because the network route would be set
842 // when creating the channel.
843 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200844 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800845 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800846 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200847 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800848 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
849
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200850 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200851 });
852 WaitForThreads();
853 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700854 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200855 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700856
eladalon05b07bb2017-08-24 07:40:16 -0700857 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800858 rtc::NetworkRoute network_route;
859 network_route.connected = true;
860 network_route.local_network_id = kLocalNetId;
861 network_route.remote_network_id = kRemoteNetId;
862 network_route.last_sent_packet_id = kLastPacketId;
863 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200864 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800865 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
866
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200867 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200868 });
869 WaitForThreads();
870 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100871 EXPECT_TRUE(media_channel1->last_network_route().connected);
872 EXPECT_EQ(kLocalNetId,
873 media_channel1->last_network_route().local_network_id);
874 EXPECT_EQ(kRemoteNetId,
875 media_channel1->last_network_route().remote_network_id);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200876 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700877 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800878 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800879 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700880 }
881
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 // Test setting up a call.
883 void TestCallSetup() {
884 CreateChannels(0, 0);
Zhi Huangcf990f52017-09-22 12:12:30 -0700885 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000886 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200887 if (verify_playout_) {
888 EXPECT_TRUE(media_channel1_->playout());
889 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 EXPECT_FALSE(media_channel1_->sending());
891 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700892 EXPECT_FALSE(channel1_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 EXPECT_TRUE(media_channel1_->sending());
894 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200895 if (verify_playout_) {
896 EXPECT_TRUE(media_channel2_->playout());
897 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898 EXPECT_TRUE(media_channel2_->sending());
899 EXPECT_EQ(1U, media_channel2_->codecs().size());
900 }
901
902 // Test that we don't crash if packets are sent during call teardown
903 // when RTCP mux is enabled. This is a regression test against a specific
904 // race condition that would only occur when a RTCP packet was sent during
905 // teardown of a channel on which RTCP mux was enabled.
906 void TestCallTeardownRtcpMux() {
907 class LastWordMediaChannel : public T::MediaChannel {
908 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200909 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700911 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
912 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
914 }
915 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200916 CreateChannels(std::make_unique<LastWordMediaChannel>(),
917 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200918 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 EXPECT_TRUE(SendInitiate());
920 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800921 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922 }
923
924 // Send voice RTP data to the other side and ensure it gets there.
925 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700926 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 EXPECT_TRUE(SendInitiate());
928 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700929 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
930 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200931 SendRtp1();
932 SendRtp2();
933 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000934 EXPECT_TRUE(CheckRtp1());
935 EXPECT_TRUE(CheckRtp2());
936 EXPECT_TRUE(CheckNoRtp1());
937 EXPECT_TRUE(CheckNoRtp2());
938 }
939
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200940 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800941 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200942 EXPECT_TRUE(SendInitiate());
943 EXPECT_TRUE(SendAccept());
944 SendRtp1();
945 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200946 // Do not wait, destroy channels.
947 channel1_.reset(nullptr);
948 channel2_.reset(nullptr);
949 }
950
Zhi Huange830e682018-03-30 10:48:35 -0700951 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
952 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Zhi Huangcf990f52017-09-22 12:12:30 -0700953 EXPECT_FALSE(channel1_->srtp_active());
954 EXPECT_FALSE(channel2_->srtp_active());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200956 WaitForThreads();
957 EXPECT_TRUE(channel1_->writable());
958 EXPECT_TRUE(channel2_->writable());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 EXPECT_TRUE(SendAccept());
Zhi Huangcf990f52017-09-22 12:12:30 -0700960 EXPECT_TRUE(channel1_->srtp_active());
961 EXPECT_TRUE(channel2_->srtp_active());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200962 SendRtp1();
963 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200964 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 EXPECT_TRUE(CheckRtp1());
966 EXPECT_TRUE(CheckRtp2());
967 EXPECT_TRUE(CheckNoRtp1());
968 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969 }
970
971 // Test that we can send and receive early media when a provisional answer is
972 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
973 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200974 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975
Yves Gerey665174f2018-06-19 15:03:05 +0200976 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
977 EXPECT_TRUE(SendOffer());
978 EXPECT_TRUE(SendProvisionalAnswer());
979 EXPECT_TRUE(channel1_->srtp_active());
980 EXPECT_TRUE(channel2_->srtp_active());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700981 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
982 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +0200983 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200984 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
985 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200986 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987
Yves Gerey665174f2018-06-19 15:03:05 +0200988 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200989 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
990 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200991 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992
Yves Gerey665174f2018-06-19 15:03:05 +0200993 // Complete call setup and ensure everything is still OK.
994 EXPECT_TRUE(SendFinalAnswer());
995 EXPECT_TRUE(channel1_->srtp_active());
996 EXPECT_TRUE(channel2_->srtp_active());
Yves Gerey665174f2018-06-19 15:03:05 +0200997 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200998 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
999 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +02001000 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +02001001 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 }
1003
1004 // Test that we properly send RTP without SRTP from a thread.
1005 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -08001006 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 EXPECT_TRUE(SendInitiate());
1008 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001009 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1010 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001011 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001012 WaitForThreads(involved_threads);
1013 EXPECT_TRUE(CheckRtp1());
1014 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 EXPECT_TRUE(CheckNoRtp1());
1016 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 }
1018
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 // Test that the mediachannel retains its sending state after the transport
1020 // becomes non-writable.
1021 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001022 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023 EXPECT_TRUE(SendInitiate());
1024 EXPECT_TRUE(SendAccept());
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001025 EXPECT_TRUE(channel1_->rtp_transport()->rtcp_mux_enabled());
1026 EXPECT_TRUE(channel2_->rtp_transport()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001027 SendRtp1();
1028 SendRtp2();
1029 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_TRUE(CheckRtp1());
1031 EXPECT_TRUE(CheckRtp2());
1032 EXPECT_TRUE(CheckNoRtp1());
1033 EXPECT_TRUE(CheckNoRtp2());
1034
wu@webrtc.org97077a32013-10-25 21:18:33 +00001035 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001036 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1037 fake_rtp_dtls_transport1_->SetWritable(false);
1038 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001039 SendRtp1();
1040 SendRtp2();
1041 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 EXPECT_TRUE(CheckRtp1());
1043 EXPECT_TRUE(CheckNoRtp2());
1044
1045 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001046 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1047 fake_rtp_dtls_transport1_->SetWritable(true);
1048 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001050 SendRtp1();
1051 SendRtp2();
1052 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 EXPECT_TRUE(CheckRtp1());
1054 EXPECT_TRUE(CheckRtp2());
1055 EXPECT_TRUE(CheckNoRtp1());
1056 EXPECT_TRUE(CheckNoRtp2());
1057
1058 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001059 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1060 bool asymmetric = true;
1061 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1062 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001063 EXPECT_TRUE(media_channel1_->sending());
1064
wu@webrtc.org97077a32013-10-25 21:18:33 +00001065 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001066 SendRtp1();
1067 SendRtp2();
1068 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069 EXPECT_TRUE(CheckRtp1());
1070 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001071 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001072
1073 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001074 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001075 bool asymmetric = true;
1076 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1077 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001078 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001080 SendRtp1();
1081 SendRtp2();
1082 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_TRUE(CheckRtp1());
1084 EXPECT_TRUE(CheckRtp2());
1085 EXPECT_TRUE(CheckNoRtp1());
1086 EXPECT_TRUE(CheckNoRtp2());
1087 }
1088
Yves Gerey665174f2018-06-19 15:03:05 +02001089 void SendBundleToBundle(const int* pl_types,
1090 int len,
1091 bool rtcp_mux,
1092 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001093 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001095 // Only pl_type1 was added to the bundle filter for both |channel1_|
1096 // and |channel2_|.
1097 int pl_type1 = pl_types[0];
1098 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001099 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001100 if (secure)
1101 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001102 if (rtcp_mux) {
1103 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001104 }
1105 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001108
1109 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001110 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1111 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1112 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001113 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001114 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1115 EXPECT_TRUE(CheckNoRtp1());
1116 EXPECT_TRUE(CheckNoRtp2());
1117
Zhi Huang365381f2018-04-13 16:44:34 -07001118 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1119 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001120 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001121 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1122 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 }
1124
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 void TestSetContentFailure() {
1126 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127
Peter Thatchera6d24442015-07-09 21:26:36 -07001128 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001129 std::unique_ptr<typename T::Content> content(
1130 CreateMediaContentWithStream(1));
1131
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001133 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001134 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001135 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001136 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001139 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001140 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001141
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001143 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001144 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 }
1146
1147 void TestSendTwoOffers() {
1148 CreateChannels(0, 0);
1149
Peter Thatchera6d24442015-07-09 21:26:36 -07001150 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001151 std::unique_ptr<typename T::Content> content1(
1152 CreateMediaContentWithStream(1));
1153 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001154 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1156
Steve Anton18ee1d52017-09-11 11:32:35 -07001157 std::unique_ptr<typename T::Content> content2(
1158 CreateMediaContentWithStream(2));
1159 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001160 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1162 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1163 }
1164
1165 void TestReceiveTwoOffers() {
1166 CreateChannels(0, 0);
1167
Peter Thatchera6d24442015-07-09 21:26:36 -07001168 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001169 std::unique_ptr<typename T::Content> content1(
1170 CreateMediaContentWithStream(1));
1171 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001172 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1174
Steve Anton18ee1d52017-09-11 11:32:35 -07001175 std::unique_ptr<typename T::Content> content2(
1176 CreateMediaContentWithStream(2));
1177 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001178 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1180 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1181 }
1182
1183 void TestSendPrAnswer() {
1184 CreateChannels(0, 0);
1185
Peter Thatchera6d24442015-07-09 21:26:36 -07001186 std::string err;
1187 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001188 std::unique_ptr<typename T::Content> content1(
1189 CreateMediaContentWithStream(1));
1190 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001191 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1193
Peter Thatchera6d24442015-07-09 21:26:36 -07001194 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001195 std::unique_ptr<typename T::Content> content2(
1196 CreateMediaContentWithStream(2));
1197 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001198 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1200 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1201
Peter Thatchera6d24442015-07-09 21:26:36 -07001202 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001203 std::unique_ptr<typename T::Content> content3(
1204 CreateMediaContentWithStream(3));
1205 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001206 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1208 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1209 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1210 }
1211
1212 void TestReceivePrAnswer() {
1213 CreateChannels(0, 0);
1214
Peter Thatchera6d24442015-07-09 21:26:36 -07001215 std::string err;
1216 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001217 std::unique_ptr<typename T::Content> content1(
1218 CreateMediaContentWithStream(1));
1219 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001220 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001221 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1222
Peter Thatchera6d24442015-07-09 21:26:36 -07001223 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001224 std::unique_ptr<typename T::Content> content2(
1225 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001226 EXPECT_TRUE(
1227 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1229 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1230
Peter Thatchera6d24442015-07-09 21:26:36 -07001231 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001232 std::unique_ptr<typename T::Content> content3(
1233 CreateMediaContentWithStream(3));
1234 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001235 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1237 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1238 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1239 }
1240
zstein56162b92017-04-24 16:54:35 -07001241 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001242 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001243 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001244
zstein56162b92017-04-24 16:54:35 -07001245 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001246 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 EXPECT_TRUE(media_channel1_->ready_to_send());
1248
zstein56162b92017-04-24 16:54:35 -07001249 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001250 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001252 }
1253
skvladdc1c62c2016-03-16 19:07:43 -07001254 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1255 typename T::Content content;
1256 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1257 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001258 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001259 }
1260
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001261 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001262 webrtc::RtpParameters parameters;
1263 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001264 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001265 parameters.encodings.push_back(encoding);
1266 return parameters;
1267 }
1268
1269 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001270 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001271 EXPECT_EQ(1UL, parameters.encodings.size());
1272 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1273 }
1274
1275 void DefaultMaxBitrateIsUnlimited() {
1276 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001277 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1278 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001279 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001280 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001281 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001282 }
1283
Zhi Huange830e682018-03-30 10:48:35 -07001284 // Test that when a channel gets new RtpTransport with a call to
1285 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1286 // with the options on the new one.
1287
Steve Anton8a63f782017-10-23 13:08:53 -07001288 // For example, audio and video may use separate socket options, but initially
1289 // be unbundled, then later become bundled. When this happens, their preferred
1290 // socket options should be merged to the underlying transport they share.
1291 void SocketOptionsMergedOnSetTransport() {
1292 constexpr int kSndBufSize = 4000;
1293 constexpr int kRcvBufSize = 8000;
1294
Zhi Huange830e682018-03-30 10:48:35 -07001295 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001296
1297 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1298 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1299 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1300 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1301
Zhi Huange830e682018-03-30 10:48:35 -07001302 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001303 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001304 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001305
1306 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001307 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1308 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001309 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001310 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1311 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001312 EXPECT_EQ(kRcvBufSize, option_val);
1313 }
1314
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001315 void CreateSimulcastContent(const std::vector<std::string>& rids,
1316 typename T::Content* content) {
1317 std::vector<RidDescription> rid_descriptions;
1318 for (const std::string name : rids) {
1319 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1320 }
1321
1322 StreamParams stream;
1323 stream.set_rids(rid_descriptions);
1324 CreateContent(0, kPcmuCodec, kH264Codec, content);
1325 // This is for unified plan, so there can be only one StreamParams.
1326 content->mutable_streams().clear();
1327 content->AddStream(stream);
1328 }
1329
1330 void VerifySimulcastStreamParams(const StreamParams& expected,
1331 const typename T::Channel* channel) {
1332 const std::vector<StreamParams>& streams = channel->local_streams();
1333 ASSERT_EQ(1u, streams.size());
1334 const StreamParams& result = streams[0];
1335 EXPECT_EQ(expected.rids(), result.rids());
1336 EXPECT_TRUE(result.has_ssrcs());
1337 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1338 std::vector<uint32_t> primary_ssrcs;
1339 result.GetPrimarySsrcs(&primary_ssrcs);
1340 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1341 }
1342
1343 void TestUpdateLocalStreamsWithSimulcast() {
1344 CreateChannels(0, 0);
1345 typename T::Content content1, content2, content3;
1346 CreateSimulcastContent({"f", "h", "q"}, &content1);
1347 EXPECT_TRUE(
1348 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1349 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1350 StreamParams stream1 = channel1_->local_streams()[0];
1351
1352 // Create a similar offer. SetLocalContent should not remove and add.
1353 CreateSimulcastContent({"f", "h", "q"}, &content2);
1354 EXPECT_TRUE(
1355 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1356 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1357 StreamParams stream2 = channel1_->local_streams()[0];
1358 // Check that the streams are identical (SSRCs didn't change).
1359 EXPECT_EQ(stream1, stream2);
1360
1361 // Create third offer that has same RIDs in different order.
1362 CreateSimulcastContent({"f", "q", "h"}, &content3);
1363 EXPECT_TRUE(
1364 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1365 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1366 }
1367
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001369 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1370 static void ProcessThreadQueue(rtc::Thread* thread) {
1371 RTC_DCHECK(thread->IsCurrent());
1372 while (!thread->empty()) {
1373 thread->ProcessMessages(0);
1374 }
1375 }
1376 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1377 // |threads| and current thread post packets to network thread.
1378 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001379 thread->Invoke<void>(RTC_FROM_HERE,
1380 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001381 }
1382 ProcessThreadQueue(rtc::Thread::Current());
1383 // Network thread move them around and post back to worker = current thread.
1384 if (!network_thread_->IsCurrent()) {
1385 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001386 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001387 }
1388 // Worker thread = current Thread process received messages.
1389 ProcessThreadQueue(rtc::Thread::Current());
1390 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001391 // TODO(pbos): Remove playout from all media channels and let renderers mute
1392 // themselves.
1393 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001394 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1395 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001396 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1397 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1398 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1399 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1400 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1401 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1402 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1403 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001404 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1405 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1406 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407 cricket::FakeMediaEngine media_engine_;
1408 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001409 typename T::MediaChannel* media_channel1_ = nullptr;
1410 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001411 std::unique_ptr<typename T::Channel> channel1_;
1412 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 typename T::Content local_media_content1_;
1414 typename T::Content local_media_content2_;
1415 typename T::Content remote_media_content1_;
1416 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001418 rtc::Buffer rtp_packet_;
1419 rtc::Buffer rtcp_packet_;
deadbeeff5346592017-01-24 21:51:21 -08001420 int rtcp_mux_activated_callbacks1_ = 0;
1421 int rtcp_mux_activated_callbacks2_ = 0;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001422 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001423 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424};
1425
Yves Gerey665174f2018-06-19 15:03:05 +02001426template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001427std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1428 rtc::Thread* worker_thread,
1429 rtc::Thread* network_thread,
1430 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1431 webrtc::RtpTransportInternal* rtp_transport,
1432 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001433 rtc::Thread* signaling_thread = rtc::Thread::Current();
1434 auto channel = std::make_unique<cricket::VoiceChannel>(
1435 worker_thread, network_thread, signaling_thread, std::move(ch),
1436 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1437 &ssrc_generator_);
1438 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
1439 return channel;
1440}
1441
1442template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443void ChannelTest<VoiceTraits>::CreateContent(
1444 int flags,
1445 const cricket::AudioCodec& audio_codec,
1446 const cricket::VideoCodec& video_codec,
1447 cricket::AudioContentDescription* audio) {
1448 audio->AddCodec(audio_codec);
1449 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450}
1451
Yves Gerey665174f2018-06-19 15:03:05 +02001452template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001453void ChannelTest<VoiceTraits>::CopyContent(
1454 const cricket::AudioContentDescription& source,
1455 cricket::AudioContentDescription* audio) {
1456 *audio = source;
1457}
1458
Yves Gerey665174f2018-06-19 15:03:05 +02001459template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1461 const cricket::AudioCodec& c2) {
1462 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001463 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464}
1465
Peter Boström0c4e06b2015-10-07 12:23:21 +02001466template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001468 uint32_t ssrc,
1469 int flags,
1470 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001471 audio->AddLegacyStream(ssrc);
1472}
1473
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001474class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001475 public:
solenberg1dd98f32015-09-10 01:57:14 -07001476 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001477 VoiceChannelSingleThreadTest()
1478 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1479};
1480
1481class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1482 public:
1483 typedef ChannelTest<VoiceTraits> Base;
1484 VoiceChannelDoubleThreadTest()
1485 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486};
1487
jbauch5869f502017-06-29 12:31:36 -07001488class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001489 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001490 public:
1491 typedef ChannelTest<VoiceTraits> Base;
1492 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001493 : Base(true,
1494 kPcmuFrameWithExtensions,
1495 kRtcpReport,
1496 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001497};
1498
1499class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001500 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001501 public:
1502 typedef ChannelTest<VoiceTraits> Base;
1503 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001504 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1505 }
jbauch5869f502017-06-29 12:31:36 -07001506};
1507
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001509template <>
Steve Anton8699a322017-11-06 15:53:33 -08001510std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001511 rtc::Thread* worker_thread,
1512 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001513 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001514 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001515 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001516 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001517 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001518 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001519 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1520 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001521 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 return channel;
1523}
1524
Yves Gerey665174f2018-06-19 15:03:05 +02001525template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526void ChannelTest<VideoTraits>::CreateContent(
1527 int flags,
1528 const cricket::AudioCodec& audio_codec,
1529 const cricket::VideoCodec& video_codec,
1530 cricket::VideoContentDescription* video) {
1531 video->AddCodec(video_codec);
1532 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533}
1534
Yves Gerey665174f2018-06-19 15:03:05 +02001535template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536void ChannelTest<VideoTraits>::CopyContent(
1537 const cricket::VideoContentDescription& source,
1538 cricket::VideoContentDescription* video) {
1539 *video = source;
1540}
1541
Yves Gerey665174f2018-06-19 15:03:05 +02001542template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1544 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001545 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546}
1547
Peter Boström0c4e06b2015-10-07 12:23:21 +02001548template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001550 uint32_t ssrc,
1551 int flags,
1552 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001553 video->AddLegacyStream(ssrc);
1554}
1555
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001556class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557 public:
solenberg1dd98f32015-09-10 01:57:14 -07001558 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001559 VideoChannelSingleThreadTest()
1560 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561};
1562
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001563class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1564 public:
1565 typedef ChannelTest<VideoTraits> Base;
1566 VideoChannelDoubleThreadTest()
1567 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1568};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001570TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571 Base::TestInit();
1572 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1573 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1574}
1575
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001576TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1577 Base::TestDeinit();
1578}
1579
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001580TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 Base::TestSetContents();
1582}
1583
Johannes Kron9190b822018-10-29 11:22:05 +01001584TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1585 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1586}
1587
1588TEST_F(VoiceChannelSingleThreadTest,
1589 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1590 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1591}
1592
1593TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1594 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1595}
1596
1597TEST_F(VoiceChannelSingleThreadTest,
1598 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1599 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1600}
1601
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001602TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603 Base::TestSetContentsNullOffer();
1604}
1605
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001606TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 Base::TestSetContentsRtcpMux();
1608}
1609
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001610TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611 Base::TestSetContentsRtcpMux();
1612}
1613
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001614TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 Base::TestChangeStreamParamsInContent();
1616}
1617
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001618TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 Base::TestPlayoutAndSendingStates();
1620}
1621
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001622TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 Base::TestMediaContentDirection();
1624}
1625
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001626TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001627 Base::TestNetworkRouteChanges();
1628}
1629
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001630TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 Base::TestCallSetup();
1632}
1633
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001634TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 Base::TestCallTeardownRtcpMux();
1636}
1637
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001638TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 Base::SendRtpToRtp();
1640}
1641
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001642TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001643 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644}
1645
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001646TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001647 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001648}
1649
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001650TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1652}
1653
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001654TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 Base::SendRtpToRtpOnThread();
1656}
1657
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001658TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 Base::SendWithWritabilityLoss();
1660}
1661
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001662TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 Base::TestSetContentFailure();
1664}
1665
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001666TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 Base::TestSendTwoOffers();
1668}
1669
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001670TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 Base::TestReceiveTwoOffers();
1672}
1673
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675 Base::TestSendPrAnswer();
1676}
1677
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001678TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 Base::TestReceivePrAnswer();
1680}
1681
zstein56162b92017-04-24 16:54:35 -07001682TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1683 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684}
1685
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001686TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001687 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688}
1689
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001690TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001691 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001692}
1693
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001694TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001695 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001696}
1697
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001698TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001699 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700}
1701
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001702TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001703 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001704}
1705
Steve Anton8a63f782017-10-23 13:08:53 -07001706TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1707 Base::SocketOptionsMergedOnSetTransport();
1708}
1709
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001710// VoiceChannelDoubleThreadTest
1711TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001713 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1714 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715}
1716
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001717TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1718 Base::TestDeinit();
1719}
1720
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001721TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722 Base::TestSetContents();
1723}
1724
Johannes Kron9190b822018-10-29 11:22:05 +01001725TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1726 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1727}
1728
1729TEST_F(VoiceChannelDoubleThreadTest,
1730 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1731 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1732}
1733
1734TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1735 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1736}
1737
1738TEST_F(VoiceChannelDoubleThreadTest,
1739 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1740 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1741}
1742
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001743TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 Base::TestSetContentsNullOffer();
1745}
1746
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001747TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 Base::TestSetContentsRtcpMux();
1749}
1750
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001751TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752 Base::TestSetContentsRtcpMux();
1753}
1754
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001755TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756 Base::TestChangeStreamParamsInContent();
1757}
1758
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001759TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 Base::TestPlayoutAndSendingStates();
1761}
1762
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001763TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1764 Base::TestMediaContentDirection();
1765}
1766
1767TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1768 Base::TestNetworkRouteChanges();
1769}
1770
1771TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1772 Base::TestCallSetup();
1773}
1774
1775TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1776 Base::TestCallTeardownRtcpMux();
1777}
1778
1779TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1780 Base::SendRtpToRtp();
1781}
1782
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001784 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001785}
1786
1787TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001788 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001789}
1790
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001791TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1792 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1793}
1794
1795TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1796 Base::SendRtpToRtpOnThread();
1797}
1798
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001799TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1800 Base::SendWithWritabilityLoss();
1801}
1802
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001803TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1804 Base::TestSetContentFailure();
1805}
1806
1807TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1808 Base::TestSendTwoOffers();
1809}
1810
1811TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1812 Base::TestReceiveTwoOffers();
1813}
1814
1815TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1816 Base::TestSendPrAnswer();
1817}
1818
1819TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1820 Base::TestReceivePrAnswer();
1821}
1822
zstein56162b92017-04-24 16:54:35 -07001823TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1824 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001825}
1826
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001827TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1828 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1829}
1830
1831TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1832 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1833}
1834
1835TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1836 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1837}
1838
1839TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1840 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1841}
1842
1843TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1844 Base::DefaultMaxBitrateIsUnlimited();
1845}
1846
Steve Anton8a63f782017-10-23 13:08:53 -07001847TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1848 Base::SocketOptionsMergedOnSetTransport();
1849}
1850
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001851// VideoChannelSingleThreadTest
1852TEST_F(VideoChannelSingleThreadTest, TestInit) {
1853 Base::TestInit();
1854}
1855
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001856TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1857 Base::TestDeinit();
1858}
1859
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001860TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1861 Base::TestSetContents();
1862}
1863
Johannes Kron9190b822018-10-29 11:22:05 +01001864TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1865 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1866}
1867
1868TEST_F(VideoChannelSingleThreadTest,
1869 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1870 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1871}
1872
1873TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1874 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1875}
1876
1877TEST_F(VideoChannelSingleThreadTest,
1878 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1879 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1880}
1881
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001882TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1883 Base::TestSetContentsNullOffer();
1884}
1885
1886TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1887 Base::TestSetContentsRtcpMux();
1888}
1889
1890TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1891 Base::TestSetContentsRtcpMux();
1892}
1893
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001894TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1895 Base::TestChangeStreamParamsInContent();
1896}
1897
1898TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1899 Base::TestPlayoutAndSendingStates();
1900}
1901
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001902TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903 Base::TestMediaContentDirection();
1904}
1905
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001906TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001907 Base::TestNetworkRouteChanges();
1908}
1909
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001910TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 Base::TestCallSetup();
1912}
1913
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001914TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 Base::TestCallTeardownRtcpMux();
1916}
1917
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001918TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 Base::SendRtpToRtp();
1920}
1921
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001922TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001923 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924}
1925
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001926TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001927 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928}
1929
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001930TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1932}
1933
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001934TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 Base::SendRtpToRtpOnThread();
1936}
1937
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001938TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 Base::SendWithWritabilityLoss();
1940}
1941
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001942TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 Base::TestSetContentFailure();
1944}
1945
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001946TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 Base::TestSendTwoOffers();
1948}
1949
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001950TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 Base::TestReceiveTwoOffers();
1952}
1953
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001954TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 Base::TestSendPrAnswer();
1956}
1957
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001958TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 Base::TestReceivePrAnswer();
1960}
1961
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001962TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001963 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964}
1965
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001966TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001967 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001968}
1969
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001970TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001971 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001972}
1973
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001974TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001975 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976}
1977
zstein56162b92017-04-24 16:54:35 -07001978TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1979 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980}
1981
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001982TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001983 Base::DefaultMaxBitrateIsUnlimited();
1984}
1985
Steve Anton8a63f782017-10-23 13:08:53 -07001986TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1987 Base::SocketOptionsMergedOnSetTransport();
1988}
1989
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001990TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1991 Base::TestUpdateLocalStreamsWithSimulcast();
1992}
1993
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001994TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1995 const cricket::VideoCodec kVp8Codec(97, "VP8");
1996 cricket::VideoCodec vp9_codec(98, "VP9");
1997 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1998 cricket::VideoContentDescription video;
1999 video.set_codecs({kVp8Codec, vp9_codec});
2000
2001 CreateChannels(0, 0);
2002
2003 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2004 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2005 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2006 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2007 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2008 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2009 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2010 cricket::kPacketizationParamRaw);
2011}
2012
2013TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2014 const cricket::VideoCodec kVp8Codec(97, "VP8");
2015 cricket::VideoCodec vp9_codec(98, "VP9");
2016 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2017 cricket::VideoContentDescription video;
2018 video.set_codecs({kVp8Codec, vp9_codec});
2019
2020 CreateChannels(0, 0);
2021
2022 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2023 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2024 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2025 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2026 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2027 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2028 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2029 cricket::kPacketizationParamRaw);
2030}
2031
2032TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2033 const cricket::VideoCodec kVp8Codec(97, "VP8");
2034 cricket::VideoCodec vp9_codec(98, "VP9");
2035 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2036 cricket::VideoContentDescription video;
2037 video.set_codecs({kVp8Codec, vp9_codec});
2038
2039 CreateChannels(0, 0);
2040
2041 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2042 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2043 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2044 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2045 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2046 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2047 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2048 cricket::kPacketizationParamRaw);
2049 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2050 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2051 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2052 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2053 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2054 cricket::kPacketizationParamRaw);
2055}
2056
2057TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2058 const cricket::VideoCodec kLocalCodec(98, "VP8");
2059 cricket::VideoCodec remote_codec(99, "VP8");
2060 remote_codec.packetization = cricket::kPacketizationParamRaw;
2061 cricket::VideoContentDescription local_video;
2062 local_video.set_codecs({kLocalCodec});
2063 cricket::VideoContentDescription remote_video;
2064 remote_video.set_codecs({remote_codec});
2065
2066 CreateChannels(0, 0);
2067
2068 EXPECT_TRUE(
2069 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2070 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2071 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2072 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2073 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2074 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2075}
2076
2077TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2078 cricket::VideoCodec local_codec(98, "VP8");
2079 local_codec.packetization = cricket::kPacketizationParamRaw;
2080 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2081 cricket::VideoContentDescription local_video;
2082 local_video.set_codecs({local_codec});
2083 cricket::VideoContentDescription remote_video;
2084 remote_video.set_codecs({kRemoteCodec});
2085
2086 CreateChannels(0, 0);
2087
2088 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2089 EXPECT_TRUE(
2090 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2091 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2092 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2093 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2094 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2095}
2096
2097TEST_F(VideoChannelSingleThreadTest,
2098 TestSetRemoteAnswerWithInvalidPacketization) {
2099 cricket::VideoCodec local_codec(98, "VP8");
2100 local_codec.packetization = cricket::kPacketizationParamRaw;
2101 cricket::VideoCodec remote_codec(99, "VP8");
2102 remote_codec.packetization = "unknownpacketizationattributevalue";
2103 cricket::VideoContentDescription local_video;
2104 local_video.set_codecs({local_codec});
2105 cricket::VideoContentDescription remote_video;
2106 remote_video.set_codecs({remote_codec});
2107
2108 CreateChannels(0, 0);
2109
2110 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2111 EXPECT_FALSE(
2112 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2113 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2114 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2115 cricket::kPacketizationParamRaw);
2116 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2117}
2118
2119TEST_F(VideoChannelSingleThreadTest,
2120 TestSetLocalAnswerWithInvalidPacketization) {
2121 cricket::VideoCodec local_codec(98, "VP8");
2122 local_codec.packetization = cricket::kPacketizationParamRaw;
2123 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2124 cricket::VideoContentDescription local_video;
2125 local_video.set_codecs({local_codec});
2126 cricket::VideoContentDescription remote_video;
2127 remote_video.set_codecs({kRemoteCodec});
2128
2129 CreateChannels(0, 0);
2130
2131 EXPECT_TRUE(
2132 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2133 EXPECT_FALSE(
2134 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2135 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2136 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2137 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2138}
2139
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002140// VideoChannelDoubleThreadTest
2141TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2142 Base::TestInit();
2143}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002145TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2146 Base::TestDeinit();
2147}
2148
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002149TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2150 Base::TestSetContents();
2151}
2152
Johannes Kron9190b822018-10-29 11:22:05 +01002153TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2154 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2155}
2156
2157TEST_F(VideoChannelDoubleThreadTest,
2158 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2159 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2160}
2161
2162TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2163 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2164}
2165
2166TEST_F(VideoChannelDoubleThreadTest,
2167 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2168 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2169}
2170
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002171TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2172 Base::TestSetContentsNullOffer();
2173}
2174
2175TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2176 Base::TestSetContentsRtcpMux();
2177}
2178
2179TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2180 Base::TestSetContentsRtcpMux();
2181}
2182
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002183TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2184 Base::TestChangeStreamParamsInContent();
2185}
2186
2187TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2188 Base::TestPlayoutAndSendingStates();
2189}
2190
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002191TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2192 Base::TestMediaContentDirection();
2193}
2194
2195TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2196 Base::TestNetworkRouteChanges();
2197}
2198
2199TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2200 Base::TestCallSetup();
2201}
2202
2203TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2204 Base::TestCallTeardownRtcpMux();
2205}
2206
2207TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2208 Base::SendRtpToRtp();
2209}
2210
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002211TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002212 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002213}
2214
2215TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002216 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002217}
2218
2219TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2220 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2221}
2222
2223TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2224 Base::SendRtpToRtpOnThread();
2225}
2226
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002227TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2228 Base::SendWithWritabilityLoss();
2229}
2230
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002231TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2232 Base::TestSetContentFailure();
2233}
2234
2235TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2236 Base::TestSendTwoOffers();
2237}
2238
2239TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2240 Base::TestReceiveTwoOffers();
2241}
2242
2243TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2244 Base::TestSendPrAnswer();
2245}
2246
2247TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2248 Base::TestReceivePrAnswer();
2249}
2250
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002251TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2252 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2253}
2254
2255TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2256 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2257}
2258
2259TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2260 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2261}
2262
2263TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2264 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2265}
2266
zstein56162b92017-04-24 16:54:35 -07002267TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2268 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269}
2270
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2272 Base::DefaultMaxBitrateIsUnlimited();
2273}
2274
Steve Anton8a63f782017-10-23 13:08:53 -07002275TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2276 Base::SocketOptionsMergedOnSetTransport();
2277}
2278
deadbeef953c2ce2017-01-09 14:53:41 -08002279// RtpDataChannelSingleThreadTest
2280class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002282 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002283 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002284 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2285};
2286
deadbeef953c2ce2017-01-09 14:53:41 -08002287// RtpDataChannelDoubleThreadTest
2288class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002289 public:
2290 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002291 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002292 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293};
2294
2295// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002296template <>
Steve Anton8699a322017-11-06 15:53:33 -08002297std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002298 rtc::Thread* worker_thread,
2299 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002300 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002301 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002302 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002303 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002304 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002305 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002306 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2307 &ssrc_generator_);
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07002308 channel->Init_w(rtp_transport, webrtc::MediaTransportConfig());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309 return channel;
2310}
2311
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002312template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313void ChannelTest<DataTraits>::CreateContent(
2314 int flags,
2315 const cricket::AudioCodec& audio_codec,
2316 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002317 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 data->AddCodec(kGoogleDataCodec);
2319 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320}
2321
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002322template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002324 const cricket::RtpDataContentDescription& source,
2325 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 *data = source;
2327}
2328
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002329template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2331 const cricket::DataCodec& c2) {
2332 return c1.name == c2.name;
2333}
2334
Peter Boström0c4e06b2015-10-07 12:23:21 +02002335template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002337 uint32_t ssrc,
2338 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002339 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 data->AddLegacyStream(ssrc);
2341}
2342
deadbeef953c2ce2017-01-09 14:53:41 -08002343TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 Base::TestInit();
2345 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2346}
2347
deadbeef953c2ce2017-01-09 14:53:41 -08002348TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002349 Base::TestDeinit();
2350}
2351
deadbeef953c2ce2017-01-09 14:53:41 -08002352TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353 Base::TestSetContents();
2354}
2355
deadbeef953c2ce2017-01-09 14:53:41 -08002356TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 Base::TestSetContentsNullOffer();
2358}
2359
deadbeef953c2ce2017-01-09 14:53:41 -08002360TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361 Base::TestSetContentsRtcpMux();
2362}
2363
deadbeef953c2ce2017-01-09 14:53:41 -08002364TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 Base::TestChangeStreamParamsInContent();
2366}
2367
deadbeef953c2ce2017-01-09 14:53:41 -08002368TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369 Base::TestPlayoutAndSendingStates();
2370}
2371
deadbeef953c2ce2017-01-09 14:53:41 -08002372TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 Base::TestMediaContentDirection();
2374}
2375
deadbeef953c2ce2017-01-09 14:53:41 -08002376TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 Base::TestCallSetup();
2378}
2379
deadbeef953c2ce2017-01-09 14:53:41 -08002380TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381 Base::TestCallTeardownRtcpMux();
2382}
2383
zstein56162b92017-04-24 16:54:35 -07002384TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2385 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386}
2387
deadbeef953c2ce2017-01-09 14:53:41 -08002388TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 Base::SendRtpToRtp();
2390}
2391
deadbeef953c2ce2017-01-09 14:53:41 -08002392TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002393 Base::SendRtpToRtpOnThread();
2394}
2395
deadbeef953c2ce2017-01-09 14:53:41 -08002396TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 Base::SendWithWritabilityLoss();
2398}
2399
Steve Anton8a63f782017-10-23 13:08:53 -07002400TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2401 Base::SocketOptionsMergedOnSetTransport();
2402}
2403
deadbeef953c2ce2017-01-09 14:53:41 -08002404TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002405 CreateChannels(0, 0);
2406 EXPECT_TRUE(SendInitiate());
2407 EXPECT_TRUE(SendAccept());
2408
2409 cricket::SendDataParams params;
2410 params.ssrc = 42;
2411 unsigned char data[] = {'f', 'o', 'o'};
2412 rtc::CopyOnWriteBuffer payload(data, 3);
2413 cricket::SendDataResult result;
2414 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2415 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2416 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2417}
2418
deadbeef953c2ce2017-01-09 14:53:41 -08002419TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002420 Base::TestInit();
2421 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2422}
2423
deadbeef953c2ce2017-01-09 14:53:41 -08002424TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002425 Base::TestDeinit();
2426}
2427
deadbeef953c2ce2017-01-09 14:53:41 -08002428TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002429 Base::TestSetContents();
2430}
2431
deadbeef953c2ce2017-01-09 14:53:41 -08002432TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002433 Base::TestSetContentsNullOffer();
2434}
2435
deadbeef953c2ce2017-01-09 14:53:41 -08002436TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002437 Base::TestSetContentsRtcpMux();
2438}
2439
deadbeef953c2ce2017-01-09 14:53:41 -08002440TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441 Base::TestChangeStreamParamsInContent();
2442}
2443
deadbeef953c2ce2017-01-09 14:53:41 -08002444TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002445 Base::TestPlayoutAndSendingStates();
2446}
2447
deadbeef953c2ce2017-01-09 14:53:41 -08002448TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002449 Base::TestMediaContentDirection();
2450}
2451
deadbeef953c2ce2017-01-09 14:53:41 -08002452TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002453 Base::TestCallSetup();
2454}
2455
deadbeef953c2ce2017-01-09 14:53:41 -08002456TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002457 Base::TestCallTeardownRtcpMux();
2458}
2459
zstein56162b92017-04-24 16:54:35 -07002460TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2461 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002462}
2463
deadbeef953c2ce2017-01-09 14:53:41 -08002464TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002465 Base::SendRtpToRtp();
2466}
2467
deadbeef953c2ce2017-01-09 14:53:41 -08002468TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002469 Base::SendRtpToRtpOnThread();
2470}
2471
deadbeef953c2ce2017-01-09 14:53:41 -08002472TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002473 Base::SendWithWritabilityLoss();
2474}
2475
Steve Anton8a63f782017-10-23 13:08:53 -07002476TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2477 Base::SocketOptionsMergedOnSetTransport();
2478}
2479
deadbeef953c2ce2017-01-09 14:53:41 -08002480TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 CreateChannels(0, 0);
2482 EXPECT_TRUE(SendInitiate());
2483 EXPECT_TRUE(SendAccept());
2484
2485 cricket::SendDataParams params;
2486 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002487 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002488 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 cricket::SendDataResult result;
2490 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002491 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2493}
2494
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495// TODO(pthatcher): TestSetReceiver?