blob: f2e93d69ea8132cd319bf470b9a09865b6caf5a4 [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(
173 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
174 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(
177 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
178 rtcp1 = fake_rtcp_dtls_transport1_.get();
179 }
180 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100181 auto cert1 = rtc::RTCCertificate::Create(
182 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800183 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
184 if (fake_rtcp_dtls_transport1_) {
185 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
186 }
187 }
188 }
189 // Based on flags, create fake DTLS or raw packet transports.
190 if (flags2 & RAW_PACKET_TRANSPORT) {
191 fake_rtp_packet_transport2_.reset(
192 new rtc::FakePacketTransport("channel2_rtp"));
193 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700194 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800195 fake_rtcp_packet_transport2_.reset(
196 new rtc::FakePacketTransport("channel2_rtcp"));
197 rtcp2 = fake_rtcp_packet_transport2_.get();
198 }
199 } else {
200 // Confirmed to work with KT_RSA and KT_ECDSA.
201 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
202 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
203 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700204 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800205 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
206 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
207 rtcp2 = fake_rtcp_dtls_transport2_.get();
208 }
209 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100210 auto cert2 = rtc::RTCCertificate::Create(
211 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800212 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
213 if (fake_rtcp_dtls_transport2_) {
214 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
215 }
216 }
217 }
Zhi Huange830e682018-03-30 10:48:35 -0700218 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
219 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
220 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
221 flags1);
222 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
223 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
224 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
225 flags2);
226
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800227 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
228 rtp_transport1_.get(), flags1);
229 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
230 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200231 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
232 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 CopyContent(local_media_content1_, &remote_media_content1_);
234 CopyContent(local_media_content2_, &remote_media_content2_);
235
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 // Add stream information (SSRC) to the local content but not to the remote
237 // content. This means that we per default know the SSRC of what we send but
238 // not what we receive.
239 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
240 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
241
242 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
243 if (flags1 & SSRC_MUX) {
244 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
245 }
246 if (flags2 & SSRC_MUX) {
247 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
248 }
249 }
Steve Anton8699a322017-11-06 15:53:33 -0800250 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200251 rtc::Thread* worker_thread,
252 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800253 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700254 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200255 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256
Zhi Huange830e682018-03-30 10:48:35 -0700257 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
258 rtc::PacketTransportInternal* rtp_packet_transport,
259 rtc::PacketTransportInternal* rtcp_packet_transport,
260 DtlsTransportInternal* rtp_dtls_transport,
261 DtlsTransportInternal* rtcp_dtls_transport,
262 int flags) {
263 if (flags & RTCP_MUX) {
264 rtcp_packet_transport = nullptr;
265 rtcp_dtls_transport = nullptr;
266 }
267
268 if (flags & DTLS) {
269 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
270 } else {
271 if (flags & RAW_PACKET_TRANSPORT) {
272 return CreateUnencryptedTransport(rtp_packet_transport,
273 rtcp_packet_transport);
274 } else {
275 return CreateUnencryptedTransport(rtp_dtls_transport,
276 rtcp_dtls_transport);
277 }
278 }
279 }
280
281 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
282 rtc::PacketTransportInternal* rtp_packet_transport,
283 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200284 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200285 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700286
287 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
288 if (rtcp_packet_transport) {
289 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
290 }
291 return rtp_transport;
292 }
293
294 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
295 cricket::DtlsTransportInternal* rtp_dtls_transport,
296 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200297 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700298 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700299
300 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
301 rtcp_dtls_transport);
302 return dtls_srtp_transport;
303 }
304
deadbeeff5346592017-01-24 21:51:21 -0800305 void ConnectFakeTransports() {
306 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
307 bool asymmetric = false;
308 // Depending on test flags, could be using DTLS or raw packet transport.
309 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
310 fake_rtp_dtls_transport1_->SetDestination(
311 fake_rtp_dtls_transport2_.get(), asymmetric);
312 }
313 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
314 fake_rtcp_dtls_transport1_->SetDestination(
315 fake_rtcp_dtls_transport2_.get(), asymmetric);
316 }
317 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
318 fake_rtp_packet_transport1_->SetDestination(
319 fake_rtp_packet_transport2_.get(), asymmetric);
320 }
321 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
322 fake_rtcp_packet_transport1_->SetDestination(
323 fake_rtcp_packet_transport2_.get(), asymmetric);
324 }
325 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800326 // The transport becoming writable will asynchronously update the send state
327 // on the worker thread; since this test uses the main thread as the worker
328 // thread, we must process the message queue for this to occur.
329 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800330 }
331
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000333 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800334 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (result) {
336 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000337 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800338 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800340 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000341 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800342 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 }
344 }
345 return result;
346 }
347
348 bool SendAccept() {
349 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000350 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800351 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352 }
353
354 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000355 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800356 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 if (result) {
358 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000359 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800360 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 }
362 return result;
363 }
364
365 bool SendProvisionalAnswer() {
366 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800367 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (result) {
369 channel2_->Enable(true);
370 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800371 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800372 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 }
374 return result;
375 }
376
377 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000378 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800379 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000380 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000381 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800382 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 return result;
384 }
385
deadbeeff5346592017-01-24 21:51:21 -0800386 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 channel1_.reset();
388 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800389 fake_rtp_dtls_transport1_.reset();
390 fake_rtcp_dtls_transport1_.reset();
391 fake_rtp_dtls_transport2_.reset();
392 fake_rtcp_dtls_transport2_.reset();
393 fake_rtp_packet_transport1_.reset();
394 fake_rtcp_packet_transport1_.reset();
395 fake_rtp_packet_transport2_.reset();
396 fake_rtcp_packet_transport2_.reset();
397 if (network_thread_keeper_) {
398 network_thread_keeper_.reset();
399 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 return true;
401 }
402
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200403 void SendRtp1() {
404 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
405 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200407 void SendRtp2() {
408 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
409 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200412 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
413 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
414 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200416 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
417 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
418 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200420
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 }
424 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200425 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200428 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200429 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
430 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200432 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200433 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
434 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200436 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
437 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::SetBE32(data.data() + 8, ssrc);
440 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000441 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200442 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000443 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 return data;
445 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446
Yves Gerey665174f2018-06-19 15:03:05 +0200447 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
448 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449
450 void CreateContent(int flags,
451 const cricket::AudioCodec& audio_codec,
452 const cricket::VideoCodec& video_codec,
453 typename T::Content* content) {
454 // overridden in specialized classes
455 }
456 void CopyContent(const typename T::Content& source,
457 typename T::Content* content) {
458 // overridden in specialized classes
459 }
460
Steve Anton18ee1d52017-09-11 11:32:35 -0700461 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700463 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
464 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700465 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700466 AddLegacyStreamInContent(ssrc, 0, content);
467 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 }
469
ossu292d6582016-03-17 02:31:13 -0700470 // Will manage the lifetime of a CallThread, making sure it's
471 // destroyed before this object goes out of scope.
472 class ScopedCallThread {
473 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200474 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100475 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100476 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700477 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100478 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700479 }
480
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200481 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700482
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200483 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700484
485 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200486 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700487 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
490 return false; // overridden in specialized classes
491 }
492
Honghai Zhangcc411c02016-03-29 17:27:21 -0700493 cricket::CandidatePairInterface* last_selected_candidate_pair() {
494 return last_selected_candidate_pair_;
495 }
496
Peter Boström0c4e06b2015-10-07 12:23:21 +0200497 void AddLegacyStreamInContent(uint32_t ssrc,
498 int flags,
499 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 // Base implementation.
501 }
502
503 // Tests that can be used by derived classes.
504
505 // Basic sanity check.
506 void TestInit() {
507 CreateChannels(0, 0);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000508 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200510 if (verify_playout_) {
511 EXPECT_FALSE(media_channel1_->playout());
512 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 EXPECT_TRUE(media_channel1_->codecs().empty());
514 EXPECT_TRUE(media_channel1_->recv_streams().empty());
515 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 }
517
518 // Test that SetLocalContent and SetRemoteContent properly configure
519 // the codecs.
520 void TestSetContents() {
521 CreateChannels(0, 0);
522 typename T::Content content;
523 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800524 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800526 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200528 EXPECT_TRUE(
529 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 }
531
Johannes Kron9190b822018-10-29 11:22:05 +0100532 // Test that SetLocalContent and SetRemoteContent properly configure
533 // extmap-allow-mixed.
534 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
535 // For a caller, SetLocalContent() is called first with an offer and next
536 // SetRemoteContent() is called with the answer.
537 CreateChannels(0, 0);
538 typename T::Content content;
539 CreateContent(0, kPcmuCodec, kH264Codec, &content);
540 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
541 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
542 content.set_extmap_allow_mixed_enum(offer_enum);
543 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
544 content.set_extmap_allow_mixed_enum(answer_enum);
545 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
546 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
547 }
548 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
549 // For a callee, SetRemoteContent() is called first with an offer and next
550 // SetLocalContent() is called with the answer.
551 CreateChannels(0, 0);
552 typename T::Content content;
553 CreateContent(0, kPcmuCodec, kH264Codec, &content);
554 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
555 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
556 content.set_extmap_allow_mixed_enum(offer_enum);
557 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
558 content.set_extmap_allow_mixed_enum(answer_enum);
559 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
560 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
561 }
562
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 // Test that SetLocalContent and SetRemoteContent properly deals
564 // with an empty offer.
565 void TestSetContentsNullOffer() {
566 CreateChannels(0, 0);
567 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800568 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569 CreateContent(0, kPcmuCodec, kH264Codec, &content);
570 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800571 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200573 EXPECT_TRUE(
574 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575 }
576
577 // Test that SetLocalContent and SetRemoteContent properly set RTCP
578 // mux.
579 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800580 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 typename T::Content content;
582 CreateContent(0, kPcmuCodec, kH264Codec, &content);
583 // Both sides agree on mux. Should no longer be a separate RTCP channel.
584 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800585 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
586 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800588 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800590 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 }
592
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 // Test that SetLocalContent and SetRemoteContent properly
594 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800595 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 void TestChangeStreamParamsInContent() {
597 cricket::StreamParams stream1;
598 stream1.groupid = "group1";
599 stream1.id = "stream1";
600 stream1.ssrcs.push_back(kSsrc1);
601 stream1.cname = "stream1_cname";
602
603 cricket::StreamParams stream2;
604 stream2.groupid = "group1";
605 stream2.id = "stream2";
606 stream2.ssrcs.push_back(kSsrc2);
607 stream2.cname = "stream2_cname";
608
609 // Setup a call where channel 1 send |stream1| to channel 2.
610 CreateChannels(0, 0);
611 typename T::Content content1;
612 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
613 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800614 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 EXPECT_TRUE(channel1_->Enable(true));
616 EXPECT_EQ(1u, media_channel1_->send_streams().size());
617
Steve Anton3828c062017-12-06 10:34:51 -0800618 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800620 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621
622 // Channel 2 do not send anything.
623 typename T::Content content2;
624 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800625 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800627 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 EXPECT_TRUE(channel2_->Enable(true));
629 EXPECT_EQ(0u, media_channel2_->send_streams().size());
630
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200631 SendCustomRtp1(kSsrc1, 0);
632 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
634
635 // Let channel 2 update the content by sending |stream2| and enable SRTP.
636 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700637 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800639 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 ASSERT_EQ(1u, media_channel2_->send_streams().size());
641 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
642
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
645 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
646
647 // Channel 1 replies but stop sending stream1.
648 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700649 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800650 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_EQ(0u, media_channel1_->send_streams().size());
652
Steve Anton3828c062017-12-06 10:34:51 -0800653 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
655
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200656 SendCustomRtp2(kSsrc2, 0);
657 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
659 }
660
661 // Test that we only start playout and sending at the right times.
662 void TestPlayoutAndSendingStates() {
663 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200664 if (verify_playout_) {
665 EXPECT_FALSE(media_channel1_->playout());
666 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200668 if (verify_playout_) {
669 EXPECT_FALSE(media_channel2_->playout());
670 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_FALSE(media_channel2_->sending());
672 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200673 if (verify_playout_) {
674 EXPECT_FALSE(media_channel1_->playout());
675 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800678 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200679 if (verify_playout_) {
680 EXPECT_TRUE(media_channel1_->playout());
681 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000683 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800684 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200685 if (verify_playout_) {
686 EXPECT_FALSE(media_channel2_->playout());
687 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000689 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800690 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200691 if (verify_playout_) {
692 EXPECT_FALSE(media_channel2_->playout());
693 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800695 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200696 if (verify_playout_) {
697 EXPECT_TRUE(media_channel1_->playout());
698 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200700 if (verify_playout_) {
701 EXPECT_FALSE(media_channel2_->playout());
702 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 EXPECT_FALSE(media_channel2_->sending());
704 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200705 if (verify_playout_) {
706 EXPECT_TRUE(media_channel2_->playout());
707 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000709 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800710 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200711 if (verify_playout_) {
712 EXPECT_TRUE(media_channel1_->playout());
713 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 EXPECT_TRUE(media_channel1_->sending());
715 }
716
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 // Test that changing the MediaContentDirection in the local and remote
718 // session description start playout and sending at the right time.
719 void TestMediaContentDirection() {
720 CreateChannels(0, 0);
721 typename T::Content content1;
722 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
723 typename T::Content content2;
724 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
725 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800726 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727
728 EXPECT_TRUE(channel1_->Enable(true));
729 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200730 if (verify_playout_) {
731 EXPECT_FALSE(media_channel1_->playout());
732 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200734 if (verify_playout_) {
735 EXPECT_FALSE(media_channel2_->playout());
736 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 EXPECT_FALSE(media_channel2_->sending());
738
Steve Anton3828c062017-12-06 10:34:51 -0800739 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
740 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
741 EXPECT_TRUE(
742 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
743 EXPECT_TRUE(
744 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800745 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746
Peter Boström34fbfff2015-09-24 19:20:30 +0200747 if (verify_playout_) {
748 EXPECT_TRUE(media_channel1_->playout());
749 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200751 if (verify_playout_) {
752 EXPECT_FALSE(media_channel2_->playout()); // local InActive
753 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 EXPECT_FALSE(media_channel2_->sending()); // local InActive
755
756 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800757 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800758 EXPECT_TRUE(
759 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
760 EXPECT_TRUE(
761 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
764 EXPECT_TRUE(media_channel1_->playout());
765 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200767 if (verify_playout_) {
768 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
771
772 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800773 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800774 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
775 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776
Peter Boström34fbfff2015-09-24 19:20:30 +0200777 if (verify_playout_) {
778 EXPECT_TRUE(media_channel1_->playout());
779 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200781 if (verify_playout_) {
782 EXPECT_TRUE(media_channel2_->playout());
783 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_TRUE(media_channel2_->sending());
785 }
786
Honghai Zhangcc411c02016-03-29 17:27:21 -0700787 // Tests that when the transport channel signals a candidate pair change
788 // event, the media channel will receive a call on the network route change.
789 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700790 static constexpr uint16_t kLocalNetId = 1;
791 static constexpr uint16_t kRemoteNetId = 2;
792 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800793 // Ipv4(20) + UDP(8).
794 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800795 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200796
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800797 CreateChannels(DTLS, DTLS);
798 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700799
Honghai Zhangcc411c02016-03-29 17:27:21 -0700800 typename T::MediaChannel* media_channel1 =
801 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200802 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700803
Zhi Huang942bc2e2017-11-13 13:26:07 -0800804 // Need to wait for the threads before calling
805 // |set_num_network_route_changes| because the network route would be set
806 // when creating the channel.
807 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200808 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800809 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800810 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200811 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800812 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200813 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200814 });
815 WaitForThreads();
816 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700817 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200818 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700819
eladalon05b07bb2017-08-24 07:40:16 -0700820 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800821 rtc::NetworkRoute network_route;
822 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100823 network_route.local =
824 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
825 network_route.remote =
826 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800827 network_route.last_sent_packet_id = kLastPacketId;
828 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200829 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800830 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
831
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200832 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200833 });
834 WaitForThreads();
835 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100836 EXPECT_TRUE(media_channel1->last_network_route().connected);
837 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100838 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100839 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100840 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200841 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700842 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800843 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800844 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700845 }
846
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 // Test setting up a call.
848 void TestCallSetup() {
849 CreateChannels(0, 0);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000850 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000851 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200852 if (verify_playout_) {
853 EXPECT_TRUE(media_channel1_->playout());
854 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855 EXPECT_FALSE(media_channel1_->sending());
856 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000857 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858 EXPECT_TRUE(media_channel1_->sending());
859 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200860 if (verify_playout_) {
861 EXPECT_TRUE(media_channel2_->playout());
862 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_TRUE(media_channel2_->sending());
864 EXPECT_EQ(1U, media_channel2_->codecs().size());
865 }
866
867 // Test that we don't crash if packets are sent during call teardown
868 // when RTCP mux is enabled. This is a regression test against a specific
869 // race condition that would only occur when a RTCP packet was sent during
870 // teardown of a channel on which RTCP mux was enabled.
871 void TestCallTeardownRtcpMux() {
872 class LastWordMediaChannel : public T::MediaChannel {
873 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200874 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000875 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700876 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
877 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
879 }
880 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200881 CreateChannels(std::make_unique<LastWordMediaChannel>(),
882 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200883 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 EXPECT_TRUE(SendInitiate());
885 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800886 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 }
888
889 // Send voice RTP data to the other side and ensure it gets there.
890 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700891 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 EXPECT_TRUE(SendInitiate());
893 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000894 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
895 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200896 SendRtp1();
897 SendRtp2();
898 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 EXPECT_TRUE(CheckRtp1());
900 EXPECT_TRUE(CheckRtp2());
901 EXPECT_TRUE(CheckNoRtp1());
902 EXPECT_TRUE(CheckNoRtp2());
903 }
904
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200905 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800906 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200907 EXPECT_TRUE(SendInitiate());
908 EXPECT_TRUE(SendAccept());
909 SendRtp1();
910 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200911 // Do not wait, destroy channels.
912 channel1_.reset(nullptr);
913 channel2_.reset(nullptr);
914 }
915
Zhi Huange830e682018-03-30 10:48:35 -0700916 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
917 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Harald Alvestrand476859d2020-12-07 11:16:45 +0000918 EXPECT_FALSE(channel1_->SrtpActiveForTesting());
919 EXPECT_FALSE(channel2_->SrtpActiveForTesting());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200921 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000923 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
924 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200925 SendRtp1();
926 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200927 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 EXPECT_TRUE(CheckRtp1());
929 EXPECT_TRUE(CheckRtp2());
930 EXPECT_TRUE(CheckNoRtp1());
931 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 }
933
934 // Test that we can send and receive early media when a provisional answer is
935 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
936 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200937 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938
Yves Gerey665174f2018-06-19 15:03:05 +0200939 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
940 EXPECT_TRUE(SendOffer());
941 EXPECT_TRUE(SendProvisionalAnswer());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000942 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
943 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
944 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
945 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Yves Gerey665174f2018-06-19 15:03:05 +0200946 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200947 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
948 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200949 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950
Yves Gerey665174f2018-06-19 15:03:05 +0200951 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200952 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
953 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200954 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955
Yves Gerey665174f2018-06-19 15:03:05 +0200956 // Complete call setup and ensure everything is still OK.
957 EXPECT_TRUE(SendFinalAnswer());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000958 EXPECT_TRUE(channel1_->SrtpActiveForTesting());
959 EXPECT_TRUE(channel2_->SrtpActiveForTesting());
Yves Gerey665174f2018-06-19 15:03:05 +0200960 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200961 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
962 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200963 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200964 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000965 }
966
967 // Test that we properly send RTP without SRTP from a thread.
968 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800969 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970 EXPECT_TRUE(SendInitiate());
971 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200972 ScopedCallThread send_rtp1([this] { SendRtp1(); });
973 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -0700974 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200975 WaitForThreads(involved_threads);
976 EXPECT_TRUE(CheckRtp1());
977 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 EXPECT_TRUE(CheckNoRtp1());
979 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 }
981
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982 // Test that the mediachannel retains its sending state after the transport
983 // becomes non-writable.
984 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -0700985 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 EXPECT_TRUE(SendInitiate());
987 EXPECT_TRUE(SendAccept());
Harald Alvestrand476859d2020-12-07 11:16:45 +0000988 EXPECT_TRUE(channel1_->RtpTransportForTesting()->rtcp_mux_enabled());
989 EXPECT_TRUE(channel2_->RtpTransportForTesting()->rtcp_mux_enabled());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200990 SendRtp1();
991 SendRtp2();
992 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000993 EXPECT_TRUE(CheckRtp1());
994 EXPECT_TRUE(CheckRtp2());
995 EXPECT_TRUE(CheckNoRtp1());
996 EXPECT_TRUE(CheckNoRtp2());
997
wu@webrtc.org97077a32013-10-25 21:18:33 +0000998 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -0800999 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1000 fake_rtp_dtls_transport1_->SetWritable(false);
1001 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001002 SendRtp1();
1003 SendRtp2();
1004 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001005 EXPECT_TRUE(CheckRtp1());
1006 EXPECT_TRUE(CheckNoRtp2());
1007
1008 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001009 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1010 fake_rtp_dtls_transport1_->SetWritable(true);
1011 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001012 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001013 SendRtp1();
1014 SendRtp2();
1015 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 EXPECT_TRUE(CheckRtp1());
1017 EXPECT_TRUE(CheckRtp2());
1018 EXPECT_TRUE(CheckNoRtp1());
1019 EXPECT_TRUE(CheckNoRtp2());
1020
1021 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001022 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1023 bool asymmetric = true;
1024 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1025 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(media_channel1_->sending());
1027
wu@webrtc.org97077a32013-10-25 21:18:33 +00001028 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001029 SendRtp1();
1030 SendRtp2();
1031 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 EXPECT_TRUE(CheckRtp1());
1033 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001034 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035
1036 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001037 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001038 bool asymmetric = true;
1039 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1040 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001041 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001043 SendRtp1();
1044 SendRtp2();
1045 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 EXPECT_TRUE(CheckRtp1());
1047 EXPECT_TRUE(CheckRtp2());
1048 EXPECT_TRUE(CheckNoRtp1());
1049 EXPECT_TRUE(CheckNoRtp2());
1050 }
1051
Yves Gerey665174f2018-06-19 15:03:05 +02001052 void SendBundleToBundle(const int* pl_types,
1053 int len,
1054 bool rtcp_mux,
1055 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001056 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001058 // Only pl_type1 was added to the bundle filter for both |channel1_|
1059 // and |channel2_|.
1060 int pl_type1 = pl_types[0];
1061 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001062 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001063 if (secure)
1064 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001065 if (rtcp_mux) {
1066 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001067 }
1068 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001070 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001071
1072 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001073 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1074 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1075 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001076 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001077 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1078 EXPECT_TRUE(CheckNoRtp1());
1079 EXPECT_TRUE(CheckNoRtp2());
1080
Zhi Huang365381f2018-04-13 16:44:34 -07001081 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1082 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001083 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001084 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1085 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 }
1087
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 void TestSetContentFailure() {
1089 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090
Peter Thatchera6d24442015-07-09 21:26:36 -07001091 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001092 std::unique_ptr<typename T::Content> content(
1093 CreateMediaContentWithStream(1));
1094
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001096 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001097 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001098 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001099 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001102 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001103 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001104
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001106 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001107 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 }
1109
1110 void TestSendTwoOffers() {
1111 CreateChannels(0, 0);
1112
Peter Thatchera6d24442015-07-09 21:26:36 -07001113 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001114 std::unique_ptr<typename T::Content> content1(
1115 CreateMediaContentWithStream(1));
1116 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001117 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1119
Steve Anton18ee1d52017-09-11 11:32:35 -07001120 std::unique_ptr<typename T::Content> content2(
1121 CreateMediaContentWithStream(2));
1122 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001123 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1125 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1126 }
1127
1128 void TestReceiveTwoOffers() {
1129 CreateChannels(0, 0);
1130
Peter Thatchera6d24442015-07-09 21:26:36 -07001131 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001132 std::unique_ptr<typename T::Content> content1(
1133 CreateMediaContentWithStream(1));
1134 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001135 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1137
Steve Anton18ee1d52017-09-11 11:32:35 -07001138 std::unique_ptr<typename T::Content> content2(
1139 CreateMediaContentWithStream(2));
1140 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001141 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1143 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1144 }
1145
1146 void TestSendPrAnswer() {
1147 CreateChannels(0, 0);
1148
Peter Thatchera6d24442015-07-09 21:26:36 -07001149 std::string err;
1150 // Receive offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001151 std::unique_ptr<typename T::Content> content1(
1152 CreateMediaContentWithStream(1));
1153 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001154 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1156
Peter Thatchera6d24442015-07-09 21:26:36 -07001157 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001158 std::unique_ptr<typename T::Content> content2(
1159 CreateMediaContentWithStream(2));
1160 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001161 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1163 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1164
Peter Thatchera6d24442015-07-09 21:26:36 -07001165 // Send answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001166 std::unique_ptr<typename T::Content> content3(
1167 CreateMediaContentWithStream(3));
1168 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001169 channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1171 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1172 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1173 }
1174
1175 void TestReceivePrAnswer() {
1176 CreateChannels(0, 0);
1177
Peter Thatchera6d24442015-07-09 21:26:36 -07001178 std::string err;
1179 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001180 std::unique_ptr<typename T::Content> content1(
1181 CreateMediaContentWithStream(1));
1182 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001183 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1185
Peter Thatchera6d24442015-07-09 21:26:36 -07001186 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001187 std::unique_ptr<typename T::Content> content2(
1188 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001189 EXPECT_TRUE(
1190 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1192 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1193
Peter Thatchera6d24442015-07-09 21:26:36 -07001194 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001195 std::unique_ptr<typename T::Content> content3(
1196 CreateMediaContentWithStream(3));
1197 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001198 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1200 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1201 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1202 }
1203
zstein56162b92017-04-24 16:54:35 -07001204 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001205 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001207
zstein56162b92017-04-24 16:54:35 -07001208 channel1_->OnTransportReadyToSend(true);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001209 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210 EXPECT_TRUE(media_channel1_->ready_to_send());
1211
zstein56162b92017-04-24 16:54:35 -07001212 channel1_->OnTransportReadyToSend(false);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001213 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001214 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215 }
1216
skvladdc1c62c2016-03-16 19:07:43 -07001217 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1218 typename T::Content content;
1219 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1220 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001221 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001222 }
1223
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001224 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001225 webrtc::RtpParameters parameters;
1226 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001227 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001228 parameters.encodings.push_back(encoding);
1229 return parameters;
1230 }
1231
1232 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001233 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001234 EXPECT_EQ(1UL, parameters.encodings.size());
1235 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1236 }
1237
1238 void DefaultMaxBitrateIsUnlimited() {
1239 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001240 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1241 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001242 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001243 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001244 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001245 }
1246
Zhi Huange830e682018-03-30 10:48:35 -07001247 // Test that when a channel gets new RtpTransport with a call to
1248 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1249 // with the options on the new one.
1250
Steve Anton8a63f782017-10-23 13:08:53 -07001251 // For example, audio and video may use separate socket options, but initially
1252 // be unbundled, then later become bundled. When this happens, their preferred
1253 // socket options should be merged to the underlying transport they share.
1254 void SocketOptionsMergedOnSetTransport() {
1255 constexpr int kSndBufSize = 4000;
1256 constexpr int kRcvBufSize = 8000;
1257
Zhi Huange830e682018-03-30 10:48:35 -07001258 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001259
1260 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1261 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1262 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1263 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1264
Zhi Huange830e682018-03-30 10:48:35 -07001265 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001266 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Zhi Huange830e682018-03-30 10:48:35 -07001267 channel1_->SetRtpTransport(new_rtp_transport_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001268
1269 int option_val;
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001270 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1271 rtc::Socket::Option::OPT_SNDBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001272 EXPECT_EQ(kSndBufSize, option_val);
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001273 ASSERT_TRUE(fake_rtp_dtls_transport2_->GetOption(
1274 rtc::Socket::Option::OPT_RCVBUF, &option_val));
Steve Anton8a63f782017-10-23 13:08:53 -07001275 EXPECT_EQ(kRcvBufSize, option_val);
1276 }
1277
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001278 void CreateSimulcastContent(const std::vector<std::string>& rids,
1279 typename T::Content* content) {
1280 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001281 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001282 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1283 }
1284
1285 StreamParams stream;
1286 stream.set_rids(rid_descriptions);
1287 CreateContent(0, kPcmuCodec, kH264Codec, content);
1288 // This is for unified plan, so there can be only one StreamParams.
1289 content->mutable_streams().clear();
1290 content->AddStream(stream);
1291 }
1292
1293 void VerifySimulcastStreamParams(const StreamParams& expected,
1294 const typename T::Channel* channel) {
1295 const std::vector<StreamParams>& streams = channel->local_streams();
1296 ASSERT_EQ(1u, streams.size());
1297 const StreamParams& result = streams[0];
1298 EXPECT_EQ(expected.rids(), result.rids());
1299 EXPECT_TRUE(result.has_ssrcs());
1300 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1301 std::vector<uint32_t> primary_ssrcs;
1302 result.GetPrimarySsrcs(&primary_ssrcs);
1303 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1304 }
1305
1306 void TestUpdateLocalStreamsWithSimulcast() {
1307 CreateChannels(0, 0);
1308 typename T::Content content1, content2, content3;
1309 CreateSimulcastContent({"f", "h", "q"}, &content1);
1310 EXPECT_TRUE(
1311 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1312 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1313 StreamParams stream1 = channel1_->local_streams()[0];
1314
1315 // Create a similar offer. SetLocalContent should not remove and add.
1316 CreateSimulcastContent({"f", "h", "q"}, &content2);
1317 EXPECT_TRUE(
1318 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1319 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1320 StreamParams stream2 = channel1_->local_streams()[0];
1321 // Check that the streams are identical (SSRCs didn't change).
1322 EXPECT_EQ(stream1, stream2);
1323
1324 // Create third offer that has same RIDs in different order.
1325 CreateSimulcastContent({"f", "q", "h"}, &content3);
1326 EXPECT_TRUE(
1327 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1328 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1329 }
1330
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001332 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1333 static void ProcessThreadQueue(rtc::Thread* thread) {
1334 RTC_DCHECK(thread->IsCurrent());
1335 while (!thread->empty()) {
1336 thread->ProcessMessages(0);
1337 }
1338 }
1339 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1340 // |threads| and current thread post packets to network thread.
1341 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001342 thread->Invoke<void>(RTC_FROM_HERE,
1343 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001344 }
1345 ProcessThreadQueue(rtc::Thread::Current());
1346 // Network thread move them around and post back to worker = current thread.
1347 if (!network_thread_->IsCurrent()) {
1348 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001349 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001350 }
1351 // Worker thread = current Thread process received messages.
1352 ProcessThreadQueue(rtc::Thread::Current());
1353 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001354 // TODO(pbos): Remove playout from all media channels and let renderers mute
1355 // themselves.
1356 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001357 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1358 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001359 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1360 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1361 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1362 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1363 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1364 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1365 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1366 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001367 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1368 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1369 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 cricket::FakeMediaEngine media_engine_;
1371 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001372 typename T::MediaChannel* media_channel1_ = nullptr;
1373 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001374 std::unique_ptr<typename T::Channel> channel1_;
1375 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 typename T::Content local_media_content1_;
1377 typename T::Content local_media_content2_;
1378 typename T::Content remote_media_content1_;
1379 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001381 rtc::Buffer rtp_packet_;
1382 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001383 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001384 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001385};
1386
Yves Gerey665174f2018-06-19 15:03:05 +02001387template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001388std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1389 rtc::Thread* worker_thread,
1390 rtc::Thread* network_thread,
1391 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1392 webrtc::RtpTransportInternal* rtp_transport,
1393 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001394 rtc::Thread* signaling_thread = rtc::Thread::Current();
1395 auto channel = std::make_unique<cricket::VoiceChannel>(
1396 worker_thread, network_thread, signaling_thread, std::move(ch),
1397 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1398 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001399 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001400 return channel;
1401}
1402
1403template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404void ChannelTest<VoiceTraits>::CreateContent(
1405 int flags,
1406 const cricket::AudioCodec& audio_codec,
1407 const cricket::VideoCodec& video_codec,
1408 cricket::AudioContentDescription* audio) {
1409 audio->AddCodec(audio_codec);
1410 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001411}
1412
Yves Gerey665174f2018-06-19 15:03:05 +02001413template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414void ChannelTest<VoiceTraits>::CopyContent(
1415 const cricket::AudioContentDescription& source,
1416 cricket::AudioContentDescription* audio) {
1417 *audio = source;
1418}
1419
Yves Gerey665174f2018-06-19 15:03:05 +02001420template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1422 const cricket::AudioCodec& c2) {
1423 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001424 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001425}
1426
Peter Boström0c4e06b2015-10-07 12:23:21 +02001427template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001429 uint32_t ssrc,
1430 int flags,
1431 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 audio->AddLegacyStream(ssrc);
1433}
1434
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001435class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001436 public:
solenberg1dd98f32015-09-10 01:57:14 -07001437 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001438 VoiceChannelSingleThreadTest()
1439 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1440};
1441
1442class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1443 public:
1444 typedef ChannelTest<VoiceTraits> Base;
1445 VoiceChannelDoubleThreadTest()
1446 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447};
1448
jbauch5869f502017-06-29 12:31:36 -07001449class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001450 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001451 public:
1452 typedef ChannelTest<VoiceTraits> Base;
1453 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001454 : Base(true,
1455 kPcmuFrameWithExtensions,
1456 kRtcpReport,
1457 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001458};
1459
1460class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001461 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001462 public:
1463 typedef ChannelTest<VoiceTraits> Base;
1464 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001465 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1466 }
jbauch5869f502017-06-29 12:31:36 -07001467};
1468
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001470template <>
Steve Anton8699a322017-11-06 15:53:33 -08001471std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001472 rtc::Thread* worker_thread,
1473 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001474 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001475 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001476 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001477 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001478 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001479 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001480 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1481 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001482 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483 return channel;
1484}
1485
Yves Gerey665174f2018-06-19 15:03:05 +02001486template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487void ChannelTest<VideoTraits>::CreateContent(
1488 int flags,
1489 const cricket::AudioCodec& audio_codec,
1490 const cricket::VideoCodec& video_codec,
1491 cricket::VideoContentDescription* video) {
1492 video->AddCodec(video_codec);
1493 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001494}
1495
Yves Gerey665174f2018-06-19 15:03:05 +02001496template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497void ChannelTest<VideoTraits>::CopyContent(
1498 const cricket::VideoContentDescription& source,
1499 cricket::VideoContentDescription* video) {
1500 *video = source;
1501}
1502
Yves Gerey665174f2018-06-19 15:03:05 +02001503template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1505 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001506 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507}
1508
Peter Boström0c4e06b2015-10-07 12:23:21 +02001509template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001510void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001511 uint32_t ssrc,
1512 int flags,
1513 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 video->AddLegacyStream(ssrc);
1515}
1516
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001517class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 public:
solenberg1dd98f32015-09-10 01:57:14 -07001519 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001520 VideoChannelSingleThreadTest()
1521 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522};
1523
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001524class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1525 public:
1526 typedef ChannelTest<VideoTraits> Base;
1527 VideoChannelDoubleThreadTest()
1528 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1529};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001531TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532 Base::TestInit();
1533 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1534 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1535}
1536
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001537TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1538 Base::TestDeinit();
1539}
1540
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001541TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542 Base::TestSetContents();
1543}
1544
Johannes Kron9190b822018-10-29 11:22:05 +01001545TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1546 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1547}
1548
1549TEST_F(VoiceChannelSingleThreadTest,
1550 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1551 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1552}
1553
1554TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1555 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1556}
1557
1558TEST_F(VoiceChannelSingleThreadTest,
1559 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1560 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1561}
1562
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001563TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 Base::TestSetContentsNullOffer();
1565}
1566
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001567TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 Base::TestSetContentsRtcpMux();
1569}
1570
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001571TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001572 Base::TestSetContentsRtcpMux();
1573}
1574
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001575TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576 Base::TestChangeStreamParamsInContent();
1577}
1578
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001579TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 Base::TestPlayoutAndSendingStates();
1581}
1582
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001583TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584 Base::TestMediaContentDirection();
1585}
1586
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001587TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001588 Base::TestNetworkRouteChanges();
1589}
1590
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001591TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001592 Base::TestCallSetup();
1593}
1594
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001595TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 Base::TestCallTeardownRtcpMux();
1597}
1598
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001599TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600 Base::SendRtpToRtp();
1601}
1602
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001603TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001604 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605}
1606
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001607TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001608 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001609}
1610
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001611TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1613}
1614
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001615TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001616 Base::SendRtpToRtpOnThread();
1617}
1618
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001619TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620 Base::SendWithWritabilityLoss();
1621}
1622
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001623TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001624 Base::TestSetContentFailure();
1625}
1626
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001627TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 Base::TestSendTwoOffers();
1629}
1630
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001631TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 Base::TestReceiveTwoOffers();
1633}
1634
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001635TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 Base::TestSendPrAnswer();
1637}
1638
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001639TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 Base::TestReceivePrAnswer();
1641}
1642
zstein56162b92017-04-24 16:54:35 -07001643TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1644 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645}
1646
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001647TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001648 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649}
1650
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001651TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001652 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001653}
1654
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001655TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001656 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001657}
1658
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001659TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001660 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661}
1662
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001663TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001664 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001665}
1666
Steve Anton8a63f782017-10-23 13:08:53 -07001667TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1668 Base::SocketOptionsMergedOnSetTransport();
1669}
1670
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001671// VoiceChannelDoubleThreadTest
1672TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001673 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001674 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1675 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676}
1677
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001678TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1679 Base::TestDeinit();
1680}
1681
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001682TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 Base::TestSetContents();
1684}
1685
Johannes Kron9190b822018-10-29 11:22:05 +01001686TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1687 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1688}
1689
1690TEST_F(VoiceChannelDoubleThreadTest,
1691 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1692 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1693}
1694
1695TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1696 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1697}
1698
1699TEST_F(VoiceChannelDoubleThreadTest,
1700 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1701 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1702}
1703
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001704TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 Base::TestSetContentsNullOffer();
1706}
1707
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001708TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 Base::TestSetContentsRtcpMux();
1710}
1711
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001712TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 Base::TestSetContentsRtcpMux();
1714}
1715
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001716TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 Base::TestChangeStreamParamsInContent();
1718}
1719
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001720TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 Base::TestPlayoutAndSendingStates();
1722}
1723
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001724TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1725 Base::TestMediaContentDirection();
1726}
1727
1728TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1729 Base::TestNetworkRouteChanges();
1730}
1731
1732TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1733 Base::TestCallSetup();
1734}
1735
1736TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1737 Base::TestCallTeardownRtcpMux();
1738}
1739
1740TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1741 Base::SendRtpToRtp();
1742}
1743
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001744TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001745 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001746}
1747
1748TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001749 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001750}
1751
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001752TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1753 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1754}
1755
1756TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1757 Base::SendRtpToRtpOnThread();
1758}
1759
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001760TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1761 Base::SendWithWritabilityLoss();
1762}
1763
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001764TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1765 Base::TestSetContentFailure();
1766}
1767
1768TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1769 Base::TestSendTwoOffers();
1770}
1771
1772TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1773 Base::TestReceiveTwoOffers();
1774}
1775
1776TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1777 Base::TestSendPrAnswer();
1778}
1779
1780TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1781 Base::TestReceivePrAnswer();
1782}
1783
zstein56162b92017-04-24 16:54:35 -07001784TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1785 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001786}
1787
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001788TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1789 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1790}
1791
1792TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1793 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1794}
1795
1796TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1797 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1798}
1799
1800TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1801 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1802}
1803
1804TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1805 Base::DefaultMaxBitrateIsUnlimited();
1806}
1807
Steve Anton8a63f782017-10-23 13:08:53 -07001808TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1809 Base::SocketOptionsMergedOnSetTransport();
1810}
1811
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001812// VideoChannelSingleThreadTest
1813TEST_F(VideoChannelSingleThreadTest, TestInit) {
1814 Base::TestInit();
1815}
1816
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001817TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1818 Base::TestDeinit();
1819}
1820
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001821TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1822 Base::TestSetContents();
1823}
1824
Johannes Kron9190b822018-10-29 11:22:05 +01001825TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1826 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1827}
1828
1829TEST_F(VideoChannelSingleThreadTest,
1830 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1831 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1832}
1833
1834TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1835 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1836}
1837
1838TEST_F(VideoChannelSingleThreadTest,
1839 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1840 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1841}
1842
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001843TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1844 Base::TestSetContentsNullOffer();
1845}
1846
1847TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1848 Base::TestSetContentsRtcpMux();
1849}
1850
1851TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1852 Base::TestSetContentsRtcpMux();
1853}
1854
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001855TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1856 Base::TestChangeStreamParamsInContent();
1857}
1858
1859TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1860 Base::TestPlayoutAndSendingStates();
1861}
1862
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001863TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001864 Base::TestMediaContentDirection();
1865}
1866
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001867TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001868 Base::TestNetworkRouteChanges();
1869}
1870
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001871TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 Base::TestCallSetup();
1873}
1874
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001875TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 Base::TestCallTeardownRtcpMux();
1877}
1878
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001879TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001880 Base::SendRtpToRtp();
1881}
1882
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001883TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001884 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885}
1886
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001887TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001888 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889}
1890
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001891TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1893}
1894
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001895TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896 Base::SendRtpToRtpOnThread();
1897}
1898
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001899TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 Base::SendWithWritabilityLoss();
1901}
1902
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001903TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904 Base::TestSetContentFailure();
1905}
1906
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001907TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 Base::TestSendTwoOffers();
1909}
1910
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001911TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 Base::TestReceiveTwoOffers();
1913}
1914
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001915TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 Base::TestSendPrAnswer();
1917}
1918
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001919TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920 Base::TestReceivePrAnswer();
1921}
1922
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001923TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001924 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925}
1926
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001927TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001928 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001929}
1930
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001931TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001932 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001933}
1934
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001935TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001936 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937}
1938
zstein56162b92017-04-24 16:54:35 -07001939TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1940 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941}
1942
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001943TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001944 Base::DefaultMaxBitrateIsUnlimited();
1945}
1946
Steve Anton8a63f782017-10-23 13:08:53 -07001947TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1948 Base::SocketOptionsMergedOnSetTransport();
1949}
1950
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001951TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1952 Base::TestUpdateLocalStreamsWithSimulcast();
1953}
1954
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001955TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1956 const cricket::VideoCodec kVp8Codec(97, "VP8");
1957 cricket::VideoCodec vp9_codec(98, "VP9");
1958 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1959 cricket::VideoContentDescription video;
1960 video.set_codecs({kVp8Codec, vp9_codec});
1961
1962 CreateChannels(0, 0);
1963
1964 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
1965 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
1966 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
1967 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
1968 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
1969 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
1970 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
1971 cricket::kPacketizationParamRaw);
1972}
1973
1974TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
1975 const cricket::VideoCodec kVp8Codec(97, "VP8");
1976 cricket::VideoCodec vp9_codec(98, "VP9");
1977 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1978 cricket::VideoContentDescription video;
1979 video.set_codecs({kVp8Codec, vp9_codec});
1980
1981 CreateChannels(0, 0);
1982
1983 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
1984 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
1985 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
1986 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
1987 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
1988 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
1989 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
1990 cricket::kPacketizationParamRaw);
1991}
1992
1993TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
1994 const cricket::VideoCodec kVp8Codec(97, "VP8");
1995 cricket::VideoCodec vp9_codec(98, "VP9");
1996 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1997 cricket::VideoContentDescription video;
1998 video.set_codecs({kVp8Codec, vp9_codec});
1999
2000 CreateChannels(0, 0);
2001
2002 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2003 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2004 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2005 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2006 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2007 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2008 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2009 cricket::kPacketizationParamRaw);
2010 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2011 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2012 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2013 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2014 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2015 cricket::kPacketizationParamRaw);
2016}
2017
2018TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2019 const cricket::VideoCodec kLocalCodec(98, "VP8");
2020 cricket::VideoCodec remote_codec(99, "VP8");
2021 remote_codec.packetization = cricket::kPacketizationParamRaw;
2022 cricket::VideoContentDescription local_video;
2023 local_video.set_codecs({kLocalCodec});
2024 cricket::VideoContentDescription remote_video;
2025 remote_video.set_codecs({remote_codec});
2026
2027 CreateChannels(0, 0);
2028
2029 EXPECT_TRUE(
2030 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2031 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2032 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2033 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2034 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2035 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2036}
2037
2038TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2039 cricket::VideoCodec local_codec(98, "VP8");
2040 local_codec.packetization = cricket::kPacketizationParamRaw;
2041 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2042 cricket::VideoContentDescription local_video;
2043 local_video.set_codecs({local_codec});
2044 cricket::VideoContentDescription remote_video;
2045 remote_video.set_codecs({kRemoteCodec});
2046
2047 CreateChannels(0, 0);
2048
2049 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2050 EXPECT_TRUE(
2051 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2052 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2053 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2054 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2055 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2056}
2057
2058TEST_F(VideoChannelSingleThreadTest,
2059 TestSetRemoteAnswerWithInvalidPacketization) {
2060 cricket::VideoCodec local_codec(98, "VP8");
2061 local_codec.packetization = cricket::kPacketizationParamRaw;
2062 cricket::VideoCodec remote_codec(99, "VP8");
2063 remote_codec.packetization = "unknownpacketizationattributevalue";
2064 cricket::VideoContentDescription local_video;
2065 local_video.set_codecs({local_codec});
2066 cricket::VideoContentDescription remote_video;
2067 remote_video.set_codecs({remote_codec});
2068
2069 CreateChannels(0, 0);
2070
2071 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2072 EXPECT_FALSE(
2073 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2074 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2075 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2076 cricket::kPacketizationParamRaw);
2077 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2078}
2079
2080TEST_F(VideoChannelSingleThreadTest,
2081 TestSetLocalAnswerWithInvalidPacketization) {
2082 cricket::VideoCodec local_codec(98, "VP8");
2083 local_codec.packetization = cricket::kPacketizationParamRaw;
2084 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2085 cricket::VideoContentDescription local_video;
2086 local_video.set_codecs({local_codec});
2087 cricket::VideoContentDescription remote_video;
2088 remote_video.set_codecs({kRemoteCodec});
2089
2090 CreateChannels(0, 0);
2091
2092 EXPECT_TRUE(
2093 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2094 EXPECT_FALSE(
2095 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2096 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2097 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2098 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2099}
2100
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002101// VideoChannelDoubleThreadTest
2102TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2103 Base::TestInit();
2104}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002106TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2107 Base::TestDeinit();
2108}
2109
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002110TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2111 Base::TestSetContents();
2112}
2113
Johannes Kron9190b822018-10-29 11:22:05 +01002114TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2115 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2116}
2117
2118TEST_F(VideoChannelDoubleThreadTest,
2119 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2120 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2121}
2122
2123TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2124 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2125}
2126
2127TEST_F(VideoChannelDoubleThreadTest,
2128 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2129 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2130}
2131
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002132TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2133 Base::TestSetContentsNullOffer();
2134}
2135
2136TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2137 Base::TestSetContentsRtcpMux();
2138}
2139
2140TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2141 Base::TestSetContentsRtcpMux();
2142}
2143
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002144TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2145 Base::TestChangeStreamParamsInContent();
2146}
2147
2148TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2149 Base::TestPlayoutAndSendingStates();
2150}
2151
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002152TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2153 Base::TestMediaContentDirection();
2154}
2155
2156TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2157 Base::TestNetworkRouteChanges();
2158}
2159
2160TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2161 Base::TestCallSetup();
2162}
2163
2164TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2165 Base::TestCallTeardownRtcpMux();
2166}
2167
2168TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2169 Base::SendRtpToRtp();
2170}
2171
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002172TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002173 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002174}
2175
2176TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002177 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002178}
2179
2180TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2181 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2182}
2183
2184TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2185 Base::SendRtpToRtpOnThread();
2186}
2187
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002188TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2189 Base::SendWithWritabilityLoss();
2190}
2191
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002192TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2193 Base::TestSetContentFailure();
2194}
2195
2196TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2197 Base::TestSendTwoOffers();
2198}
2199
2200TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2201 Base::TestReceiveTwoOffers();
2202}
2203
2204TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2205 Base::TestSendPrAnswer();
2206}
2207
2208TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2209 Base::TestReceivePrAnswer();
2210}
2211
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002212TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2213 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2214}
2215
2216TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2217 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2218}
2219
2220TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2221 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2222}
2223
2224TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2225 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2226}
2227
zstein56162b92017-04-24 16:54:35 -07002228TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2229 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002230}
2231
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002232TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2233 Base::DefaultMaxBitrateIsUnlimited();
2234}
2235
Steve Anton8a63f782017-10-23 13:08:53 -07002236TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2237 Base::SocketOptionsMergedOnSetTransport();
2238}
2239
deadbeef953c2ce2017-01-09 14:53:41 -08002240// RtpDataChannelSingleThreadTest
2241class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002243 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002244 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002245 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2246};
2247
deadbeef953c2ce2017-01-09 14:53:41 -08002248// RtpDataChannelDoubleThreadTest
2249class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002250 public:
2251 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002252 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002253 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254};
2255
2256// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002257template <>
Steve Anton8699a322017-11-06 15:53:33 -08002258std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002259 rtc::Thread* worker_thread,
2260 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002261 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002262 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002263 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002264 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002265 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002266 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002267 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2268 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02002269 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270 return channel;
2271}
2272
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002273template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002274void ChannelTest<DataTraits>::CreateContent(
2275 int flags,
2276 const cricket::AudioCodec& audio_codec,
2277 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002278 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279 data->AddCodec(kGoogleDataCodec);
2280 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281}
2282
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002283template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002285 const cricket::RtpDataContentDescription& source,
2286 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287 *data = source;
2288}
2289
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002290template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2292 const cricket::DataCodec& c2) {
2293 return c1.name == c2.name;
2294}
2295
Peter Boström0c4e06b2015-10-07 12:23:21 +02002296template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002298 uint32_t ssrc,
2299 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002300 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301 data->AddLegacyStream(ssrc);
2302}
2303
deadbeef953c2ce2017-01-09 14:53:41 -08002304TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002305 Base::TestInit();
2306 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2307}
2308
deadbeef953c2ce2017-01-09 14:53:41 -08002309TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002310 Base::TestDeinit();
2311}
2312
deadbeef953c2ce2017-01-09 14:53:41 -08002313TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314 Base::TestSetContents();
2315}
2316
deadbeef953c2ce2017-01-09 14:53:41 -08002317TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 Base::TestSetContentsNullOffer();
2319}
2320
deadbeef953c2ce2017-01-09 14:53:41 -08002321TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 Base::TestSetContentsRtcpMux();
2323}
2324
deadbeef953c2ce2017-01-09 14:53:41 -08002325TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 Base::TestChangeStreamParamsInContent();
2327}
2328
deadbeef953c2ce2017-01-09 14:53:41 -08002329TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 Base::TestPlayoutAndSendingStates();
2331}
2332
deadbeef953c2ce2017-01-09 14:53:41 -08002333TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 Base::TestMediaContentDirection();
2335}
2336
deadbeef953c2ce2017-01-09 14:53:41 -08002337TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 Base::TestCallSetup();
2339}
2340
deadbeef953c2ce2017-01-09 14:53:41 -08002341TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342 Base::TestCallTeardownRtcpMux();
2343}
2344
zstein56162b92017-04-24 16:54:35 -07002345TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2346 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347}
2348
deadbeef953c2ce2017-01-09 14:53:41 -08002349TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 Base::SendRtpToRtp();
2351}
2352
deadbeef953c2ce2017-01-09 14:53:41 -08002353TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 Base::SendRtpToRtpOnThread();
2355}
2356
deadbeef953c2ce2017-01-09 14:53:41 -08002357TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 Base::SendWithWritabilityLoss();
2359}
2360
Steve Anton8a63f782017-10-23 13:08:53 -07002361TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2362 Base::SocketOptionsMergedOnSetTransport();
2363}
2364
deadbeef953c2ce2017-01-09 14:53:41 -08002365TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002366 CreateChannels(0, 0);
2367 EXPECT_TRUE(SendInitiate());
2368 EXPECT_TRUE(SendAccept());
2369
2370 cricket::SendDataParams params;
2371 params.ssrc = 42;
2372 unsigned char data[] = {'f', 'o', 'o'};
2373 rtc::CopyOnWriteBuffer payload(data, 3);
2374 cricket::SendDataResult result;
2375 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2376 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2377 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2378}
2379
deadbeef953c2ce2017-01-09 14:53:41 -08002380TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002381 Base::TestInit();
2382 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2383}
2384
deadbeef953c2ce2017-01-09 14:53:41 -08002385TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002386 Base::TestDeinit();
2387}
2388
deadbeef953c2ce2017-01-09 14:53:41 -08002389TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002390 Base::TestSetContents();
2391}
2392
deadbeef953c2ce2017-01-09 14:53:41 -08002393TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002394 Base::TestSetContentsNullOffer();
2395}
2396
deadbeef953c2ce2017-01-09 14:53:41 -08002397TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002398 Base::TestSetContentsRtcpMux();
2399}
2400
deadbeef953c2ce2017-01-09 14:53:41 -08002401TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002402 Base::TestChangeStreamParamsInContent();
2403}
2404
deadbeef953c2ce2017-01-09 14:53:41 -08002405TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002406 Base::TestPlayoutAndSendingStates();
2407}
2408
deadbeef953c2ce2017-01-09 14:53:41 -08002409TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002410 Base::TestMediaContentDirection();
2411}
2412
deadbeef953c2ce2017-01-09 14:53:41 -08002413TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002414 Base::TestCallSetup();
2415}
2416
deadbeef953c2ce2017-01-09 14:53:41 -08002417TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002418 Base::TestCallTeardownRtcpMux();
2419}
2420
zstein56162b92017-04-24 16:54:35 -07002421TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2422 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002423}
2424
deadbeef953c2ce2017-01-09 14:53:41 -08002425TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002426 Base::SendRtpToRtp();
2427}
2428
deadbeef953c2ce2017-01-09 14:53:41 -08002429TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002430 Base::SendRtpToRtpOnThread();
2431}
2432
deadbeef953c2ce2017-01-09 14:53:41 -08002433TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002434 Base::SendWithWritabilityLoss();
2435}
2436
Steve Anton8a63f782017-10-23 13:08:53 -07002437TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2438 Base::SocketOptionsMergedOnSetTransport();
2439}
2440
deadbeef953c2ce2017-01-09 14:53:41 -08002441TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 CreateChannels(0, 0);
2443 EXPECT_TRUE(SendInitiate());
2444 EXPECT_TRUE(SendAccept());
2445
2446 cricket::SendDataParams params;
2447 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002448 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002449 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450 cricket::SendDataResult result;
2451 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002452 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2454}
2455
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456// TODO(pthatcher): TestSetReceiver?