blob: ea4e828226c1314fd791d8cb17e281036bc4b273 [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"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "media/base/fake_media_engine.h"
22#include "media/base/fake_rtp.h"
23#include "media/base/media_channel.h"
24#include "p2p/base/candidate_pair_interface.h"
25#include "p2p/base/fake_dtls_transport.h"
26#include "p2p/base/fake_packet_transport.h"
27#include "p2p/base/ice_transport_internal.h"
28#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020038#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040
zhihuangb2cdd932017-01-19 16:54:25 -080041using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080043using cricket::RidDescription;
44using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080046using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080047using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049namespace {
50const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
51const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
52const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070053const cricket::VideoCodec kH264Codec(97, "H264");
54const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020055const cricket::DataCodec kGoogleDataCodec(101, "google-data");
56const uint32_t kSsrc1 = 0x1111;
57const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070058const uint32_t kSsrc3 = 0x3333;
59const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020060const int kAudioPts[] = {0, 8};
61const int kVideoPts[] = {97, 99};
62enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010063
Danil Chapovalov33b01f22016-05-11 19:55:27 +020064} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
deadbeefcbecd352015-09-23 11:50:27 -070066template <class ChannelT,
67 class MediaChannelT,
68 class ContentT,
69 class CodecT,
70 class MediaInfoT,
71 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072class Traits {
73 public:
74 typedef ChannelT Channel;
75 typedef MediaChannelT MediaChannel;
76 typedef ContentT Content;
77 typedef CodecT Codec;
78 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080};
81
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082class VoiceTraits : public Traits<cricket::VoiceChannel,
83 cricket::FakeVoiceMediaChannel,
84 cricket::AudioContentDescription,
85 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
89class VideoTraits : public Traits<cricket::VideoChannel,
90 cricket::FakeVideoMediaChannel,
91 cricket::VideoContentDescription,
92 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020093 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070094 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
deadbeef953c2ce2017-01-09 14:53:41 -080096class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020098 cricket::RtpDataContentDescription,
99 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200100 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700101 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
deadbeef953c2ce2017-01-09 14:53:41 -0800103// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200104template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200105class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 public:
deadbeefac22f702017-01-12 21:59:29 -0800107 enum Flags {
108 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800109 SSRC_MUX = 0x8,
110 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800111 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800112 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700113 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800114 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115
Peter Boström34fbfff2015-09-24 19:20:30 +0200116 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 rtc::ArrayView<const uint8_t> rtp_data,
118 rtc::ArrayView<const uint8_t> rtcp_data,
119 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200120 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800122 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 if (network_is_worker == NetworkIsWorker::Yes) {
124 network_thread_ = rtc::Thread::Current();
125 } else {
126 network_thread_keeper_ = rtc::Thread::Create();
127 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 network_thread_ = network_thread_keeper_.get();
129 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200133 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800134 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200135 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800136 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200137 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
Steve Anton8699a322017-11-06 15:53:33 -0800139 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
140 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200141 int flags1,
142 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800143 // Network thread is started in CreateChannels, to allow the test to
144 // configure a fake clock before any threads are spawned and attempt to
145 // access the time.
146 if (network_thread_keeper_) {
147 network_thread_keeper_->Start();
148 }
Zhi Huange830e682018-03-30 10:48:35 -0700149
deadbeeff5346592017-01-24 21:51:21 -0800150 // Make sure if using raw packet transports, they're used for both
151 // channels.
152 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200153 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800154 media_channel1_ = ch1.get();
155 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800156 rtc::PacketTransportInternal* rtp1 = nullptr;
157 rtc::PacketTransportInternal* rtcp1 = nullptr;
158 rtc::PacketTransportInternal* rtp2 = nullptr;
159 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800160 // Based on flags, create fake DTLS or raw packet transports.
161 if (flags1 & RAW_PACKET_TRANSPORT) {
162 fake_rtp_packet_transport1_.reset(
163 new rtc::FakePacketTransport("channel1_rtp"));
164 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700165 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800166 fake_rtcp_packet_transport1_.reset(
167 new rtc::FakePacketTransport("channel1_rtcp"));
168 rtcp1 = fake_rtcp_packet_transport1_.get();
169 }
170 } else {
171 // Confirmed to work with KT_RSA and KT_ECDSA.
172 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100173 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800174 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700175 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800176 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100177 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
178 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800179 rtcp1 = fake_rtcp_dtls_transport1_.get();
180 }
181 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100182 auto cert1 = rtc::RTCCertificate::Create(
183 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800184 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
185 if (fake_rtcp_dtls_transport1_) {
186 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
187 }
188 }
189 }
190 // Based on flags, create fake DTLS or raw packet transports.
191 if (flags2 & RAW_PACKET_TRANSPORT) {
192 fake_rtp_packet_transport2_.reset(
193 new rtc::FakePacketTransport("channel2_rtp"));
194 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700195 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800196 fake_rtcp_packet_transport2_.reset(
197 new rtc::FakePacketTransport("channel2_rtcp"));
198 rtcp2 = fake_rtcp_packet_transport2_.get();
199 }
200 } else {
201 // Confirmed to work with KT_RSA and KT_ECDSA.
202 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100203 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800204 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700205 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800206 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100207 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
208 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800209 rtcp2 = fake_rtcp_dtls_transport2_.get();
210 }
211 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100212 auto cert2 = rtc::RTCCertificate::Create(
213 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800214 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
215 if (fake_rtcp_dtls_transport2_) {
216 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
217 }
218 }
219 }
Zhi Huange830e682018-03-30 10:48:35 -0700220 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
221 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
222 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
223 flags1);
224 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
225 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
226 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
227 flags2);
228
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800229 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
230 rtp_transport1_.get(), flags1);
231 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
232 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200233 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
234 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 CopyContent(local_media_content1_, &remote_media_content1_);
236 CopyContent(local_media_content2_, &remote_media_content2_);
237
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 // Add stream information (SSRC) to the local content but not to the remote
239 // content. This means that we per default know the SSRC of what we send but
240 // not what we receive.
241 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
242 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
243
244 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
245 if (flags1 & SSRC_MUX) {
246 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
247 }
248 if (flags2 & SSRC_MUX) {
249 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
250 }
251 }
Steve Anton8699a322017-11-06 15:53:33 -0800252 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200253 rtc::Thread* worker_thread,
254 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800255 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700256 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200257 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000258
Zhi Huange830e682018-03-30 10:48:35 -0700259 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
260 rtc::PacketTransportInternal* rtp_packet_transport,
261 rtc::PacketTransportInternal* rtcp_packet_transport,
262 DtlsTransportInternal* rtp_dtls_transport,
263 DtlsTransportInternal* rtcp_dtls_transport,
264 int flags) {
265 if (flags & RTCP_MUX) {
266 rtcp_packet_transport = nullptr;
267 rtcp_dtls_transport = nullptr;
268 }
269
270 if (flags & DTLS) {
271 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
272 } else {
273 if (flags & RAW_PACKET_TRANSPORT) {
274 return CreateUnencryptedTransport(rtp_packet_transport,
275 rtcp_packet_transport);
276 } else {
277 return CreateUnencryptedTransport(rtp_dtls_transport,
278 rtcp_dtls_transport);
279 }
280 }
281 }
282
283 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
284 rtc::PacketTransportInternal* rtp_packet_transport,
285 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200286 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200287 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700288
Niels Möller92430882021-03-18 10:03:19 +0100289 network_thread_->Invoke<void>(
290 RTC_FROM_HERE,
291 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
292 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
293 if (rtcp_packet_transport) {
294 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
295 }
296 });
Zhi Huange830e682018-03-30 10:48:35 -0700297 return rtp_transport;
298 }
299
300 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
301 cricket::DtlsTransportInternal* rtp_dtls_transport,
302 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200303 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700304 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700305
Niels Möller92430882021-03-18 10:03:19 +0100306 network_thread_->Invoke<void>(
307 RTC_FROM_HERE,
308 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
309 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
310 rtcp_dtls_transport);
311 });
Zhi Huange830e682018-03-30 10:48:35 -0700312 return dtls_srtp_transport;
313 }
314
deadbeeff5346592017-01-24 21:51:21 -0800315 void ConnectFakeTransports() {
316 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
317 bool asymmetric = false;
318 // Depending on test flags, could be using DTLS or raw packet transport.
319 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
320 fake_rtp_dtls_transport1_->SetDestination(
321 fake_rtp_dtls_transport2_.get(), asymmetric);
322 }
323 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
324 fake_rtcp_dtls_transport1_->SetDestination(
325 fake_rtcp_dtls_transport2_.get(), asymmetric);
326 }
327 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
328 fake_rtp_packet_transport1_->SetDestination(
329 fake_rtp_packet_transport2_.get(), asymmetric);
330 }
331 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
332 fake_rtcp_packet_transport1_->SetDestination(
333 fake_rtcp_packet_transport2_.get(), asymmetric);
334 }
335 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800336 // The transport becoming writable will asynchronously update the send state
337 // on the worker thread; since this test uses the main thread as the worker
338 // thread, we must process the message queue for this to occur.
339 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800340 }
341
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000343 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800344 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 if (result) {
346 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000347 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800348 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800350 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800352 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 }
354 }
355 return result;
356 }
357
358 bool SendAccept() {
359 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000360 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800361 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 }
363
364 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000365 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800366 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 if (result) {
368 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000369 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800370 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 }
372 return result;
373 }
374
375 bool SendProvisionalAnswer() {
376 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800377 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 if (result) {
379 channel2_->Enable(true);
380 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800381 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800382 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 }
384 return result;
385 }
386
387 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000388 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800389 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000391 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800392 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000393 return result;
394 }
395
deadbeeff5346592017-01-24 21:51:21 -0800396 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 channel1_.reset();
398 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800399 fake_rtp_dtls_transport1_.reset();
400 fake_rtcp_dtls_transport1_.reset();
401 fake_rtp_dtls_transport2_.reset();
402 fake_rtcp_dtls_transport2_.reset();
403 fake_rtp_packet_transport1_.reset();
404 fake_rtcp_packet_transport1_.reset();
405 fake_rtp_packet_transport2_.reset();
406 fake_rtcp_packet_transport2_.reset();
407 if (network_thread_keeper_) {
408 network_thread_keeper_.reset();
409 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 return true;
411 }
412
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendRtp1() {
414 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
415 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendRtp2() {
418 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
419 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
423 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
424 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
427 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
428 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200430
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 }
434 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200438 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
440 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200442 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
444 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
447 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 rtc::SetBE32(data.data() + 8, ssrc);
450 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000451 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000453 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 return data;
455 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456
Yves Gerey665174f2018-06-19 15:03:05 +0200457 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
458 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459
460 void CreateContent(int flags,
461 const cricket::AudioCodec& audio_codec,
462 const cricket::VideoCodec& video_codec,
463 typename T::Content* content) {
464 // overridden in specialized classes
465 }
466 void CopyContent(const typename T::Content& source,
467 typename T::Content* content) {
468 // overridden in specialized classes
469 }
470
Steve Anton18ee1d52017-09-11 11:32:35 -0700471 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700473 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
474 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700475 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700476 AddLegacyStreamInContent(ssrc, 0, content);
477 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 }
479
ossu292d6582016-03-17 02:31:13 -0700480 // Will manage the lifetime of a CallThread, making sure it's
481 // destroyed before this object goes out of scope.
482 class ScopedCallThread {
483 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100485 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100486 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700487 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100488 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700489 }
490
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200491 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700492
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200493 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700494
495 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200496 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700497 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
500 return false; // overridden in specialized classes
501 }
502
Honghai Zhangcc411c02016-03-29 17:27:21 -0700503 cricket::CandidatePairInterface* last_selected_candidate_pair() {
504 return last_selected_candidate_pair_;
505 }
506
Peter Boström0c4e06b2015-10-07 12:23:21 +0200507 void AddLegacyStreamInContent(uint32_t ssrc,
508 int flags,
509 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 // Base implementation.
511 }
512
513 // Tests that can be used by derived classes.
514
515 // Basic sanity check.
516 void TestInit() {
517 CreateChannels(0, 0);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000518 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200520 if (verify_playout_) {
521 EXPECT_FALSE(media_channel1_->playout());
522 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523 EXPECT_TRUE(media_channel1_->codecs().empty());
524 EXPECT_TRUE(media_channel1_->recv_streams().empty());
525 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 }
527
528 // Test that SetLocalContent and SetRemoteContent properly configure
529 // the codecs.
530 void TestSetContents() {
531 CreateChannels(0, 0);
532 typename T::Content content;
533 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800534 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800536 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200538 EXPECT_TRUE(
539 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 }
541
Johannes Kron9190b822018-10-29 11:22:05 +0100542 // Test that SetLocalContent and SetRemoteContent properly configure
543 // extmap-allow-mixed.
544 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
545 // For a caller, SetLocalContent() is called first with an offer and next
546 // SetRemoteContent() is called with the answer.
547 CreateChannels(0, 0);
548 typename T::Content content;
549 CreateContent(0, kPcmuCodec, kH264Codec, &content);
550 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
551 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
552 content.set_extmap_allow_mixed_enum(offer_enum);
553 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
554 content.set_extmap_allow_mixed_enum(answer_enum);
555 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
556 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
557 }
558 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
559 // For a callee, SetRemoteContent() is called first with an offer and next
560 // SetLocalContent() is called with the answer.
561 CreateChannels(0, 0);
562 typename T::Content content;
563 CreateContent(0, kPcmuCodec, kH264Codec, &content);
564 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
565 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
566 content.set_extmap_allow_mixed_enum(offer_enum);
567 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
568 content.set_extmap_allow_mixed_enum(answer_enum);
569 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
570 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
571 }
572
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 // Test that SetLocalContent and SetRemoteContent properly deals
574 // with an empty offer.
575 void TestSetContentsNullOffer() {
576 CreateChannels(0, 0);
577 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800578 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 CreateContent(0, kPcmuCodec, kH264Codec, &content);
580 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800581 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200583 EXPECT_TRUE(
584 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 }
586
587 // Test that SetLocalContent and SetRemoteContent properly set RTCP
588 // mux.
589 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800590 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 typename T::Content content;
592 CreateContent(0, kPcmuCodec, kH264Codec, &content);
593 // Both sides agree on mux. Should no longer be a separate RTCP channel.
594 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800595 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
596 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800598 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800600 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 }
602
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 // Test that SetLocalContent and SetRemoteContent properly
604 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800605 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 void TestChangeStreamParamsInContent() {
607 cricket::StreamParams stream1;
608 stream1.groupid = "group1";
609 stream1.id = "stream1";
610 stream1.ssrcs.push_back(kSsrc1);
611 stream1.cname = "stream1_cname";
612
613 cricket::StreamParams stream2;
614 stream2.groupid = "group1";
615 stream2.id = "stream2";
616 stream2.ssrcs.push_back(kSsrc2);
617 stream2.cname = "stream2_cname";
618
619 // Setup a call where channel 1 send |stream1| to channel 2.
620 CreateChannels(0, 0);
621 typename T::Content content1;
622 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
623 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800624 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 EXPECT_TRUE(channel1_->Enable(true));
626 EXPECT_EQ(1u, media_channel1_->send_streams().size());
627
Steve Anton3828c062017-12-06 10:34:51 -0800628 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800630 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631
632 // Channel 2 do not send anything.
633 typename T::Content content2;
634 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800635 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800637 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 EXPECT_TRUE(channel2_->Enable(true));
639 EXPECT_EQ(0u, media_channel2_->send_streams().size());
640
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200641 SendCustomRtp1(kSsrc1, 0);
642 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
644
645 // Let channel 2 update the content by sending |stream2| and enable SRTP.
646 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700647 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800649 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 ASSERT_EQ(1u, media_channel2_->send_streams().size());
651 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
652
Steve Anton3828c062017-12-06 10:34:51 -0800653 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
655 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
656
657 // Channel 1 replies but stop sending stream1.
658 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700659 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800660 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 EXPECT_EQ(0u, media_channel1_->send_streams().size());
662
Steve Anton3828c062017-12-06 10:34:51 -0800663 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
665
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200666 SendCustomRtp2(kSsrc2, 0);
667 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
669 }
670
671 // Test that we only start playout and sending at the right times.
672 void TestPlayoutAndSendingStates() {
673 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200674 if (verify_playout_) {
675 EXPECT_FALSE(media_channel1_->playout());
676 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200678 if (verify_playout_) {
679 EXPECT_FALSE(media_channel2_->playout());
680 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_FALSE(media_channel2_->sending());
682 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200683 if (verify_playout_) {
684 EXPECT_FALSE(media_channel1_->playout());
685 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800688 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200689 if (verify_playout_) {
690 EXPECT_TRUE(media_channel1_->playout());
691 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800694 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200695 if (verify_playout_) {
696 EXPECT_FALSE(media_channel2_->playout());
697 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800700 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200701 if (verify_playout_) {
702 EXPECT_FALSE(media_channel2_->playout());
703 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800705 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200706 if (verify_playout_) {
707 EXPECT_TRUE(media_channel1_->playout());
708 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200710 if (verify_playout_) {
711 EXPECT_FALSE(media_channel2_->playout());
712 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_FALSE(media_channel2_->sending());
714 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200715 if (verify_playout_) {
716 EXPECT_TRUE(media_channel2_->playout());
717 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000719 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800720 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200721 if (verify_playout_) {
722 EXPECT_TRUE(media_channel1_->playout());
723 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_TRUE(media_channel1_->sending());
725 }
726
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 // Test that changing the MediaContentDirection in the local and remote
728 // session description start playout and sending at the right time.
729 void TestMediaContentDirection() {
730 CreateChannels(0, 0);
731 typename T::Content content1;
732 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
733 typename T::Content content2;
734 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
735 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800736 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737
738 EXPECT_TRUE(channel1_->Enable(true));
739 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200740 if (verify_playout_) {
741 EXPECT_FALSE(media_channel1_->playout());
742 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200744 if (verify_playout_) {
745 EXPECT_FALSE(media_channel2_->playout());
746 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_FALSE(media_channel2_->sending());
748
Steve Anton3828c062017-12-06 10:34:51 -0800749 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
750 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
751 EXPECT_TRUE(
752 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
753 EXPECT_TRUE(
754 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800755 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
Peter Boström34fbfff2015-09-24 19:20:30 +0200757 if (verify_playout_) {
758 EXPECT_TRUE(media_channel1_->playout());
759 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200761 if (verify_playout_) {
762 EXPECT_FALSE(media_channel2_->playout()); // local InActive
763 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_FALSE(media_channel2_->sending()); // local InActive
765
766 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800767 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800768 EXPECT_TRUE(
769 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
770 EXPECT_TRUE(
771 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772
Peter Boström34fbfff2015-09-24 19:20:30 +0200773 if (verify_playout_) {
774 EXPECT_TRUE(media_channel1_->playout());
775 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200777 if (verify_playout_) {
778 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
779 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
781
782 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800783 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800784 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
785 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786
Peter Boström34fbfff2015-09-24 19:20:30 +0200787 if (verify_playout_) {
788 EXPECT_TRUE(media_channel1_->playout());
789 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200791 if (verify_playout_) {
792 EXPECT_TRUE(media_channel2_->playout());
793 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794 EXPECT_TRUE(media_channel2_->sending());
795 }
796
Honghai Zhangcc411c02016-03-29 17:27:21 -0700797 // Tests that when the transport channel signals a candidate pair change
798 // event, the media channel will receive a call on the network route change.
799 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700800 static constexpr uint16_t kLocalNetId = 1;
801 static constexpr uint16_t kRemoteNetId = 2;
802 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800803 // Ipv4(20) + UDP(8).
804 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800805 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200806
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800807 CreateChannels(DTLS, DTLS);
808 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700809
Honghai Zhangcc411c02016-03-29 17:27:21 -0700810 typename T::MediaChannel* media_channel1 =
811 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200812 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700813
Zhi Huang942bc2e2017-11-13 13:26:07 -0800814 // Need to wait for the threads before calling
815 // |set_num_network_route_changes| because the network route would be set
816 // when creating the channel.
817 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200818 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800819 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800820 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200821 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800822 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200823 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200824 });
825 WaitForThreads();
826 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700827 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200828 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700829
eladalon05b07bb2017-08-24 07:40:16 -0700830 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800831 rtc::NetworkRoute network_route;
832 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100833 network_route.local =
834 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
835 network_route.remote =
836 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800837 network_route.last_sent_packet_id = kLastPacketId;
838 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200839 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800840 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
841
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200842 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200843 });
844 WaitForThreads();
845 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100846 EXPECT_TRUE(media_channel1->last_network_route().connected);
847 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100848 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100849 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100850 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200851 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700852 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800853 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800854 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700855 }
856
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 // Test setting up a call.
858 void TestCallSetup() {
859 CreateChannels(0, 0);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000860 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200862 if (verify_playout_) {
863 EXPECT_TRUE(media_channel1_->playout());
864 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_FALSE(media_channel1_->sending());
866 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000867 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 EXPECT_TRUE(media_channel1_->sending());
869 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200870 if (verify_playout_) {
871 EXPECT_TRUE(media_channel2_->playout());
872 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873 EXPECT_TRUE(media_channel2_->sending());
874 EXPECT_EQ(1U, media_channel2_->codecs().size());
875 }
876
877 // Test that we don't crash if packets are sent during call teardown
878 // when RTCP mux is enabled. This is a regression test against a specific
879 // race condition that would only occur when a RTCP packet was sent during
880 // teardown of a channel on which RTCP mux was enabled.
881 void TestCallTeardownRtcpMux() {
882 class LastWordMediaChannel : public T::MediaChannel {
883 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200884 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700886 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
887 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
889 }
890 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200891 CreateChannels(std::make_unique<LastWordMediaChannel>(),
892 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200893 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000894 EXPECT_TRUE(SendInitiate());
895 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800896 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 }
898
899 // Send voice RTP data to the other side and ensure it gets there.
900 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700901 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 EXPECT_TRUE(SendInitiate());
903 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000904 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
905 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200906 SendRtp1();
907 SendRtp2();
908 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 EXPECT_TRUE(CheckRtp1());
910 EXPECT_TRUE(CheckRtp2());
911 EXPECT_TRUE(CheckNoRtp1());
912 EXPECT_TRUE(CheckNoRtp2());
913 }
914
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200915 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800916 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200917 EXPECT_TRUE(SendInitiate());
918 EXPECT_TRUE(SendAccept());
919 SendRtp1();
920 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200921 // Do not wait, destroy channels.
922 channel1_.reset(nullptr);
923 channel2_.reset(nullptr);
924 }
925
Zhi Huange830e682018-03-30 10:48:35 -0700926 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
927 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000928 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
929 EXPECT_FALSE(channel2_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200931 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000933 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
934 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200935 SendRtp1();
936 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200937 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 EXPECT_TRUE(CheckRtp1());
939 EXPECT_TRUE(CheckRtp2());
940 EXPECT_TRUE(CheckNoRtp1());
941 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 }
943
944 // Test that we can send and receive early media when a provisional answer is
945 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
946 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200947 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948
Yves Gerey665174f2018-06-19 15:03:05 +0200949 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
950 EXPECT_TRUE(SendOffer());
951 EXPECT_TRUE(SendProvisionalAnswer());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000952 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
953 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
954 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
955 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +0200956 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200957 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
958 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200959 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960
Yves Gerey665174f2018-06-19 15:03:05 +0200961 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200962 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
963 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200964 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965
Yves Gerey665174f2018-06-19 15:03:05 +0200966 // Complete call setup and ensure everything is still OK.
967 EXPECT_TRUE(SendFinalAnswer());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000968 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
969 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
Yves Gerey665174f2018-06-19 15:03:05 +0200970 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200971 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
972 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200973 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200974 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 }
976
977 // Test that we properly send RTP without SRTP from a thread.
978 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800979 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 EXPECT_TRUE(SendInitiate());
981 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200982 ScopedCallThread send_rtp1([this] { SendRtp1(); });
983 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700984 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200985 WaitForThreads(involved_threads);
986 EXPECT_TRUE(CheckRtp1());
987 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 EXPECT_TRUE(CheckNoRtp1());
989 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 }
991
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 // Test that the mediachannel retains its sending state after the transport
993 // becomes non-writable.
994 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -0700995 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 EXPECT_TRUE(SendInitiate());
997 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000998 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
999 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001000 SendRtp1();
1001 SendRtp2();
1002 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 EXPECT_TRUE(CheckRtp1());
1004 EXPECT_TRUE(CheckRtp2());
1005 EXPECT_TRUE(CheckNoRtp1());
1006 EXPECT_TRUE(CheckNoRtp2());
1007
wu@webrtc.org97077a32013-10-25 21:18:33 +00001008 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001009 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1010 fake_rtp_dtls_transport1_->SetWritable(false);
1011 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001012 SendRtp1();
1013 SendRtp2();
1014 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 EXPECT_TRUE(CheckRtp1());
1016 EXPECT_TRUE(CheckNoRtp2());
1017
1018 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001019 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1020 fake_rtp_dtls_transport1_->SetWritable(true);
1021 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001023 SendRtp1();
1024 SendRtp2();
1025 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(CheckRtp1());
1027 EXPECT_TRUE(CheckRtp2());
1028 EXPECT_TRUE(CheckNoRtp1());
1029 EXPECT_TRUE(CheckNoRtp2());
1030
1031 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001032 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1033 bool asymmetric = true;
1034 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1035 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 EXPECT_TRUE(media_channel1_->sending());
1037
wu@webrtc.org97077a32013-10-25 21:18:33 +00001038 // Should fail also.
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());
zhihuangb2cdd932017-01-19 16:54:25 -08001044 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045
1046 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001047 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001048 bool asymmetric = true;
1049 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1050 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001051 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001053 SendRtp1();
1054 SendRtp2();
1055 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 EXPECT_TRUE(CheckRtp1());
1057 EXPECT_TRUE(CheckRtp2());
1058 EXPECT_TRUE(CheckNoRtp1());
1059 EXPECT_TRUE(CheckNoRtp2());
1060 }
1061
Yves Gerey665174f2018-06-19 15:03:05 +02001062 void SendBundleToBundle(const int* pl_types,
1063 int len,
1064 bool rtcp_mux,
1065 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001066 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001068 // Only pl_type1 was added to the bundle filter for both |channel1_|
1069 // and |channel2_|.
1070 int pl_type1 = pl_types[0];
1071 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001072 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001073 if (secure)
1074 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001075 if (rtcp_mux) {
1076 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001077 }
1078 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001081
1082 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1084 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1085 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001086 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001087 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1088 EXPECT_TRUE(CheckNoRtp1());
1089 EXPECT_TRUE(CheckNoRtp2());
1090
Zhi Huang365381f2018-04-13 16:44:34 -07001091 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1092 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001093 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001094 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1095 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 }
1097
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 void TestSetContentFailure() {
1099 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100
Peter Thatchera6d24442015-07-09 21:26:36 -07001101 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001102 std::unique_ptr<typename T::Content> content(
1103 CreateMediaContentWithStream(1));
1104
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001106 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001107 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001108 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001109 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001112 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001113 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001114
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001116 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001117 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 }
1119
1120 void TestSendTwoOffers() {
1121 CreateChannels(0, 0);
1122
Peter Thatchera6d24442015-07-09 21:26:36 -07001123 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001124 std::unique_ptr<typename T::Content> content1(
1125 CreateMediaContentWithStream(1));
1126 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001127 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1129
Steve Anton18ee1d52017-09-11 11:32:35 -07001130 std::unique_ptr<typename T::Content> content2(
1131 CreateMediaContentWithStream(2));
1132 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001133 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1135 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1136 }
1137
1138 void TestReceiveTwoOffers() {
1139 CreateChannels(0, 0);
1140
Peter Thatchera6d24442015-07-09 21:26:36 -07001141 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001142 std::unique_ptr<typename T::Content> content1(
1143 CreateMediaContentWithStream(1));
1144 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001145 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1147
Steve Anton18ee1d52017-09-11 11:32:35 -07001148 std::unique_ptr<typename T::Content> content2(
1149 CreateMediaContentWithStream(2));
1150 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001151 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1153 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1154 }
1155
1156 void TestSendPrAnswer() {
1157 CreateChannels(0, 0);
1158
Peter Thatchera6d24442015-07-09 21:26:36 -07001159 std::string err;
1160 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001161 std::unique_ptr<typename T::Content> content1(
1162 CreateMediaContentWithStream(1));
1163 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001164 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1166
Peter Thatchera6d24442015-07-09 21:26:36 -07001167 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001168 std::unique_ptr<typename T::Content> content2(
1169 CreateMediaContentWithStream(2));
1170 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001171 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001172 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1173 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1174
Peter Thatchera6d24442015-07-09 21:26:36 -07001175 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001176 std::unique_ptr<typename T::Content> content3(
1177 CreateMediaContentWithStream(3));
1178 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001179 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1181 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1182 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1183 }
1184
1185 void TestReceivePrAnswer() {
1186 CreateChannels(0, 0);
1187
Peter Thatchera6d24442015-07-09 21:26:36 -07001188 std::string err;
1189 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001190 std::unique_ptr<typename T::Content> content1(
1191 CreateMediaContentWithStream(1));
1192 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001193 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1195
Peter Thatchera6d24442015-07-09 21:26:36 -07001196 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001197 std::unique_ptr<typename T::Content> content2(
1198 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001199 EXPECT_TRUE(
1200 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001201 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1202 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1203
Peter Thatchera6d24442015-07-09 21:26:36 -07001204 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001205 std::unique_ptr<typename T::Content> content3(
1206 CreateMediaContentWithStream(3));
1207 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001208 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001209 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1210 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1211 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1212 }
1213
zstein56162b92017-04-24 16:54:35 -07001214 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001215 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001217
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001218 network_thread_->PostTask(
1219 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001220 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001221 EXPECT_TRUE(media_channel1_->ready_to_send());
1222
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001223 network_thread_->PostTask(
1224 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001225 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 }
1228
skvladdc1c62c2016-03-16 19:07:43 -07001229 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1230 typename T::Content content;
1231 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1232 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001233 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001234 }
1235
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001236 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001237 webrtc::RtpParameters parameters;
1238 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001239 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001240 parameters.encodings.push_back(encoding);
1241 return parameters;
1242 }
1243
1244 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001245 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001246 EXPECT_EQ(1UL, parameters.encodings.size());
1247 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1248 }
1249
1250 void DefaultMaxBitrateIsUnlimited() {
1251 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001252 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1253 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001254 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001255 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001256 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001257 }
1258
Zhi Huange830e682018-03-30 10:48:35 -07001259 // Test that when a channel gets new RtpTransport with a call to
1260 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1261 // with the options on the new one.
1262
Steve Anton8a63f782017-10-23 13:08:53 -07001263 // For example, audio and video may use separate socket options, but initially
1264 // be unbundled, then later become bundled. When this happens, their preferred
1265 // socket options should be merged to the underlying transport they share.
1266 void SocketOptionsMergedOnSetTransport() {
1267 constexpr int kSndBufSize = 4000;
1268 constexpr int kRcvBufSize = 8000;
1269
Zhi Huange830e682018-03-30 10:48:35 -07001270 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001271
1272 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1273 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1274 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1275 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1276
Zhi Huange830e682018-03-30 10:48:35 -07001277 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001278 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001279 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001280
Niels Möller92430882021-03-18 10:03:19 +01001281 bool rcv_success, send_success;
1282 int rcv_buf, send_buf;
1283 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
1284 send_success = fake_rtp_dtls_transport2_->GetOption(
1285 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1286 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1287 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1288 });
1289
1290 ASSERT_TRUE(send_success);
1291 EXPECT_EQ(kSndBufSize, send_buf);
1292 ASSERT_TRUE(rcv_success);
1293 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001294 }
1295
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001296 void CreateSimulcastContent(const std::vector<std::string>& rids,
1297 typename T::Content* content) {
1298 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001299 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001300 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1301 }
1302
1303 StreamParams stream;
1304 stream.set_rids(rid_descriptions);
1305 CreateContent(0, kPcmuCodec, kH264Codec, content);
1306 // This is for unified plan, so there can be only one StreamParams.
1307 content->mutable_streams().clear();
1308 content->AddStream(stream);
1309 }
1310
1311 void VerifySimulcastStreamParams(const StreamParams& expected,
1312 const typename T::Channel* channel) {
1313 const std::vector<StreamParams>& streams = channel->local_streams();
1314 ASSERT_EQ(1u, streams.size());
1315 const StreamParams& result = streams[0];
1316 EXPECT_EQ(expected.rids(), result.rids());
1317 EXPECT_TRUE(result.has_ssrcs());
1318 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1319 std::vector<uint32_t> primary_ssrcs;
1320 result.GetPrimarySsrcs(&primary_ssrcs);
1321 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1322 }
1323
1324 void TestUpdateLocalStreamsWithSimulcast() {
1325 CreateChannels(0, 0);
1326 typename T::Content content1, content2, content3;
1327 CreateSimulcastContent({"f", "h", "q"}, &content1);
1328 EXPECT_TRUE(
1329 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1330 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1331 StreamParams stream1 = channel1_->local_streams()[0];
1332
1333 // Create a similar offer. SetLocalContent should not remove and add.
1334 CreateSimulcastContent({"f", "h", "q"}, &content2);
1335 EXPECT_TRUE(
1336 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1337 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1338 StreamParams stream2 = channel1_->local_streams()[0];
1339 // Check that the streams are identical (SSRCs didn't change).
1340 EXPECT_EQ(stream1, stream2);
1341
1342 // Create third offer that has same RIDs in different order.
1343 CreateSimulcastContent({"f", "q", "h"}, &content3);
1344 EXPECT_TRUE(
1345 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1346 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1347 }
1348
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001349 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001350 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1351 static void ProcessThreadQueue(rtc::Thread* thread) {
1352 RTC_DCHECK(thread->IsCurrent());
1353 while (!thread->empty()) {
1354 thread->ProcessMessages(0);
1355 }
1356 }
1357 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1358 // |threads| and current thread post packets to network thread.
1359 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001360 thread->Invoke<void>(RTC_FROM_HERE,
1361 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001362 }
1363 ProcessThreadQueue(rtc::Thread::Current());
1364 // Network thread move them around and post back to worker = current thread.
1365 if (!network_thread_->IsCurrent()) {
1366 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001367 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001368 }
1369 // Worker thread = current Thread process received messages.
1370 ProcessThreadQueue(rtc::Thread::Current());
1371 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001372 // TODO(pbos): Remove playout from all media channels and let renderers mute
1373 // themselves.
1374 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001375 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1376 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001377 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1378 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1379 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1380 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1381 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1382 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1383 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1384 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001385 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1386 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1387 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001388 cricket::FakeMediaEngine media_engine_;
1389 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001390 typename T::MediaChannel* media_channel1_ = nullptr;
1391 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001392 std::unique_ptr<typename T::Channel> channel1_;
1393 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394 typename T::Content local_media_content1_;
1395 typename T::Content local_media_content2_;
1396 typename T::Content remote_media_content1_;
1397 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001398 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001399 rtc::Buffer rtp_packet_;
1400 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001401 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001402 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403};
1404
Yves Gerey665174f2018-06-19 15:03:05 +02001405template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001406std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1407 rtc::Thread* worker_thread,
1408 rtc::Thread* network_thread,
1409 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1410 webrtc::RtpTransportInternal* rtp_transport,
1411 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001412 rtc::Thread* signaling_thread = rtc::Thread::Current();
1413 auto channel = std::make_unique<cricket::VoiceChannel>(
1414 worker_thread, network_thread, signaling_thread, std::move(ch),
1415 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1416 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001417 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001418 return channel;
1419}
1420
1421template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422void ChannelTest<VoiceTraits>::CreateContent(
1423 int flags,
1424 const cricket::AudioCodec& audio_codec,
1425 const cricket::VideoCodec& video_codec,
1426 cricket::AudioContentDescription* audio) {
1427 audio->AddCodec(audio_codec);
1428 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001429}
1430
Yves Gerey665174f2018-06-19 15:03:05 +02001431template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432void ChannelTest<VoiceTraits>::CopyContent(
1433 const cricket::AudioContentDescription& source,
1434 cricket::AudioContentDescription* audio) {
1435 *audio = source;
1436}
1437
Yves Gerey665174f2018-06-19 15:03:05 +02001438template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1440 const cricket::AudioCodec& c2) {
1441 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001442 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443}
1444
Peter Boström0c4e06b2015-10-07 12:23:21 +02001445template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001447 uint32_t ssrc,
1448 int flags,
1449 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450 audio->AddLegacyStream(ssrc);
1451}
1452
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001453class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 public:
solenberg1dd98f32015-09-10 01:57:14 -07001455 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001456 VoiceChannelSingleThreadTest()
1457 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1458};
1459
1460class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1461 public:
1462 typedef ChannelTest<VoiceTraits> Base;
1463 VoiceChannelDoubleThreadTest()
1464 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465};
1466
jbauch5869f502017-06-29 12:31:36 -07001467class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001468 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001469 public:
1470 typedef ChannelTest<VoiceTraits> Base;
1471 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001472 : Base(true,
1473 kPcmuFrameWithExtensions,
1474 kRtcpReport,
1475 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001476};
1477
1478class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001479 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001480 public:
1481 typedef ChannelTest<VoiceTraits> Base;
1482 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001483 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1484 }
jbauch5869f502017-06-29 12:31:36 -07001485};
1486
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001488template <>
Steve Anton8699a322017-11-06 15:53:33 -08001489std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001490 rtc::Thread* worker_thread,
1491 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001492 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001493 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001494 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001495 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001496 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001497 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001498 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1499 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001500 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501 return channel;
1502}
1503
Yves Gerey665174f2018-06-19 15:03:05 +02001504template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505void ChannelTest<VideoTraits>::CreateContent(
1506 int flags,
1507 const cricket::AudioCodec& audio_codec,
1508 const cricket::VideoCodec& video_codec,
1509 cricket::VideoContentDescription* video) {
1510 video->AddCodec(video_codec);
1511 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512}
1513
Yves Gerey665174f2018-06-19 15:03:05 +02001514template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001515void ChannelTest<VideoTraits>::CopyContent(
1516 const cricket::VideoContentDescription& source,
1517 cricket::VideoContentDescription* video) {
1518 *video = source;
1519}
1520
Yves Gerey665174f2018-06-19 15:03:05 +02001521template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1523 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001524 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525}
1526
Peter Boström0c4e06b2015-10-07 12:23:21 +02001527template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001529 uint32_t ssrc,
1530 int flags,
1531 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532 video->AddLegacyStream(ssrc);
1533}
1534
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001535class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536 public:
solenberg1dd98f32015-09-10 01:57:14 -07001537 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001538 VideoChannelSingleThreadTest()
1539 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540};
1541
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001542class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1543 public:
1544 typedef ChannelTest<VideoTraits> Base;
1545 VideoChannelDoubleThreadTest()
1546 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1547};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001549TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 Base::TestInit();
1551 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1552 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1553}
1554
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001555TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1556 Base::TestDeinit();
1557}
1558
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001559TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560 Base::TestSetContents();
1561}
1562
Johannes Kron9190b822018-10-29 11:22:05 +01001563TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1564 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1565}
1566
1567TEST_F(VoiceChannelSingleThreadTest,
1568 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1569 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1570}
1571
1572TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1573 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1574}
1575
1576TEST_F(VoiceChannelSingleThreadTest,
1577 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1578 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1579}
1580
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001581TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 Base::TestSetContentsNullOffer();
1583}
1584
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001585TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001586 Base::TestSetContentsRtcpMux();
1587}
1588
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001589TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 Base::TestSetContentsRtcpMux();
1591}
1592
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001593TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594 Base::TestChangeStreamParamsInContent();
1595}
1596
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001597TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 Base::TestPlayoutAndSendingStates();
1599}
1600
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001601TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 Base::TestMediaContentDirection();
1603}
1604
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001605TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001606 Base::TestNetworkRouteChanges();
1607}
1608
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001609TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001610 Base::TestCallSetup();
1611}
1612
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001613TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 Base::TestCallTeardownRtcpMux();
1615}
1616
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001617TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 Base::SendRtpToRtp();
1619}
1620
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001621TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001622 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623}
1624
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001625TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001626 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001627}
1628
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001629TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1631}
1632
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001633TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001634 Base::SendRtpToRtpOnThread();
1635}
1636
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001637TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001638 Base::SendWithWritabilityLoss();
1639}
1640
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001641TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642 Base::TestSetContentFailure();
1643}
1644
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001645TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 Base::TestSendTwoOffers();
1647}
1648
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001649TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001650 Base::TestReceiveTwoOffers();
1651}
1652
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001653TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 Base::TestSendPrAnswer();
1655}
1656
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001657TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 Base::TestReceivePrAnswer();
1659}
1660
zstein56162b92017-04-24 16:54:35 -07001661TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1662 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663}
1664
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001665TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001666 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667}
1668
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001669TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001670 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001671}
1672
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001673TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001674 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001675}
1676
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001677TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001678 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679}
1680
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001681TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001682 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001683}
1684
Steve Anton8a63f782017-10-23 13:08:53 -07001685TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1686 Base::SocketOptionsMergedOnSetTransport();
1687}
1688
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001689// VoiceChannelDoubleThreadTest
1690TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001692 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1693 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694}
1695
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001696TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1697 Base::TestDeinit();
1698}
1699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 Base::TestSetContents();
1702}
1703
Johannes Kron9190b822018-10-29 11:22:05 +01001704TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1705 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1706}
1707
1708TEST_F(VoiceChannelDoubleThreadTest,
1709 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1710 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1711}
1712
1713TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1714 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1715}
1716
1717TEST_F(VoiceChannelDoubleThreadTest,
1718 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1719 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1720}
1721
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001722TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 Base::TestSetContentsNullOffer();
1724}
1725
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001726TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 Base::TestSetContentsRtcpMux();
1728}
1729
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001730TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 Base::TestSetContentsRtcpMux();
1732}
1733
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001734TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 Base::TestChangeStreamParamsInContent();
1736}
1737
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001738TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 Base::TestPlayoutAndSendingStates();
1740}
1741
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001742TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1743 Base::TestMediaContentDirection();
1744}
1745
1746TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1747 Base::TestNetworkRouteChanges();
1748}
1749
1750TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1751 Base::TestCallSetup();
1752}
1753
1754TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1755 Base::TestCallTeardownRtcpMux();
1756}
1757
1758TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1759 Base::SendRtpToRtp();
1760}
1761
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001762TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001763 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764}
1765
1766TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001767 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001768}
1769
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001770TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1771 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1772}
1773
1774TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1775 Base::SendRtpToRtpOnThread();
1776}
1777
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001778TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1779 Base::SendWithWritabilityLoss();
1780}
1781
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001782TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1783 Base::TestSetContentFailure();
1784}
1785
1786TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1787 Base::TestSendTwoOffers();
1788}
1789
1790TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1791 Base::TestReceiveTwoOffers();
1792}
1793
1794TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1795 Base::TestSendPrAnswer();
1796}
1797
1798TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1799 Base::TestReceivePrAnswer();
1800}
1801
zstein56162b92017-04-24 16:54:35 -07001802TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1803 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001804}
1805
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001806TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1807 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1808}
1809
1810TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1811 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1812}
1813
1814TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1815 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1816}
1817
1818TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1819 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1820}
1821
1822TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1823 Base::DefaultMaxBitrateIsUnlimited();
1824}
1825
Steve Anton8a63f782017-10-23 13:08:53 -07001826TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1827 Base::SocketOptionsMergedOnSetTransport();
1828}
1829
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001830// VideoChannelSingleThreadTest
1831TEST_F(VideoChannelSingleThreadTest, TestInit) {
1832 Base::TestInit();
1833}
1834
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001835TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1836 Base::TestDeinit();
1837}
1838
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001839TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1840 Base::TestSetContents();
1841}
1842
Johannes Kron9190b822018-10-29 11:22:05 +01001843TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1844 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1845}
1846
1847TEST_F(VideoChannelSingleThreadTest,
1848 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1849 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1850}
1851
1852TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1853 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1854}
1855
1856TEST_F(VideoChannelSingleThreadTest,
1857 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1858 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1859}
1860
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001861TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1862 Base::TestSetContentsNullOffer();
1863}
1864
1865TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1866 Base::TestSetContentsRtcpMux();
1867}
1868
1869TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1870 Base::TestSetContentsRtcpMux();
1871}
1872
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001873TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1874 Base::TestChangeStreamParamsInContent();
1875}
1876
1877TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1878 Base::TestPlayoutAndSendingStates();
1879}
1880
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001881TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001882 Base::TestMediaContentDirection();
1883}
1884
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001885TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001886 Base::TestNetworkRouteChanges();
1887}
1888
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001889TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001890 Base::TestCallSetup();
1891}
1892
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001893TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894 Base::TestCallTeardownRtcpMux();
1895}
1896
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001897TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 Base::SendRtpToRtp();
1899}
1900
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001901TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001902 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903}
1904
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001905TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001906 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907}
1908
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001909TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1911}
1912
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001913TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 Base::SendRtpToRtpOnThread();
1915}
1916
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001917TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918 Base::SendWithWritabilityLoss();
1919}
1920
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001921TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 Base::TestSetContentFailure();
1923}
1924
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001925TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 Base::TestSendTwoOffers();
1927}
1928
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001929TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930 Base::TestReceiveTwoOffers();
1931}
1932
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001933TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934 Base::TestSendPrAnswer();
1935}
1936
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001937TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 Base::TestReceivePrAnswer();
1939}
1940
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001941TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001942 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943}
1944
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001945TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001946 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001947}
1948
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001949TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001950 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001951}
1952
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001953TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001954 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955}
1956
zstein56162b92017-04-24 16:54:35 -07001957TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1958 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959}
1960
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001961TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001962 Base::DefaultMaxBitrateIsUnlimited();
1963}
1964
Steve Anton8a63f782017-10-23 13:08:53 -07001965TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1966 Base::SocketOptionsMergedOnSetTransport();
1967}
1968
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001969TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1970 Base::TestUpdateLocalStreamsWithSimulcast();
1971}
1972
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001973TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1974 const cricket::VideoCodec kVp8Codec(97, "VP8");
1975 cricket::VideoCodec vp9_codec(98, "VP9");
1976 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1977 cricket::VideoContentDescription video;
1978 video.set_codecs({kVp8Codec, vp9_codec});
1979
1980 CreateChannels(0, 0);
1981
1982 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
1983 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
1984 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
1985 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
1986 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
1987 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
1988 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
1989 cricket::kPacketizationParamRaw);
1990}
1991
1992TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
1993 const cricket::VideoCodec kVp8Codec(97, "VP8");
1994 cricket::VideoCodec vp9_codec(98, "VP9");
1995 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1996 cricket::VideoContentDescription video;
1997 video.set_codecs({kVp8Codec, vp9_codec});
1998
1999 CreateChannels(0, 0);
2000
2001 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2002 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2003 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2004 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2005 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2006 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2007 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2008 cricket::kPacketizationParamRaw);
2009}
2010
2011TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2012 const cricket::VideoCodec kVp8Codec(97, "VP8");
2013 cricket::VideoCodec vp9_codec(98, "VP9");
2014 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2015 cricket::VideoContentDescription video;
2016 video.set_codecs({kVp8Codec, vp9_codec});
2017
2018 CreateChannels(0, 0);
2019
2020 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2021 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2022 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2023 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2024 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2025 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2026 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2027 cricket::kPacketizationParamRaw);
2028 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2029 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2030 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2031 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2032 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2033 cricket::kPacketizationParamRaw);
2034}
2035
2036TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2037 const cricket::VideoCodec kLocalCodec(98, "VP8");
2038 cricket::VideoCodec remote_codec(99, "VP8");
2039 remote_codec.packetization = cricket::kPacketizationParamRaw;
2040 cricket::VideoContentDescription local_video;
2041 local_video.set_codecs({kLocalCodec});
2042 cricket::VideoContentDescription remote_video;
2043 remote_video.set_codecs({remote_codec});
2044
2045 CreateChannels(0, 0);
2046
2047 EXPECT_TRUE(
2048 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2049 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2050 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2051 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2052 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2053 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2054}
2055
2056TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2057 cricket::VideoCodec local_codec(98, "VP8");
2058 local_codec.packetization = cricket::kPacketizationParamRaw;
2059 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2060 cricket::VideoContentDescription local_video;
2061 local_video.set_codecs({local_codec});
2062 cricket::VideoContentDescription remote_video;
2063 remote_video.set_codecs({kRemoteCodec});
2064
2065 CreateChannels(0, 0);
2066
2067 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2068 EXPECT_TRUE(
2069 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2070 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2071 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2072 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2073 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2074}
2075
2076TEST_F(VideoChannelSingleThreadTest,
2077 TestSetRemoteAnswerWithInvalidPacketization) {
2078 cricket::VideoCodec local_codec(98, "VP8");
2079 local_codec.packetization = cricket::kPacketizationParamRaw;
2080 cricket::VideoCodec remote_codec(99, "VP8");
2081 remote_codec.packetization = "unknownpacketizationattributevalue";
2082 cricket::VideoContentDescription local_video;
2083 local_video.set_codecs({local_codec});
2084 cricket::VideoContentDescription remote_video;
2085 remote_video.set_codecs({remote_codec});
2086
2087 CreateChannels(0, 0);
2088
2089 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2090 EXPECT_FALSE(
2091 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2092 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2093 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2094 cricket::kPacketizationParamRaw);
2095 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2096}
2097
2098TEST_F(VideoChannelSingleThreadTest,
2099 TestSetLocalAnswerWithInvalidPacketization) {
2100 cricket::VideoCodec local_codec(98, "VP8");
2101 local_codec.packetization = cricket::kPacketizationParamRaw;
2102 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2103 cricket::VideoContentDescription local_video;
2104 local_video.set_codecs({local_codec});
2105 cricket::VideoContentDescription remote_video;
2106 remote_video.set_codecs({kRemoteCodec});
2107
2108 CreateChannels(0, 0);
2109
2110 EXPECT_TRUE(
2111 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2112 EXPECT_FALSE(
2113 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2114 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2115 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2116 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2117}
2118
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002119// VideoChannelDoubleThreadTest
2120TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2121 Base::TestInit();
2122}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002124TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2125 Base::TestDeinit();
2126}
2127
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002128TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2129 Base::TestSetContents();
2130}
2131
Johannes Kron9190b822018-10-29 11:22:05 +01002132TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2133 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2134}
2135
2136TEST_F(VideoChannelDoubleThreadTest,
2137 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2138 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2139}
2140
2141TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2142 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2143}
2144
2145TEST_F(VideoChannelDoubleThreadTest,
2146 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2147 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2148}
2149
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002150TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2151 Base::TestSetContentsNullOffer();
2152}
2153
2154TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2155 Base::TestSetContentsRtcpMux();
2156}
2157
2158TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2159 Base::TestSetContentsRtcpMux();
2160}
2161
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002162TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2163 Base::TestChangeStreamParamsInContent();
2164}
2165
2166TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2167 Base::TestPlayoutAndSendingStates();
2168}
2169
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002170TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2171 Base::TestMediaContentDirection();
2172}
2173
2174TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2175 Base::TestNetworkRouteChanges();
2176}
2177
2178TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2179 Base::TestCallSetup();
2180}
2181
2182TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2183 Base::TestCallTeardownRtcpMux();
2184}
2185
2186TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2187 Base::SendRtpToRtp();
2188}
2189
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002190TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002191 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002192}
2193
2194TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002195 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002196}
2197
2198TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2199 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2200}
2201
2202TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2203 Base::SendRtpToRtpOnThread();
2204}
2205
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002206TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2207 Base::SendWithWritabilityLoss();
2208}
2209
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002210TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2211 Base::TestSetContentFailure();
2212}
2213
2214TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2215 Base::TestSendTwoOffers();
2216}
2217
2218TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2219 Base::TestReceiveTwoOffers();
2220}
2221
2222TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2223 Base::TestSendPrAnswer();
2224}
2225
2226TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2227 Base::TestReceivePrAnswer();
2228}
2229
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002230TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2231 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2232}
2233
2234TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2235 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2236}
2237
2238TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2239 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2240}
2241
2242TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2243 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2244}
2245
zstein56162b92017-04-24 16:54:35 -07002246TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2247 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002248}
2249
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002250TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2251 Base::DefaultMaxBitrateIsUnlimited();
2252}
2253
Steve Anton8a63f782017-10-23 13:08:53 -07002254TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2255 Base::SocketOptionsMergedOnSetTransport();
2256}
2257
deadbeef953c2ce2017-01-09 14:53:41 -08002258// RtpDataChannelSingleThreadTest
2259class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002261 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002262 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002263 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2264};
2265
deadbeef953c2ce2017-01-09 14:53:41 -08002266// RtpDataChannelDoubleThreadTest
2267class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002268 public:
2269 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002270 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002271 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002272};
2273
2274// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002275template <>
Steve Anton8699a322017-11-06 15:53:33 -08002276std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002277 rtc::Thread* worker_thread,
2278 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002279 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002280 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002281 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002282 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002283 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002284 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002285 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2286 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02002287 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002288 return channel;
2289}
2290
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002291template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002292void ChannelTest<DataTraits>::CreateContent(
2293 int flags,
2294 const cricket::AudioCodec& audio_codec,
2295 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002296 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297 data->AddCodec(kGoogleDataCodec);
2298 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299}
2300
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002301template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002303 const cricket::RtpDataContentDescription& source,
2304 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 *data = source;
2306}
2307
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002308template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2310 const cricket::DataCodec& c2) {
2311 return c1.name == c2.name;
2312}
2313
Peter Boström0c4e06b2015-10-07 12:23:21 +02002314template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002316 uint32_t ssrc,
2317 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002318 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319 data->AddLegacyStream(ssrc);
2320}
2321
deadbeef953c2ce2017-01-09 14:53:41 -08002322TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 Base::TestInit();
2324 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2325}
2326
deadbeef953c2ce2017-01-09 14:53:41 -08002327TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002328 Base::TestDeinit();
2329}
2330
deadbeef953c2ce2017-01-09 14:53:41 -08002331TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332 Base::TestSetContents();
2333}
2334
deadbeef953c2ce2017-01-09 14:53:41 -08002335TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 Base::TestSetContentsNullOffer();
2337}
2338
deadbeef953c2ce2017-01-09 14:53:41 -08002339TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 Base::TestSetContentsRtcpMux();
2341}
2342
deadbeef953c2ce2017-01-09 14:53:41 -08002343TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 Base::TestChangeStreamParamsInContent();
2345}
2346
deadbeef953c2ce2017-01-09 14:53:41 -08002347TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348 Base::TestPlayoutAndSendingStates();
2349}
2350
deadbeef953c2ce2017-01-09 14:53:41 -08002351TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 Base::TestMediaContentDirection();
2353}
2354
deadbeef953c2ce2017-01-09 14:53:41 -08002355TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 Base::TestCallSetup();
2357}
2358
deadbeef953c2ce2017-01-09 14:53:41 -08002359TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360 Base::TestCallTeardownRtcpMux();
2361}
2362
zstein56162b92017-04-24 16:54:35 -07002363TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2364 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365}
2366
deadbeef953c2ce2017-01-09 14:53:41 -08002367TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 Base::SendRtpToRtp();
2369}
2370
deadbeef953c2ce2017-01-09 14:53:41 -08002371TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 Base::SendRtpToRtpOnThread();
2373}
2374
deadbeef953c2ce2017-01-09 14:53:41 -08002375TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 Base::SendWithWritabilityLoss();
2377}
2378
Steve Anton8a63f782017-10-23 13:08:53 -07002379TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2380 Base::SocketOptionsMergedOnSetTransport();
2381}
2382
deadbeef953c2ce2017-01-09 14:53:41 -08002383TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002384 CreateChannels(0, 0);
2385 EXPECT_TRUE(SendInitiate());
2386 EXPECT_TRUE(SendAccept());
2387
2388 cricket::SendDataParams params;
2389 params.ssrc = 42;
2390 unsigned char data[] = {'f', 'o', 'o'};
2391 rtc::CopyOnWriteBuffer payload(data, 3);
2392 cricket::SendDataResult result;
2393 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2394 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2395 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2396}
2397
deadbeef953c2ce2017-01-09 14:53:41 -08002398TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002399 Base::TestInit();
2400 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2401}
2402
deadbeef953c2ce2017-01-09 14:53:41 -08002403TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002404 Base::TestDeinit();
2405}
2406
deadbeef953c2ce2017-01-09 14:53:41 -08002407TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002408 Base::TestSetContents();
2409}
2410
deadbeef953c2ce2017-01-09 14:53:41 -08002411TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002412 Base::TestSetContentsNullOffer();
2413}
2414
deadbeef953c2ce2017-01-09 14:53:41 -08002415TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002416 Base::TestSetContentsRtcpMux();
2417}
2418
deadbeef953c2ce2017-01-09 14:53:41 -08002419TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002420 Base::TestChangeStreamParamsInContent();
2421}
2422
deadbeef953c2ce2017-01-09 14:53:41 -08002423TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002424 Base::TestPlayoutAndSendingStates();
2425}
2426
deadbeef953c2ce2017-01-09 14:53:41 -08002427TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002428 Base::TestMediaContentDirection();
2429}
2430
deadbeef953c2ce2017-01-09 14:53:41 -08002431TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002432 Base::TestCallSetup();
2433}
2434
deadbeef953c2ce2017-01-09 14:53:41 -08002435TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002436 Base::TestCallTeardownRtcpMux();
2437}
2438
zstein56162b92017-04-24 16:54:35 -07002439TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2440 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002441}
2442
deadbeef953c2ce2017-01-09 14:53:41 -08002443TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002444 Base::SendRtpToRtp();
2445}
2446
deadbeef953c2ce2017-01-09 14:53:41 -08002447TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002448 Base::SendRtpToRtpOnThread();
2449}
2450
deadbeef953c2ce2017-01-09 14:53:41 -08002451TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002452 Base::SendWithWritabilityLoss();
2453}
2454
Steve Anton8a63f782017-10-23 13:08:53 -07002455TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2456 Base::SocketOptionsMergedOnSetTransport();
2457}
2458
deadbeef953c2ce2017-01-09 14:53:41 -08002459TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460 CreateChannels(0, 0);
2461 EXPECT_TRUE(SendInitiate());
2462 EXPECT_TRUE(SendAccept());
2463
2464 cricket::SendDataParams params;
2465 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002466 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002467 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 cricket::SendDataResult result;
2469 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002470 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002471 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2472}
2473
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474// TODO(pthatcher): TestSetReceiver?