blob: e85500ac708e4e1a83371cff1268016fbf71b46c [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2009 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070011#include "pc/channel.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwiberg31022942016-03-11 14:18:21 -080014#include <memory>
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010015#include <utility>
kwiberg31022942016-03-11 14:18:21 -080016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "media/base/fake_media_engine.h"
22#include "media/base/fake_rtp.h"
23#include "media/base/media_channel.h"
24#include "p2p/base/candidate_pair_interface.h"
25#include "p2p/base/fake_dtls_transport.h"
26#include "p2p/base/fake_packet_transport.h"
27#include "p2p/base/ice_transport_internal.h"
28#include "p2p/base/p2p_constants.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/dtls_srtp_transport.h"
30#include "pc/jsep_transport.h"
31#include "pc/rtp_transport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/buffer.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/byte_order.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/rtc_certificate.h"
37#include "rtc_base/ssl_identity.h"
Mirta Dvornicic479a3c02019-06-04 15:38:50 +020038#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040
zhihuangb2cdd932017-01-19 16:54:25 -080041using cricket::DtlsTransportInternal;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042using cricket::FakeVoiceMediaChannel;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080043using cricket::RidDescription;
44using cricket::RidDirection;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045using cricket::StreamParams;
Steve Anton4e70a722017-11-28 14:57:10 -080046using webrtc::RtpTransceiverDirection;
Steve Anton3828c062017-12-06 10:34:51 -080047using webrtc::SdpType;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048
Danil Chapovalov33b01f22016-05-11 19:55:27 +020049namespace {
50const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
51const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
52const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
perkj26752742016-10-24 01:21:16 -070053const cricket::VideoCodec kH264Codec(97, "H264");
54const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
Danil Chapovalov33b01f22016-05-11 19:55:27 +020055const cricket::DataCodec kGoogleDataCodec(101, "google-data");
56const uint32_t kSsrc1 = 0x1111;
57const uint32_t kSsrc2 = 0x2222;
Zhi Huang365381f2018-04-13 16:44:34 -070058const uint32_t kSsrc3 = 0x3333;
59const uint32_t kSsrc4 = 0x4444;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020060const int kAudioPts[] = {0, 8};
61const int kVideoPts[] = {97, 99};
62enum class NetworkIsWorker { Yes, No };
Niels Möller02284852018-01-17 10:22:47 +010063
Danil Chapovalov33b01f22016-05-11 19:55:27 +020064} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
deadbeefcbecd352015-09-23 11:50:27 -070066template <class ChannelT,
67 class MediaChannelT,
68 class ContentT,
69 class CodecT,
70 class MediaInfoT,
71 class OptionsT>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072class Traits {
73 public:
74 typedef ChannelT Channel;
75 typedef MediaChannelT MediaChannel;
76 typedef ContentT Content;
77 typedef CodecT Codec;
78 typedef MediaInfoT MediaInfo;
Fredrik Solenbergb071a192015-09-17 16:42:56 +020079 typedef OptionsT Options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080};
81
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082class VoiceTraits : public Traits<cricket::VoiceChannel,
83 cricket::FakeVoiceMediaChannel,
84 cricket::AudioContentDescription,
85 cricket::AudioCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 cricket::VoiceMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070087 cricket::AudioOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
89class VideoTraits : public Traits<cricket::VideoChannel,
90 cricket::FakeVideoMediaChannel,
91 cricket::VideoContentDescription,
92 cricket::VideoCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +020093 cricket::VideoMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -070094 cricket::VideoOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
deadbeef953c2ce2017-01-09 14:53:41 -080096class DataTraits : public Traits<cricket::RtpDataChannel,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 cricket::FakeDataMediaChannel,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020098 cricket::RtpDataContentDescription,
99 cricket::RtpDataCodec,
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200100 cricket::DataMediaInfo,
deadbeefcbecd352015-09-23 11:50:27 -0700101 cricket::DataOptions> {};
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
deadbeef953c2ce2017-01-09 14:53:41 -0800103// Base class for Voice/Video/RtpDataChannel tests
Yves Gerey665174f2018-06-19 15:03:05 +0200104template <class T>
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200105class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 public:
deadbeefac22f702017-01-12 21:59:29 -0800107 enum Flags {
108 RTCP_MUX = 0x1,
deadbeefac22f702017-01-12 21:59:29 -0800109 SSRC_MUX = 0x8,
110 DTLS = 0x10,
deadbeef5bd5ca32017-02-10 11:31:50 -0800111 // Use BaseChannel with PacketTransportInternal rather than
deadbeeff5346592017-01-24 21:51:21 -0800112 // DtlsTransportInternal.
deadbeef7914b8c2017-04-21 03:23:33 -0700113 RAW_PACKET_TRANSPORT = 0x20,
deadbeefac22f702017-01-12 21:59:29 -0800114 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115
Peter Boström34fbfff2015-09-24 19:20:30 +0200116 ChannelTest(bool verify_playout,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200117 rtc::ArrayView<const uint8_t> rtp_data,
118 rtc::ArrayView<const uint8_t> rtcp_data,
119 NetworkIsWorker network_is_worker)
Peter Boström34fbfff2015-09-24 19:20:30 +0200120 : verify_playout_(verify_playout),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200121 rtp_packet_(rtp_data.data(), rtp_data.size()),
deadbeeff5346592017-01-24 21:51:21 -0800122 rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 if (network_is_worker == NetworkIsWorker::Yes) {
124 network_thread_ = rtc::Thread::Current();
125 } else {
126 network_thread_keeper_ = rtc::Thread::Create();
127 network_thread_keeper_->SetName("Network", nullptr);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200128 network_thread_ = network_thread_keeper_.get();
129 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200130 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 void CreateChannels(int flags1, int flags2) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200133 CreateChannels(std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800134 nullptr, typename T::Options()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200135 std::make_unique<typename T::MediaChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800136 nullptr, typename T::Options()),
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200137 flags1, flags2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
Steve Anton8699a322017-11-06 15:53:33 -0800139 void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
140 std::unique_ptr<typename T::MediaChannel> ch2,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200141 int flags1,
142 int flags2) {
deadbeeff5346592017-01-24 21:51:21 -0800143 // Network thread is started in CreateChannels, to allow the test to
144 // configure a fake clock before any threads are spawned and attempt to
145 // access the time.
146 if (network_thread_keeper_) {
147 network_thread_keeper_->Start();
148 }
Zhi Huange830e682018-03-30 10:48:35 -0700149
deadbeeff5346592017-01-24 21:51:21 -0800150 // Make sure if using raw packet transports, they're used for both
151 // channels.
152 RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200153 rtc::Thread* worker_thread = rtc::Thread::Current();
Steve Anton8699a322017-11-06 15:53:33 -0800154 media_channel1_ = ch1.get();
155 media_channel2_ = ch2.get();
deadbeef5bd5ca32017-02-10 11:31:50 -0800156 rtc::PacketTransportInternal* rtp1 = nullptr;
157 rtc::PacketTransportInternal* rtcp1 = nullptr;
158 rtc::PacketTransportInternal* rtp2 = nullptr;
159 rtc::PacketTransportInternal* rtcp2 = nullptr;
deadbeeff5346592017-01-24 21:51:21 -0800160 // Based on flags, create fake DTLS or raw packet transports.
161 if (flags1 & RAW_PACKET_TRANSPORT) {
162 fake_rtp_packet_transport1_.reset(
163 new rtc::FakePacketTransport("channel1_rtp"));
164 rtp1 = fake_rtp_packet_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700165 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800166 fake_rtcp_packet_transport1_.reset(
167 new rtc::FakePacketTransport("channel1_rtcp"));
168 rtcp1 = fake_rtcp_packet_transport1_.get();
169 }
170 } else {
171 // Confirmed to work with KT_RSA and KT_ECDSA.
172 fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100173 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800174 rtp1 = fake_rtp_dtls_transport1_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700175 if (!(flags1 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800176 fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100177 "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
178 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800179 rtcp1 = fake_rtcp_dtls_transport1_.get();
180 }
181 if (flags1 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100182 auto cert1 = rtc::RTCCertificate::Create(
183 rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800184 fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
185 if (fake_rtcp_dtls_transport1_) {
186 fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
187 }
188 }
189 }
190 // Based on flags, create fake DTLS or raw packet transports.
191 if (flags2 & RAW_PACKET_TRANSPORT) {
192 fake_rtp_packet_transport2_.reset(
193 new rtc::FakePacketTransport("channel2_rtp"));
194 rtp2 = fake_rtp_packet_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700195 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800196 fake_rtcp_packet_transport2_.reset(
197 new rtc::FakePacketTransport("channel2_rtcp"));
198 rtcp2 = fake_rtcp_packet_transport2_.get();
199 }
200 } else {
201 // Confirmed to work with KT_RSA and KT_ECDSA.
202 fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100203 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800204 rtp2 = fake_rtp_dtls_transport2_.get();
Zhi Huange830e682018-03-30 10:48:35 -0700205 if (!(flags2 & RTCP_MUX)) {
deadbeeff5346592017-01-24 21:51:21 -0800206 fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
Niels Möller92430882021-03-18 10:03:19 +0100207 "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
208 network_thread_));
deadbeeff5346592017-01-24 21:51:21 -0800209 rtcp2 = fake_rtcp_dtls_transport2_.get();
210 }
211 if (flags2 & DTLS) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100212 auto cert2 = rtc::RTCCertificate::Create(
213 rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
deadbeeff5346592017-01-24 21:51:21 -0800214 fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
215 if (fake_rtcp_dtls_transport2_) {
216 fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
217 }
218 }
219 }
Zhi Huange830e682018-03-30 10:48:35 -0700220 rtp_transport1_ = CreateRtpTransportBasedOnFlags(
221 fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
222 fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
223 flags1);
224 rtp_transport2_ = CreateRtpTransportBasedOnFlags(
225 fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
226 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
227 flags2);
228
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800229 channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
230 rtp_transport1_.get(), flags1);
231 channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
232 rtp_transport2_.get(), flags2);
Yves Gerey665174f2018-06-19 15:03:05 +0200233 CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
234 CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 CopyContent(local_media_content1_, &remote_media_content1_);
236 CopyContent(local_media_content2_, &remote_media_content2_);
237
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 // Add stream information (SSRC) to the local content but not to the remote
239 // content. This means that we per default know the SSRC of what we send but
240 // not what we receive.
241 AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
242 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
243
244 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
245 if (flags1 & SSRC_MUX) {
246 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
247 }
248 if (flags2 & SSRC_MUX) {
249 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
250 }
251 }
Steve Anton8699a322017-11-06 15:53:33 -0800252 std::unique_ptr<typename T::Channel> CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200253 rtc::Thread* worker_thread,
254 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800255 std::unique_ptr<typename T::MediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -0700256 webrtc::RtpTransportInternal* rtp_transport,
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200257 int flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000258
Zhi Huange830e682018-03-30 10:48:35 -0700259 std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
260 rtc::PacketTransportInternal* rtp_packet_transport,
261 rtc::PacketTransportInternal* rtcp_packet_transport,
262 DtlsTransportInternal* rtp_dtls_transport,
263 DtlsTransportInternal* rtcp_dtls_transport,
264 int flags) {
265 if (flags & RTCP_MUX) {
266 rtcp_packet_transport = nullptr;
267 rtcp_dtls_transport = nullptr;
268 }
269
270 if (flags & DTLS) {
271 return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
272 } else {
273 if (flags & RAW_PACKET_TRANSPORT) {
274 return CreateUnencryptedTransport(rtp_packet_transport,
275 rtcp_packet_transport);
276 } else {
277 return CreateUnencryptedTransport(rtp_dtls_transport,
278 rtcp_dtls_transport);
279 }
280 }
281 }
282
283 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
284 rtc::PacketTransportInternal* rtp_packet_transport,
285 rtc::PacketTransportInternal* rtcp_packet_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200286 auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200287 rtcp_packet_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700288
Niels Möller92430882021-03-18 10:03:19 +0100289 network_thread_->Invoke<void>(
290 RTC_FROM_HERE,
291 [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
292 rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
293 if (rtcp_packet_transport) {
294 rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
295 }
296 });
Zhi Huange830e682018-03-30 10:48:35 -0700297 return rtp_transport;
298 }
299
300 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
301 cricket::DtlsTransportInternal* rtp_dtls_transport,
302 cricket::DtlsTransportInternal* rtcp_dtls_transport) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200303 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Zhi Huang365381f2018-04-13 16:44:34 -0700304 rtcp_dtls_transport == nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700305
Niels Möller92430882021-03-18 10:03:19 +0100306 network_thread_->Invoke<void>(
307 RTC_FROM_HERE,
308 [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
309 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
310 rtcp_dtls_transport);
311 });
Zhi Huange830e682018-03-30 10:48:35 -0700312 return dtls_srtp_transport;
313 }
314
deadbeeff5346592017-01-24 21:51:21 -0800315 void ConnectFakeTransports() {
316 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
317 bool asymmetric = false;
318 // Depending on test flags, could be using DTLS or raw packet transport.
319 if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
320 fake_rtp_dtls_transport1_->SetDestination(
321 fake_rtp_dtls_transport2_.get(), asymmetric);
322 }
323 if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
324 fake_rtcp_dtls_transport1_->SetDestination(
325 fake_rtcp_dtls_transport2_.get(), asymmetric);
326 }
327 if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
328 fake_rtp_packet_transport1_->SetDestination(
329 fake_rtp_packet_transport2_.get(), asymmetric);
330 }
331 if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
332 fake_rtcp_packet_transport1_->SetDestination(
333 fake_rtcp_packet_transport2_.get(), asymmetric);
334 }
335 });
Taylor Brandstetter2ab9b282021-02-01 14:39:07 -0800336 // The transport becoming writable will asynchronously update the send state
337 // on the worker thread; since this test uses the main thread as the worker
338 // thread, we must process the message queue for this to occur.
339 WaitForThreads();
deadbeeff5346592017-01-24 21:51:21 -0800340 }
341
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 bool SendInitiate() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000343 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800344 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 if (result) {
346 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000347 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800348 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349 if (result) {
deadbeeff5346592017-01-24 21:51:21 -0800350 ConnectFakeTransports();
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000351 result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800352 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 }
354 }
355 return result;
356 }
357
358 bool SendAccept() {
359 channel2_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000360 return channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800361 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 }
363
364 bool SendOffer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000365 bool result = channel1_->SetLocalContent(&local_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800366 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 if (result) {
368 channel1_->Enable(true);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000369 result = channel2_->SetRemoteContent(&remote_media_content1_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800370 SdpType::kOffer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 }
372 return result;
373 }
374
375 bool SendProvisionalAnswer() {
376 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800377 SdpType::kPrAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 if (result) {
379 channel2_->Enable(true);
380 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800381 SdpType::kPrAnswer, NULL);
deadbeeff5346592017-01-24 21:51:21 -0800382 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383 }
384 return result;
385 }
386
387 bool SendFinalAnswer() {
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000388 bool result = channel2_->SetLocalContent(&local_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800389 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 if (result)
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000391 result = channel1_->SetRemoteContent(&remote_media_content2_,
Taylor Brandstetterd0acbd82021-01-25 13:44:55 -0800392 SdpType::kAnswer, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000393 return result;
394 }
395
deadbeeff5346592017-01-24 21:51:21 -0800396 bool Terminate() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 channel1_.reset();
398 channel2_.reset();
deadbeeff5346592017-01-24 21:51:21 -0800399 fake_rtp_dtls_transport1_.reset();
400 fake_rtcp_dtls_transport1_.reset();
401 fake_rtp_dtls_transport2_.reset();
402 fake_rtcp_dtls_transport2_.reset();
403 fake_rtp_packet_transport1_.reset();
404 fake_rtcp_packet_transport1_.reset();
405 fake_rtp_packet_transport2_.reset();
406 fake_rtcp_packet_transport2_.reset();
407 if (network_thread_keeper_) {
408 network_thread_keeper_.reset();
409 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 return true;
411 }
412
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200413 void SendRtp1() {
414 media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
415 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200417 void SendRtp2() {
418 media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
419 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 // Methods to send custom data.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200422 void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
423 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
424 media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200426 void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
427 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
428 media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200430
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 bool CheckRtp1() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200432 return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 }
434 bool CheckRtp2() {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200435 return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 // Methods to check custom data.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200438 bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200439 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
440 return media_channel1_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000441 }
Peter Boström0c4e06b2015-10-07 12:23:21 +0200442 bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200443 rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
444 return media_channel2_->CheckRtp(data.data(), data.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200446 rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
447 rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 // Set SSRC in the rtp packet copy.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200449 rtc::SetBE32(data.data() + 8, ssrc);
450 rtc::SetBE16(data.data() + 2, sequence_number);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000451 if (pl_type >= 0) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200452 rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +0000453 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 return data;
455 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456
Yves Gerey665174f2018-06-19 15:03:05 +0200457 bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
458 bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459
460 void CreateContent(int flags,
461 const cricket::AudioCodec& audio_codec,
462 const cricket::VideoCodec& video_codec,
463 typename T::Content* content) {
464 // overridden in specialized classes
465 }
466 void CopyContent(const typename T::Content& source,
467 typename T::Content* content) {
468 // overridden in specialized classes
469 }
470
Steve Anton18ee1d52017-09-11 11:32:35 -0700471 // Creates a MediaContent with one stream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
Steve Anton18ee1d52017-09-11 11:32:35 -0700473 typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
474 typename T::Content* content = new typename T::Content();
Zhi Huange830e682018-03-30 10:48:35 -0700475 CreateContent(0, kPcmuCodec, kH264Codec, content);
Steve Anton18ee1d52017-09-11 11:32:35 -0700476 AddLegacyStreamInContent(ssrc, 0, content);
477 return content;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 }
479
ossu292d6582016-03-17 02:31:13 -0700480 // Will manage the lifetime of a CallThread, making sure it's
481 // destroyed before this object goes out of scope.
482 class ScopedCallThread {
483 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200484 template <class FunctorT>
Artem Titovd8bd7502019-01-09 21:10:00 +0100485 explicit ScopedCallThread(FunctorT&& functor)
Danil Chapovalovb877e712019-11-29 15:19:27 +0100486 : thread_(rtc::Thread::Create()) {
ossu292d6582016-03-17 02:31:13 -0700487 thread_->Start();
Danil Chapovalovb877e712019-11-29 15:19:27 +0100488 thread_->PostTask(RTC_FROM_HERE, std::forward<FunctorT>(functor));
ossu292d6582016-03-17 02:31:13 -0700489 }
490
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200491 ~ScopedCallThread() { thread_->Stop(); }
ossu292d6582016-03-17 02:31:13 -0700492
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200493 rtc::Thread* thread() { return thread_.get(); }
ossu292d6582016-03-17 02:31:13 -0700494
495 private:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200496 std::unique_ptr<rtc::Thread> thread_;
ossu292d6582016-03-17 02:31:13 -0700497 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
500 return false; // overridden in specialized classes
501 }
502
Honghai Zhangcc411c02016-03-29 17:27:21 -0700503 cricket::CandidatePairInterface* last_selected_candidate_pair() {
504 return last_selected_candidate_pair_;
505 }
506
Peter Boström0c4e06b2015-10-07 12:23:21 +0200507 void AddLegacyStreamInContent(uint32_t ssrc,
508 int flags,
509 typename T::Content* content) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 // Base implementation.
511 }
512
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200513 // Utility method that calls BaseChannel::srtp_active() on the network thread
514 // and returns the result. The |srtp_active()| state is maintained on the
515 // network thread, which callers need to factor in.
516 bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
517 RTC_DCHECK(channel.get());
518 return network_thread_->Invoke<bool>(
519 RTC_FROM_HERE, [&] { return channel->srtp_active(); });
520 }
521
522 // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
523 // returns true.
524 bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
525 RTC_DCHECK(channel.get());
526 return network_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
527 return channel->rtp_transport() &&
528 channel->rtp_transport()->rtcp_mux_enabled();
529 });
530 }
531
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 // Tests that can be used by derived classes.
533
534 // Basic sanity check.
535 void TestInit() {
536 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200537 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200539 if (verify_playout_) {
540 EXPECT_FALSE(media_channel1_->playout());
541 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 EXPECT_TRUE(media_channel1_->codecs().empty());
543 EXPECT_TRUE(media_channel1_->recv_streams().empty());
544 EXPECT_TRUE(media_channel1_->rtp_packets().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 }
546
547 // Test that SetLocalContent and SetRemoteContent properly configure
548 // the codecs.
549 void TestSetContents() {
550 CreateChannels(0, 0);
551 typename T::Content content;
552 CreateContent(0, kPcmuCodec, kH264Codec, &content);
Steve Anton3828c062017-12-06 10:34:51 -0800553 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800555 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200557 EXPECT_TRUE(
558 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 }
560
Johannes Kron9190b822018-10-29 11:22:05 +0100561 // Test that SetLocalContent and SetRemoteContent properly configure
562 // extmap-allow-mixed.
563 void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
564 // For a caller, SetLocalContent() is called first with an offer and next
565 // SetRemoteContent() is called with the answer.
566 CreateChannels(0, 0);
567 typename T::Content content;
568 CreateContent(0, kPcmuCodec, kH264Codec, &content);
569 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
570 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
571 content.set_extmap_allow_mixed_enum(offer_enum);
572 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
573 content.set_extmap_allow_mixed_enum(answer_enum);
574 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
575 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
576 }
577 void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
578 // For a callee, SetRemoteContent() is called first with an offer and next
579 // SetLocalContent() is called with the answer.
580 CreateChannels(0, 0);
581 typename T::Content content;
582 CreateContent(0, kPcmuCodec, kH264Codec, &content);
583 auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
584 auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
585 content.set_extmap_allow_mixed_enum(offer_enum);
586 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
587 content.set_extmap_allow_mixed_enum(answer_enum);
588 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
589 EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
590 }
591
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592 // Test that SetLocalContent and SetRemoteContent properly deals
593 // with an empty offer.
594 void TestSetContentsNullOffer() {
595 CreateChannels(0, 0);
596 typename T::Content content;
Steve Anton3828c062017-12-06 10:34:51 -0800597 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 CreateContent(0, kPcmuCodec, kH264Codec, &content);
599 EXPECT_EQ(0U, media_channel1_->codecs().size());
Steve Anton3828c062017-12-06 10:34:51 -0800600 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 ASSERT_EQ(1U, media_channel1_->codecs().size());
Yves Gerey665174f2018-06-19 15:03:05 +0200602 EXPECT_TRUE(
603 CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 }
605
606 // Test that SetLocalContent and SetRemoteContent properly set RTCP
607 // mux.
608 void TestSetContentsRtcpMux() {
deadbeefac22f702017-01-12 21:59:29 -0800609 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 typename T::Content content;
611 CreateContent(0, kPcmuCodec, kH264Codec, &content);
612 // Both sides agree on mux. Should no longer be a separate RTCP channel.
613 content.set_rtcp_mux(true);
Steve Anton3828c062017-12-06 10:34:51 -0800614 EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
615 EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 // Only initiator supports mux. Should still have a separate RTCP channel.
Steve Anton3828c062017-12-06 10:34:51 -0800617 EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 content.set_rtcp_mux(false);
Steve Anton3828c062017-12-06 10:34:51 -0800619 EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 }
621
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 // Test that SetLocalContent and SetRemoteContent properly
623 // handles adding and removing StreamParams when the action is a full
Steve Anton3828c062017-12-06 10:34:51 -0800624 // SdpType::kOffer / SdpType::kAnswer.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 void TestChangeStreamParamsInContent() {
626 cricket::StreamParams stream1;
627 stream1.groupid = "group1";
628 stream1.id = "stream1";
629 stream1.ssrcs.push_back(kSsrc1);
630 stream1.cname = "stream1_cname";
631
632 cricket::StreamParams stream2;
633 stream2.groupid = "group1";
634 stream2.id = "stream2";
635 stream2.ssrcs.push_back(kSsrc2);
636 stream2.cname = "stream2_cname";
637
638 // Setup a call where channel 1 send |stream1| to channel 2.
639 CreateChannels(0, 0);
640 typename T::Content content1;
641 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
642 content1.AddStream(stream1);
Steve Anton3828c062017-12-06 10:34:51 -0800643 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 EXPECT_TRUE(channel1_->Enable(true));
645 EXPECT_EQ(1u, media_channel1_->send_streams().size());
646
Steve Anton3828c062017-12-06 10:34:51 -0800647 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_EQ(1u, media_channel2_->recv_streams().size());
deadbeeff5346592017-01-24 21:51:21 -0800649 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650
651 // Channel 2 do not send anything.
652 typename T::Content content2;
653 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
Steve Anton3828c062017-12-06 10:34:51 -0800654 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_EQ(0u, media_channel1_->recv_streams().size());
Steve Anton3828c062017-12-06 10:34:51 -0800656 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 EXPECT_TRUE(channel2_->Enable(true));
658 EXPECT_EQ(0u, media_channel2_->send_streams().size());
659
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200660 SendCustomRtp1(kSsrc1, 0);
661 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
663
664 // Let channel 2 update the content by sending |stream2| and enable SRTP.
665 typename T::Content content3;
Zhi Huange830e682018-03-30 10:48:35 -0700666 CreateContent(0, kPcmuCodec, kH264Codec, &content3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 content3.AddStream(stream2);
Steve Anton3828c062017-12-06 10:34:51 -0800668 EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 ASSERT_EQ(1u, media_channel2_->send_streams().size());
670 EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
671
Steve Anton3828c062017-12-06 10:34:51 -0800672 EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 ASSERT_EQ(1u, media_channel1_->recv_streams().size());
674 EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
675
676 // Channel 1 replies but stop sending stream1.
677 typename T::Content content4;
Zhi Huange830e682018-03-30 10:48:35 -0700678 CreateContent(0, kPcmuCodec, kH264Codec, &content4);
Steve Anton3828c062017-12-06 10:34:51 -0800679 EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_EQ(0u, media_channel1_->send_streams().size());
681
Steve Anton3828c062017-12-06 10:34:51 -0800682 EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_EQ(0u, media_channel2_->recv_streams().size());
684
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200685 SendCustomRtp2(kSsrc2, 0);
686 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
688 }
689
690 // Test that we only start playout and sending at the right times.
691 void TestPlayoutAndSendingStates() {
692 CreateChannels(0, 0);
Peter Boström34fbfff2015-09-24 19:20:30 +0200693 if (verify_playout_) {
694 EXPECT_FALSE(media_channel1_->playout());
695 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200697 if (verify_playout_) {
698 EXPECT_FALSE(media_channel2_->playout());
699 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 EXPECT_FALSE(media_channel2_->sending());
701 EXPECT_TRUE(channel1_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200702 if (verify_playout_) {
703 EXPECT_FALSE(media_channel1_->playout());
704 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800707 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200708 if (verify_playout_) {
709 EXPECT_TRUE(media_channel1_->playout());
710 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 EXPECT_FALSE(media_channel1_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000712 EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
Steve Anton3828c062017-12-06 10:34:51 -0800713 SdpType::kOffer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200714 if (verify_playout_) {
715 EXPECT_FALSE(media_channel2_->playout());
716 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 EXPECT_FALSE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000718 EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800719 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200720 if (verify_playout_) {
721 EXPECT_FALSE(media_channel2_->playout());
722 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 EXPECT_FALSE(media_channel2_->sending());
deadbeeff5346592017-01-24 21:51:21 -0800724 ConnectFakeTransports();
Peter Boström34fbfff2015-09-24 19:20:30 +0200725 if (verify_playout_) {
726 EXPECT_TRUE(media_channel1_->playout());
727 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200729 if (verify_playout_) {
730 EXPECT_FALSE(media_channel2_->playout());
731 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 EXPECT_FALSE(media_channel2_->sending());
733 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200734 if (verify_playout_) {
735 EXPECT_TRUE(media_channel2_->playout());
736 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 EXPECT_TRUE(media_channel2_->sending());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000738 EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
Steve Anton3828c062017-12-06 10:34:51 -0800739 SdpType::kAnswer, NULL));
Peter Boström34fbfff2015-09-24 19:20:30 +0200740 if (verify_playout_) {
741 EXPECT_TRUE(media_channel1_->playout());
742 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 EXPECT_TRUE(media_channel1_->sending());
744 }
745
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746 // Test that changing the MediaContentDirection in the local and remote
747 // session description start playout and sending at the right time.
748 void TestMediaContentDirection() {
749 CreateChannels(0, 0);
750 typename T::Content content1;
751 CreateContent(0, kPcmuCodec, kH264Codec, &content1);
752 typename T::Content content2;
753 CreateContent(0, kPcmuCodec, kH264Codec, &content2);
754 // Set |content2| to be InActive.
Steve Anton4e70a722017-11-28 14:57:10 -0800755 content2.set_direction(RtpTransceiverDirection::kInactive);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
757 EXPECT_TRUE(channel1_->Enable(true));
758 EXPECT_TRUE(channel2_->Enable(true));
Peter Boström34fbfff2015-09-24 19:20:30 +0200759 if (verify_playout_) {
760 EXPECT_FALSE(media_channel1_->playout());
761 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762 EXPECT_FALSE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200763 if (verify_playout_) {
764 EXPECT_FALSE(media_channel2_->playout());
765 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_FALSE(media_channel2_->sending());
767
Steve Anton3828c062017-12-06 10:34:51 -0800768 EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
769 EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
770 EXPECT_TRUE(
771 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
772 EXPECT_TRUE(
773 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
deadbeeff5346592017-01-24 21:51:21 -0800774 ConnectFakeTransports();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775
Peter Boström34fbfff2015-09-24 19:20:30 +0200776 if (verify_playout_) {
777 EXPECT_TRUE(media_channel1_->playout());
778 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 EXPECT_FALSE(media_channel1_->sending()); // remote InActive
Peter Boström34fbfff2015-09-24 19:20:30 +0200780 if (verify_playout_) {
781 EXPECT_FALSE(media_channel2_->playout()); // local InActive
782 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 EXPECT_FALSE(media_channel2_->sending()); // local InActive
784
785 // Update |content2| to be RecvOnly.
Steve Anton4e70a722017-11-28 14:57:10 -0800786 content2.set_direction(RtpTransceiverDirection::kRecvOnly);
Steve Anton3828c062017-12-06 10:34:51 -0800787 EXPECT_TRUE(
788 channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, NULL));
789 EXPECT_TRUE(
790 channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
Peter Boström34fbfff2015-09-24 19:20:30 +0200792 if (verify_playout_) {
793 EXPECT_TRUE(media_channel1_->playout());
794 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200796 if (verify_playout_) {
797 EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
798 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799 EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
800
801 // Update |content2| to be SendRecv.
Steve Anton4e70a722017-11-28 14:57:10 -0800802 content2.set_direction(RtpTransceiverDirection::kSendRecv);
Steve Anton3828c062017-12-06 10:34:51 -0800803 EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
804 EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805
Peter Boström34fbfff2015-09-24 19:20:30 +0200806 if (verify_playout_) {
807 EXPECT_TRUE(media_channel1_->playout());
808 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 EXPECT_TRUE(media_channel1_->sending());
Peter Boström34fbfff2015-09-24 19:20:30 +0200810 if (verify_playout_) {
811 EXPECT_TRUE(media_channel2_->playout());
812 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813 EXPECT_TRUE(media_channel2_->sending());
814 }
815
Honghai Zhangcc411c02016-03-29 17:27:21 -0700816 // Tests that when the transport channel signals a candidate pair change
817 // event, the media channel will receive a call on the network route change.
818 void TestNetworkRouteChanges() {
eladalon05b07bb2017-08-24 07:40:16 -0700819 static constexpr uint16_t kLocalNetId = 1;
820 static constexpr uint16_t kRemoteNetId = 2;
821 static constexpr int kLastPacketId = 100;
Zhi Huang942bc2e2017-11-13 13:26:07 -0800822 // Ipv4(20) + UDP(8).
823 static constexpr int kTransportOverheadPerPacket = 28;
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800824 static constexpr int kSrtpOverheadPerPacket = 10;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200825
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800826 CreateChannels(DTLS, DTLS);
827 SendInitiate();
Honghai Zhangcc411c02016-03-29 17:27:21 -0700828
Honghai Zhangcc411c02016-03-29 17:27:21 -0700829 typename T::MediaChannel* media_channel1 =
830 static_cast<typename T::MediaChannel*>(channel1_->media_channel());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200831 ASSERT_TRUE(media_channel1);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700832
Zhi Huang942bc2e2017-11-13 13:26:07 -0800833 // Need to wait for the threads before calling
834 // |set_num_network_route_changes| because the network route would be set
835 // when creating the channel.
836 WaitForThreads();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200837 media_channel1->set_num_network_route_changes(0);
deadbeeff5346592017-01-24 21:51:21 -0800838 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800839 rtc::NetworkRoute network_route;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200840 // The transport channel becomes disconnected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800841 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200842 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200843 });
844 WaitForThreads();
845 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700846 EXPECT_FALSE(media_channel1->last_network_route().connected);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200847 media_channel1->set_num_network_route_changes(0);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700848
eladalon05b07bb2017-08-24 07:40:16 -0700849 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
Zhi Huang942bc2e2017-11-13 13:26:07 -0800850 rtc::NetworkRoute network_route;
851 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100852 network_route.local =
853 rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
854 network_route.remote =
855 rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800856 network_route.last_sent_packet_id = kLastPacketId;
857 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200858 // The transport channel becomes connected.
Zhi Huang942bc2e2017-11-13 13:26:07 -0800859 fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
860
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200861 absl::optional<rtc::NetworkRoute>(network_route));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200862 });
863 WaitForThreads();
864 EXPECT_EQ(1, media_channel1->num_network_route_changes());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100865 EXPECT_TRUE(media_channel1->last_network_route().connected);
866 EXPECT_EQ(kLocalNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100867 media_channel1->last_network_route().local.network_id());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100868 EXPECT_EQ(kRemoteNetId,
Jonas Oreland71fda362020-03-20 16:11:56 +0100869 media_channel1->last_network_route().remote.network_id());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200870 EXPECT_EQ(kLastPacketId,
Honghai Zhang52dce732016-03-31 12:37:31 -0700871 media_channel1->last_network_route().last_sent_packet_id);
Zhi Huangcf6e24a2018-02-21 10:40:07 -0800872 EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
michaelt79e05882016-11-08 02:50:09 -0800873 media_channel1->transport_overhead_per_packet());
Honghai Zhangcc411c02016-03-29 17:27:21 -0700874 }
875
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 // Test setting up a call.
877 void TestCallSetup() {
878 CreateChannels(0, 0);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200879 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880 EXPECT_TRUE(SendInitiate());
Peter Boström34fbfff2015-09-24 19:20:30 +0200881 if (verify_playout_) {
882 EXPECT_TRUE(media_channel1_->playout());
883 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 EXPECT_FALSE(media_channel1_->sending());
885 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200886 EXPECT_FALSE(IsSrtpActive(channel1_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 EXPECT_TRUE(media_channel1_->sending());
888 EXPECT_EQ(1U, media_channel1_->codecs().size());
Peter Boström34fbfff2015-09-24 19:20:30 +0200889 if (verify_playout_) {
890 EXPECT_TRUE(media_channel2_->playout());
891 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 EXPECT_TRUE(media_channel2_->sending());
893 EXPECT_EQ(1U, media_channel2_->codecs().size());
894 }
895
896 // Test that we don't crash if packets are sent during call teardown
897 // when RTCP mux is enabled. This is a regression test against a specific
898 // race condition that would only occur when a RTCP packet was sent during
899 // teardown of a channel on which RTCP mux was enabled.
900 void TestCallTeardownRtcpMux() {
901 class LastWordMediaChannel : public T::MediaChannel {
902 public:
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200903 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904 ~LastWordMediaChannel() {
stefanc1aeaf02015-10-15 07:26:07 -0700905 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
906 rtc::PacketOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
908 }
909 };
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200910 CreateChannels(std::make_unique<LastWordMediaChannel>(),
911 std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
Karl Wiberg918f50c2018-07-05 11:40:33 +0200912 RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 EXPECT_TRUE(SendInitiate());
914 EXPECT_TRUE(SendAccept());
deadbeeff5346592017-01-24 21:51:21 -0800915 EXPECT_TRUE(Terminate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 }
917
918 // Send voice RTP data to the other side and ensure it gets there.
919 void SendRtpToRtp() {
Zhi Huange830e682018-03-30 10:48:35 -0700920 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 EXPECT_TRUE(SendInitiate());
922 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200923 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
924 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200925 SendRtp1();
926 SendRtp2();
927 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());
932 }
933
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200934 void TestDeinit() {
deadbeefac22f702017-01-12 21:59:29 -0800935 CreateChannels(0, 0);
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200936 EXPECT_TRUE(SendInitiate());
937 EXPECT_TRUE(SendAccept());
938 SendRtp1();
939 SendRtp2();
Danil Chapovalovdae07ba2016-05-14 01:43:50 +0200940 // Do not wait, destroy channels.
941 channel1_.reset(nullptr);
942 channel2_.reset(nullptr);
943 }
944
Zhi Huange830e682018-03-30 10:48:35 -0700945 void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
946 CreateChannels(flags1 | DTLS, flags2 | DTLS);
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200947 EXPECT_FALSE(IsSrtpActive(channel1_));
948 EXPECT_FALSE(IsSrtpActive(channel2_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 EXPECT_TRUE(SendInitiate());
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200950 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200952 EXPECT_TRUE(IsSrtpActive(channel1_));
953 EXPECT_TRUE(IsSrtpActive(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200954 SendRtp1();
955 SendRtp2();
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200956 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000957 EXPECT_TRUE(CheckRtp1());
958 EXPECT_TRUE(CheckRtp2());
959 EXPECT_TRUE(CheckNoRtp1());
960 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 }
962
963 // Test that we can send and receive early media when a provisional answer is
964 // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
965 void SendEarlyMediaUsingRtcpMuxSrtp() {
Yves Gerey665174f2018-06-19 15:03:05 +0200966 int sequence_number1_1 = 0, sequence_number2_2 = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000967
Yves Gerey665174f2018-06-19 15:03:05 +0200968 CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
969 EXPECT_TRUE(SendOffer());
970 EXPECT_TRUE(SendProvisionalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200971 EXPECT_TRUE(IsSrtpActive(channel1_));
972 EXPECT_TRUE(IsSrtpActive(channel2_));
973 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
974 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200975 WaitForThreads(); // Wait for 'sending' flag go through network thread.
Yves Gerey665174f2018-06-19 15:03:05 +0200976 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
977 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200978 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979
Yves Gerey665174f2018-06-19 15:03:05 +0200980 // Send packets from callee and verify that it is received.
Yves Gerey665174f2018-06-19 15:03:05 +0200981 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
982 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200983 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984
Yves Gerey665174f2018-06-19 15:03:05 +0200985 // Complete call setup and ensure everything is still OK.
986 EXPECT_TRUE(SendFinalAnswer());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +0200987 EXPECT_TRUE(IsSrtpActive(channel1_));
988 EXPECT_TRUE(IsSrtpActive(channel2_));
Yves Gerey665174f2018-06-19 15:03:05 +0200989 SendCustomRtp1(kSsrc1, ++sequence_number1_1);
Yves Gerey665174f2018-06-19 15:03:05 +0200990 SendCustomRtp2(kSsrc2, ++sequence_number2_2);
991 WaitForThreads();
Yves Gerey665174f2018-06-19 15:03:05 +0200992 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
Yves Gerey665174f2018-06-19 15:03:05 +0200993 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 }
995
996 // Test that we properly send RTP without SRTP from a thread.
997 void SendRtpToRtpOnThread() {
deadbeefac22f702017-01-12 21:59:29 -0800998 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999 EXPECT_TRUE(SendInitiate());
1000 EXPECT_TRUE(SendAccept());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001001 ScopedCallThread send_rtp1([this] { SendRtp1(); });
1002 ScopedCallThread send_rtp2([this] { SendRtp2(); });
Bjorn A Mellemd0704ce2019-10-10 10:49:53 -07001003 rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001004 WaitForThreads(involved_threads);
1005 EXPECT_TRUE(CheckRtp1());
1006 EXPECT_TRUE(CheckRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 EXPECT_TRUE(CheckNoRtp1());
1008 EXPECT_TRUE(CheckNoRtp2());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 }
1010
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011 // Test that the mediachannel retains its sending state after the transport
1012 // becomes non-writable.
1013 void SendWithWritabilityLoss() {
Zhi Huange830e682018-03-30 10:48:35 -07001014 CreateChannels(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 EXPECT_TRUE(SendInitiate());
1016 EXPECT_TRUE(SendAccept());
Tomas Gunnarsson6cd50812021-04-06 11:26:47 +02001017 EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1018 EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001019 SendRtp1();
1020 SendRtp2();
1021 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(CheckRtp1());
1023 EXPECT_TRUE(CheckRtp2());
1024 EXPECT_TRUE(CheckNoRtp1());
1025 EXPECT_TRUE(CheckNoRtp2());
1026
wu@webrtc.org97077a32013-10-25 21:18:33 +00001027 // Lose writability, which should fail.
deadbeeff5346592017-01-24 21:51:21 -08001028 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1029 fake_rtp_dtls_transport1_->SetWritable(false);
1030 });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001031 SendRtp1();
1032 SendRtp2();
1033 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 EXPECT_TRUE(CheckRtp1());
1035 EXPECT_TRUE(CheckNoRtp2());
1036
1037 // Regain writability
deadbeeff5346592017-01-24 21:51:21 -08001038 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1039 fake_rtp_dtls_transport1_->SetWritable(true);
1040 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001042 SendRtp1();
1043 SendRtp2();
1044 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 EXPECT_TRUE(CheckRtp1());
1046 EXPECT_TRUE(CheckRtp2());
1047 EXPECT_TRUE(CheckNoRtp1());
1048 EXPECT_TRUE(CheckNoRtp2());
1049
1050 // Lose writability completely
deadbeeff5346592017-01-24 21:51:21 -08001051 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
1052 bool asymmetric = true;
1053 fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1054 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 EXPECT_TRUE(media_channel1_->sending());
1056
wu@webrtc.org97077a32013-10-25 21:18:33 +00001057 // Should fail also.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001058 SendRtp1();
1059 SendRtp2();
1060 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_TRUE(CheckRtp1());
1062 EXPECT_TRUE(CheckNoRtp2());
zhihuangb2cdd932017-01-19 16:54:25 -08001063 EXPECT_TRUE(CheckNoRtp1());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064
1065 // Gain writability back
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001066 network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
deadbeeff5346592017-01-24 21:51:21 -08001067 bool asymmetric = true;
1068 fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1069 asymmetric);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001070 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 EXPECT_TRUE(media_channel1_->sending());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001072 SendRtp1();
1073 SendRtp2();
1074 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 EXPECT_TRUE(CheckRtp1());
1076 EXPECT_TRUE(CheckRtp2());
1077 EXPECT_TRUE(CheckNoRtp1());
1078 EXPECT_TRUE(CheckNoRtp2());
1079 }
1080
Yves Gerey665174f2018-06-19 15:03:05 +02001081 void SendBundleToBundle(const int* pl_types,
1082 int len,
1083 bool rtcp_mux,
1084 bool secure) {
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001085 ASSERT_EQ(2, len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 int sequence_number1_1 = 0, sequence_number2_2 = 0;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001087 // Only pl_type1 was added to the bundle filter for both |channel1_|
1088 // and |channel2_|.
1089 int pl_type1 = pl_types[0];
1090 int pl_type2 = pl_types[1];
deadbeefac22f702017-01-12 21:59:29 -08001091 int flags = SSRC_MUX;
Zhi Huange830e682018-03-30 10:48:35 -07001092 if (secure)
1093 flags |= DTLS;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001094 if (rtcp_mux) {
1095 flags |= RTCP_MUX;
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001096 }
1097 CreateChannels(flags, flags);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_TRUE(SendInitiate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_TRUE(SendAccept());
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001100
1101 // Both channels can receive pl_type1 only.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001102 SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1103 SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1104 WaitForThreads();
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001105 EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001106 EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1107 EXPECT_TRUE(CheckNoRtp1());
1108 EXPECT_TRUE(CheckNoRtp2());
1109
Zhi Huang365381f2018-04-13 16:44:34 -07001110 SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1111 SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001112 WaitForThreads();
Zhi Huang365381f2018-04-13 16:44:34 -07001113 EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1114 EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 }
1116
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 void TestSetContentFailure() {
1118 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119
Peter Thatchera6d24442015-07-09 21:26:36 -07001120 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001121 std::unique_ptr<typename T::Content> content(
1122 CreateMediaContentWithStream(1));
1123
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 media_channel1_->set_fail_set_recv_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001125 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001126 channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001127 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001128 channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001131 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001132 channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
Steve Anton18ee1d52017-09-11 11:32:35 -07001133
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 media_channel1_->set_fail_set_send_codecs(true);
Steve Anton18ee1d52017-09-11 11:32:35 -07001135 EXPECT_FALSE(
Steve Anton3828c062017-12-06 10:34:51 -08001136 channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 }
1138
1139 void TestSendTwoOffers() {
1140 CreateChannels(0, 0);
1141
Peter Thatchera6d24442015-07-09 21:26:36 -07001142 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001143 std::unique_ptr<typename T::Content> content1(
1144 CreateMediaContentWithStream(1));
1145 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001146 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1148
Steve Anton18ee1d52017-09-11 11:32:35 -07001149 std::unique_ptr<typename T::Content> content2(
1150 CreateMediaContentWithStream(2));
1151 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001152 channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_FALSE(media_channel1_->HasSendStream(1));
1154 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1155 }
1156
1157 void TestReceiveTwoOffers() {
1158 CreateChannels(0, 0);
1159
Peter Thatchera6d24442015-07-09 21:26:36 -07001160 std::string err;
Steve Anton18ee1d52017-09-11 11:32:35 -07001161 std::unique_ptr<typename T::Content> content1(
1162 CreateMediaContentWithStream(1));
1163 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001164 channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1166
Steve Anton18ee1d52017-09-11 11:32:35 -07001167 std::unique_ptr<typename T::Content> content2(
1168 CreateMediaContentWithStream(2));
1169 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001170 channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 EXPECT_FALSE(media_channel1_->HasRecvStream(1));
1172 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1173 }
1174
1175 void TestSendPrAnswer() {
1176 CreateChannels(0, 0);
1177
Peter Thatchera6d24442015-07-09 21:26:36 -07001178 std::string err;
1179 // Receive 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_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1185
Peter Thatchera6d24442015-07-09 21:26:36 -07001186 // Send PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001187 std::unique_ptr<typename T::Content> content2(
1188 CreateMediaContentWithStream(2));
1189 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001190 channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1192 EXPECT_TRUE(media_channel1_->HasSendStream(2));
1193
Peter Thatchera6d24442015-07-09 21:26:36 -07001194 // Send 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_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 EXPECT_TRUE(media_channel1_->HasRecvStream(1));
1200 EXPECT_FALSE(media_channel1_->HasSendStream(2));
1201 EXPECT_TRUE(media_channel1_->HasSendStream(3));
1202 }
1203
1204 void TestReceivePrAnswer() {
1205 CreateChannels(0, 0);
1206
Peter Thatchera6d24442015-07-09 21:26:36 -07001207 std::string err;
1208 // Send offer
Steve Anton18ee1d52017-09-11 11:32:35 -07001209 std::unique_ptr<typename T::Content> content1(
1210 CreateMediaContentWithStream(1));
1211 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001212 channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1214
Peter Thatchera6d24442015-07-09 21:26:36 -07001215 // Receive PR answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001216 std::unique_ptr<typename T::Content> content2(
1217 CreateMediaContentWithStream(2));
Steve Anton3828c062017-12-06 10:34:51 -08001218 EXPECT_TRUE(
1219 channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1221 EXPECT_TRUE(media_channel1_->HasRecvStream(2));
1222
Peter Thatchera6d24442015-07-09 21:26:36 -07001223 // Receive answer
Steve Anton18ee1d52017-09-11 11:32:35 -07001224 std::unique_ptr<typename T::Content> content3(
1225 CreateMediaContentWithStream(3));
1226 EXPECT_TRUE(
Steve Anton3828c062017-12-06 10:34:51 -08001227 channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 EXPECT_TRUE(media_channel1_->HasSendStream(1));
1229 EXPECT_FALSE(media_channel1_->HasRecvStream(2));
1230 EXPECT_TRUE(media_channel1_->HasRecvStream(3));
1231 }
1232
zstein56162b92017-04-24 16:54:35 -07001233 void TestOnTransportReadyToSend() {
deadbeefac22f702017-01-12 21:59:29 -08001234 CreateChannels(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 EXPECT_FALSE(media_channel1_->ready_to_send());
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001236
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001237 network_thread_->PostTask(
1238 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001239 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 EXPECT_TRUE(media_channel1_->ready_to_send());
1241
Tomas Gunnarssonad325862021-02-03 16:23:40 +01001242 network_thread_->PostTask(
1243 RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001244 WaitForThreads();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245 EXPECT_FALSE(media_channel1_->ready_to_send());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001246 }
1247
skvladdc1c62c2016-03-16 19:07:43 -07001248 bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1249 typename T::Content content;
1250 CreateContent(0, kPcmuCodec, kH264Codec, &content);
1251 content.set_bandwidth(remote_limit);
Steve Anton3828c062017-12-06 10:34:51 -08001252 return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
skvladdc1c62c2016-03-16 19:07:43 -07001253 }
1254
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001255 webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
skvladdc1c62c2016-03-16 19:07:43 -07001256 webrtc::RtpParameters parameters;
1257 webrtc::RtpEncodingParameters encoding;
Mirko Bonadei05cf6be2019-01-31 21:38:12 +01001258 encoding.max_bitrate_bps = limit;
skvladdc1c62c2016-03-16 19:07:43 -07001259 parameters.encodings.push_back(encoding);
1260 return parameters;
1261 }
1262
1263 void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001264 absl::optional<int> expected_bitrate) {
skvladdc1c62c2016-03-16 19:07:43 -07001265 EXPECT_EQ(1UL, parameters.encodings.size());
1266 EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1267 }
1268
1269 void DefaultMaxBitrateIsUnlimited() {
1270 CreateChannels(0, 0);
Steve Anton3828c062017-12-06 10:34:51 -08001271 EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1272 SdpType::kOffer, NULL));
skvladdc1c62c2016-03-16 19:07:43 -07001273 EXPECT_EQ(media_channel1_->max_bps(), -1);
deadbeefe702b302017-02-04 12:09:01 -08001274 VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001275 absl::nullopt);
skvladdc1c62c2016-03-16 19:07:43 -07001276 }
1277
Zhi Huange830e682018-03-30 10:48:35 -07001278 // Test that when a channel gets new RtpTransport with a call to
1279 // |SetRtpTransport|, the socket options from the old RtpTransport is merged
1280 // with the options on the new one.
1281
Steve Anton8a63f782017-10-23 13:08:53 -07001282 // For example, audio and video may use separate socket options, but initially
1283 // be unbundled, then later become bundled. When this happens, their preferred
1284 // socket options should be merged to the underlying transport they share.
1285 void SocketOptionsMergedOnSetTransport() {
1286 constexpr int kSndBufSize = 4000;
1287 constexpr int kRcvBufSize = 8000;
1288
Zhi Huange830e682018-03-30 10:48:35 -07001289 CreateChannels(DTLS, DTLS);
Steve Anton8a63f782017-10-23 13:08:53 -07001290
1291 channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1292 rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1293 channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1294 rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1295
Zhi Huange830e682018-03-30 10:48:35 -07001296 new_rtp_transport_ = CreateDtlsSrtpTransport(
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -07001297 fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
Steve Anton8a63f782017-10-23 13:08:53 -07001298
Niels Möller92430882021-03-18 10:03:19 +01001299 bool rcv_success, send_success;
1300 int rcv_buf, send_buf;
1301 network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
Tomas Gunnarssond9a51b02021-04-02 17:42:02 +02001302 channel1_->SetRtpTransport(new_rtp_transport_.get());
Niels Möller92430882021-03-18 10:03:19 +01001303 send_success = fake_rtp_dtls_transport2_->GetOption(
1304 rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1305 rcv_success = fake_rtp_dtls_transport2_->GetOption(
1306 rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1307 });
1308
1309 ASSERT_TRUE(send_success);
1310 EXPECT_EQ(kSndBufSize, send_buf);
1311 ASSERT_TRUE(rcv_success);
1312 EXPECT_EQ(kRcvBufSize, rcv_buf);
Steve Anton8a63f782017-10-23 13:08:53 -07001313 }
1314
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001315 void CreateSimulcastContent(const std::vector<std::string>& rids,
1316 typename T::Content* content) {
1317 std::vector<RidDescription> rid_descriptions;
Courtney Edwards134c6992020-03-03 11:36:35 +01001318 for (const std::string& name : rids) {
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001319 rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1320 }
1321
1322 StreamParams stream;
1323 stream.set_rids(rid_descriptions);
1324 CreateContent(0, kPcmuCodec, kH264Codec, content);
1325 // This is for unified plan, so there can be only one StreamParams.
1326 content->mutable_streams().clear();
1327 content->AddStream(stream);
1328 }
1329
1330 void VerifySimulcastStreamParams(const StreamParams& expected,
1331 const typename T::Channel* channel) {
1332 const std::vector<StreamParams>& streams = channel->local_streams();
1333 ASSERT_EQ(1u, streams.size());
1334 const StreamParams& result = streams[0];
1335 EXPECT_EQ(expected.rids(), result.rids());
1336 EXPECT_TRUE(result.has_ssrcs());
1337 EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1338 std::vector<uint32_t> primary_ssrcs;
1339 result.GetPrimarySsrcs(&primary_ssrcs);
1340 EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1341 }
1342
1343 void TestUpdateLocalStreamsWithSimulcast() {
1344 CreateChannels(0, 0);
1345 typename T::Content content1, content2, content3;
1346 CreateSimulcastContent({"f", "h", "q"}, &content1);
1347 EXPECT_TRUE(
1348 channel1_->SetLocalContent(&content1, SdpType::kOffer, nullptr));
1349 VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1350 StreamParams stream1 = channel1_->local_streams()[0];
1351
1352 // Create a similar offer. SetLocalContent should not remove and add.
1353 CreateSimulcastContent({"f", "h", "q"}, &content2);
1354 EXPECT_TRUE(
1355 channel1_->SetLocalContent(&content2, SdpType::kOffer, nullptr));
1356 VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1357 StreamParams stream2 = channel1_->local_streams()[0];
1358 // Check that the streams are identical (SSRCs didn't change).
1359 EXPECT_EQ(stream1, stream2);
1360
1361 // Create third offer that has same RIDs in different order.
1362 CreateSimulcastContent({"f", "q", "h"}, &content3);
1363 EXPECT_TRUE(
1364 channel1_->SetLocalContent(&content3, SdpType::kOffer, nullptr));
1365 VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1366 }
1367
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368 protected:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001369 void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
1370 static void ProcessThreadQueue(rtc::Thread* thread) {
1371 RTC_DCHECK(thread->IsCurrent());
1372 while (!thread->empty()) {
1373 thread->ProcessMessages(0);
1374 }
1375 }
1376 void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1377 // |threads| and current thread post packets to network thread.
1378 for (rtc::Thread* thread : threads) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001379 thread->Invoke<void>(RTC_FROM_HERE,
1380 [thread] { ProcessThreadQueue(thread); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001381 }
1382 ProcessThreadQueue(rtc::Thread::Current());
1383 // Network thread move them around and post back to worker = current thread.
1384 if (!network_thread_->IsCurrent()) {
1385 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -07001386 RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001387 }
1388 // Worker thread = current Thread process received messages.
1389 ProcessThreadQueue(rtc::Thread::Current());
1390 }
Peter Boström34fbfff2015-09-24 19:20:30 +02001391 // TODO(pbos): Remove playout from all media channels and let renderers mute
1392 // themselves.
1393 const bool verify_playout_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001394 std::unique_ptr<rtc::Thread> network_thread_keeper_;
1395 rtc::Thread* network_thread_;
deadbeeff5346592017-01-24 21:51:21 -08001396 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1397 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1398 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1399 std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1400 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1401 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1402 std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1403 std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
Zhi Huange830e682018-03-30 10:48:35 -07001404 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1405 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1406 std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407 cricket::FakeMediaEngine media_engine_;
1408 // The media channels are owned by the voice channel objects below.
deadbeeff5346592017-01-24 21:51:21 -08001409 typename T::MediaChannel* media_channel1_ = nullptr;
1410 typename T::MediaChannel* media_channel2_ = nullptr;
kwiberg31022942016-03-11 14:18:21 -08001411 std::unique_ptr<typename T::Channel> channel1_;
1412 std::unique_ptr<typename T::Channel> channel2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 typename T::Content local_media_content1_;
1414 typename T::Content local_media_content2_;
1415 typename T::Content remote_media_content1_;
1416 typename T::Content remote_media_content2_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417 // The RTP and RTCP packets to send in the tests.
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001418 rtc::Buffer rtp_packet_;
1419 rtc::Buffer rtcp_packet_;
Honghai Zhangcc411c02016-03-29 17:27:21 -07001420 cricket::CandidatePairInterface* last_selected_candidate_pair_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001421 rtc::UniqueRandomIdGenerator ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422};
1423
Yves Gerey665174f2018-06-19 15:03:05 +02001424template <>
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001425std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1426 rtc::Thread* worker_thread,
1427 rtc::Thread* network_thread,
1428 std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1429 webrtc::RtpTransportInternal* rtp_transport,
1430 int flags) {
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001431 rtc::Thread* signaling_thread = rtc::Thread::Current();
1432 auto channel = std::make_unique<cricket::VoiceChannel>(
1433 worker_thread, network_thread, signaling_thread, std::move(ch),
1434 cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1435 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001436 channel->Init_w(rtp_transport);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +02001437 return channel;
1438}
1439
1440template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441void ChannelTest<VoiceTraits>::CreateContent(
1442 int flags,
1443 const cricket::AudioCodec& audio_codec,
1444 const cricket::VideoCodec& video_codec,
1445 cricket::AudioContentDescription* audio) {
1446 audio->AddCodec(audio_codec);
1447 audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001448}
1449
Yves Gerey665174f2018-06-19 15:03:05 +02001450template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451void ChannelTest<VoiceTraits>::CopyContent(
1452 const cricket::AudioContentDescription& source,
1453 cricket::AudioContentDescription* audio) {
1454 *audio = source;
1455}
1456
Yves Gerey665174f2018-06-19 15:03:05 +02001457template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1459 const cricket::AudioCodec& c2) {
1460 return c1.name == c2.name && c1.clockrate == c2.clockrate &&
Yves Gerey665174f2018-06-19 15:03:05 +02001461 c1.bitrate == c2.bitrate && c1.channels == c2.channels;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462}
1463
Peter Boström0c4e06b2015-10-07 12:23:21 +02001464template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001466 uint32_t ssrc,
1467 int flags,
1468 cricket::AudioContentDescription* audio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 audio->AddLegacyStream(ssrc);
1470}
1471
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001472class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001473 public:
solenberg1dd98f32015-09-10 01:57:14 -07001474 typedef ChannelTest<VoiceTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001475 VoiceChannelSingleThreadTest()
1476 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1477};
1478
1479class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1480 public:
1481 typedef ChannelTest<VoiceTraits> Base;
1482 VoiceChannelDoubleThreadTest()
1483 : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484};
1485
jbauch5869f502017-06-29 12:31:36 -07001486class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001487 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001488 public:
1489 typedef ChannelTest<VoiceTraits> Base;
1490 VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001491 : Base(true,
1492 kPcmuFrameWithExtensions,
1493 kRtcpReport,
1494 NetworkIsWorker::Yes) {}
jbauch5869f502017-06-29 12:31:36 -07001495};
1496
1497class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
Yves Gerey665174f2018-06-19 15:03:05 +02001498 : public ChannelTest<VoiceTraits> {
jbauch5869f502017-06-29 12:31:36 -07001499 public:
1500 typedef ChannelTest<VoiceTraits> Base;
1501 VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
Yves Gerey665174f2018-06-19 15:03:05 +02001502 : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1503 }
jbauch5869f502017-06-29 12:31:36 -07001504};
1505
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001506// override to add NULL parameter
deadbeefcbecd352015-09-23 11:50:27 -07001507template <>
Steve Anton8699a322017-11-06 15:53:33 -08001508std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001509 rtc::Thread* worker_thread,
1510 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08001511 std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07001512 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07001513 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08001514 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001515 auto channel = std::make_unique<cricket::VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08001516 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001517 cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1518 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02001519 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520 return channel;
1521}
1522
Yves Gerey665174f2018-06-19 15:03:05 +02001523template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524void ChannelTest<VideoTraits>::CreateContent(
1525 int flags,
1526 const cricket::AudioCodec& audio_codec,
1527 const cricket::VideoCodec& video_codec,
1528 cricket::VideoContentDescription* video) {
1529 video->AddCodec(video_codec);
1530 video->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531}
1532
Yves Gerey665174f2018-06-19 15:03:05 +02001533template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534void ChannelTest<VideoTraits>::CopyContent(
1535 const cricket::VideoContentDescription& source,
1536 cricket::VideoContentDescription* video) {
1537 *video = source;
1538}
1539
Yves Gerey665174f2018-06-19 15:03:05 +02001540template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1542 const cricket::VideoCodec& c2) {
perkj26752742016-10-24 01:21:16 -07001543 return c1.name == c2.name;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544}
1545
Peter Boström0c4e06b2015-10-07 12:23:21 +02001546template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02001548 uint32_t ssrc,
1549 int flags,
1550 cricket::VideoContentDescription* video) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 video->AddLegacyStream(ssrc);
1552}
1553
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001554class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 public:
solenberg1dd98f32015-09-10 01:57:14 -07001556 typedef ChannelTest<VideoTraits> Base;
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001557 VideoChannelSingleThreadTest()
1558 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559};
1560
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001561class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1562 public:
1563 typedef ChannelTest<VideoTraits> Base;
1564 VideoChannelDoubleThreadTest()
1565 : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1566};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567
Kári Tristan Helgason8b35df72017-09-25 14:46:43 +02001568TEST_F(VoiceChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 Base::TestInit();
1570 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1571 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
1572}
1573
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001574TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1575 Base::TestDeinit();
1576}
1577
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001578TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 Base::TestSetContents();
1580}
1581
Johannes Kron9190b822018-10-29 11:22:05 +01001582TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1583 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1584}
1585
1586TEST_F(VoiceChannelSingleThreadTest,
1587 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1588 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1589}
1590
1591TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1592 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1593}
1594
1595TEST_F(VoiceChannelSingleThreadTest,
1596 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1597 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1598}
1599
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001600TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601 Base::TestSetContentsNullOffer();
1602}
1603
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001604TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 Base::TestSetContentsRtcpMux();
1606}
1607
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001608TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001609 Base::TestSetContentsRtcpMux();
1610}
1611
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001612TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613 Base::TestChangeStreamParamsInContent();
1614}
1615
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001616TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001617 Base::TestPlayoutAndSendingStates();
1618}
1619
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001620TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 Base::TestMediaContentDirection();
1622}
1623
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001624TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001625 Base::TestNetworkRouteChanges();
1626}
1627
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001628TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629 Base::TestCallSetup();
1630}
1631
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001632TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 Base::TestCallTeardownRtcpMux();
1634}
1635
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001636TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001637 Base::SendRtpToRtp();
1638}
1639
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001640TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001641 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001642}
1643
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001644TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001645 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001646}
1647
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001648TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1650}
1651
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001652TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653 Base::SendRtpToRtpOnThread();
1654}
1655
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001656TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 Base::SendWithWritabilityLoss();
1658}
1659
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001660TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 Base::TestSetContentFailure();
1662}
1663
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001664TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 Base::TestSendTwoOffers();
1666}
1667
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001668TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 Base::TestReceiveTwoOffers();
1670}
1671
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001672TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001673 Base::TestSendPrAnswer();
1674}
1675
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001676TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 Base::TestReceivePrAnswer();
1678}
1679
zstein56162b92017-04-24 16:54:35 -07001680TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1681 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682}
1683
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001684TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001685 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686}
1687
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001688TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001689 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001690}
1691
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001692TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001693 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001694}
1695
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001696TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001697 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698}
1699
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001700TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvlade0d46372016-04-07 22:59:22 -07001701 Base::DefaultMaxBitrateIsUnlimited();
skvladdc1c62c2016-03-16 19:07:43 -07001702}
1703
Steve Anton8a63f782017-10-23 13:08:53 -07001704TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1705 Base::SocketOptionsMergedOnSetTransport();
1706}
1707
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001708// VoiceChannelDoubleThreadTest
1709TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 Base::TestInit();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001711 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
1712 EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713}
1714
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001715TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1716 Base::TestDeinit();
1717}
1718
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001719TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 Base::TestSetContents();
1721}
1722
Johannes Kron9190b822018-10-29 11:22:05 +01001723TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1724 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1725}
1726
1727TEST_F(VoiceChannelDoubleThreadTest,
1728 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1729 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1730}
1731
1732TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1733 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1734}
1735
1736TEST_F(VoiceChannelDoubleThreadTest,
1737 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1738 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1739}
1740
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001741TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 Base::TestSetContentsNullOffer();
1743}
1744
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001745TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 Base::TestSetContentsRtcpMux();
1747}
1748
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001749TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 Base::TestSetContentsRtcpMux();
1751}
1752
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001753TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 Base::TestChangeStreamParamsInContent();
1755}
1756
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001757TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 Base::TestPlayoutAndSendingStates();
1759}
1760
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001761TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1762 Base::TestMediaContentDirection();
1763}
1764
1765TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1766 Base::TestNetworkRouteChanges();
1767}
1768
1769TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1770 Base::TestCallSetup();
1771}
1772
1773TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
1774 Base::TestCallTeardownRtcpMux();
1775}
1776
1777TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1778 Base::SendRtpToRtp();
1779}
1780
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001781TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001782 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001783}
1784
1785TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001786 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
deadbeeff5346592017-01-24 21:51:21 -08001787}
1788
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001789TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1790 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1791}
1792
1793TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1794 Base::SendRtpToRtpOnThread();
1795}
1796
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001797TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1798 Base::SendWithWritabilityLoss();
1799}
1800
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001801TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1802 Base::TestSetContentFailure();
1803}
1804
1805TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1806 Base::TestSendTwoOffers();
1807}
1808
1809TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1810 Base::TestReceiveTwoOffers();
1811}
1812
1813TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1814 Base::TestSendPrAnswer();
1815}
1816
1817TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1818 Base::TestReceivePrAnswer();
1819}
1820
zstein56162b92017-04-24 16:54:35 -07001821TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1822 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001823}
1824
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001825TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1826 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1827}
1828
1829TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1830 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1831}
1832
1833TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1834 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1835}
1836
1837TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1838 Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1839}
1840
1841TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1842 Base::DefaultMaxBitrateIsUnlimited();
1843}
1844
Steve Anton8a63f782017-10-23 13:08:53 -07001845TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1846 Base::SocketOptionsMergedOnSetTransport();
1847}
1848
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001849// VideoChannelSingleThreadTest
1850TEST_F(VideoChannelSingleThreadTest, TestInit) {
1851 Base::TestInit();
1852}
1853
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02001854TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1855 Base::TestDeinit();
1856}
1857
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001858TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1859 Base::TestSetContents();
1860}
1861
Johannes Kron9190b822018-10-29 11:22:05 +01001862TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1863 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1864}
1865
1866TEST_F(VideoChannelSingleThreadTest,
1867 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1868 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1869}
1870
1871TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1872 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1873}
1874
1875TEST_F(VideoChannelSingleThreadTest,
1876 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1877 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1878}
1879
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001880TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1881 Base::TestSetContentsNullOffer();
1882}
1883
1884TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1885 Base::TestSetContentsRtcpMux();
1886}
1887
1888TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1889 Base::TestSetContentsRtcpMux();
1890}
1891
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001892TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1893 Base::TestChangeStreamParamsInContent();
1894}
1895
1896TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1897 Base::TestPlayoutAndSendingStates();
1898}
1899
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001900TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001901 Base::TestMediaContentDirection();
1902}
1903
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001904TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
Honghai Zhangcc411c02016-03-29 17:27:21 -07001905 Base::TestNetworkRouteChanges();
1906}
1907
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001908TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 Base::TestCallSetup();
1910}
1911
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001912TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913 Base::TestCallTeardownRtcpMux();
1914}
1915
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001916TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 Base::SendRtpToRtp();
1918}
1919
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001920TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07001921 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922}
1923
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001924TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07001925 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926}
1927
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001928TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 Base::SendEarlyMediaUsingRtcpMuxSrtp();
1930}
1931
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001932TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001933 Base::SendRtpToRtpOnThread();
1934}
1935
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001936TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937 Base::SendWithWritabilityLoss();
1938}
1939
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001940TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 Base::TestSetContentFailure();
1942}
1943
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001944TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 Base::TestSendTwoOffers();
1946}
1947
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001948TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 Base::TestReceiveTwoOffers();
1950}
1951
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001952TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953 Base::TestSendPrAnswer();
1954}
1955
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001956TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 Base::TestReceivePrAnswer();
1958}
1959
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001960TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
tfarina5237aaf2015-11-10 23:44:30 -08001961 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962}
1963
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001964TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001965 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001966}
1967
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001968TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
tfarina5237aaf2015-11-10 23:44:30 -08001969 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
buildbot@webrtc.org5ee0f052014-05-05 20:18:08 +00001970}
1971
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001972TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
tfarina5237aaf2015-11-10 23:44:30 -08001973 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974}
1975
zstein56162b92017-04-24 16:54:35 -07001976TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1977 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978}
1979
Danil Chapovalov33b01f22016-05-11 19:55:27 +02001980TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
skvladdc1c62c2016-03-16 19:07:43 -07001981 Base::DefaultMaxBitrateIsUnlimited();
1982}
1983
Steve Anton8a63f782017-10-23 13:08:53 -07001984TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1985 Base::SocketOptionsMergedOnSetTransport();
1986}
1987
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08001988TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
1989 Base::TestUpdateLocalStreamsWithSimulcast();
1990}
1991
Mirta Dvornicic479a3c02019-06-04 15:38:50 +02001992TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
1993 const cricket::VideoCodec kVp8Codec(97, "VP8");
1994 cricket::VideoCodec vp9_codec(98, "VP9");
1995 vp9_codec.packetization = cricket::kPacketizationParamRaw;
1996 cricket::VideoContentDescription video;
1997 video.set_codecs({kVp8Codec, vp9_codec});
1998
1999 CreateChannels(0, 0);
2000
2001 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2002 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2003 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2004 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2005 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2006 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2007 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2008 cricket::kPacketizationParamRaw);
2009}
2010
2011TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2012 const cricket::VideoCodec kVp8Codec(97, "VP8");
2013 cricket::VideoCodec vp9_codec(98, "VP9");
2014 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2015 cricket::VideoContentDescription video;
2016 video.set_codecs({kVp8Codec, vp9_codec});
2017
2018 CreateChannels(0, 0);
2019
2020 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
2021 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2022 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2023 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2024 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2025 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2026 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2027 cricket::kPacketizationParamRaw);
2028}
2029
2030TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2031 const cricket::VideoCodec kVp8Codec(97, "VP8");
2032 cricket::VideoCodec vp9_codec(98, "VP9");
2033 vp9_codec.packetization = cricket::kPacketizationParamRaw;
2034 cricket::VideoContentDescription video;
2035 video.set_codecs({kVp8Codec, vp9_codec});
2036
2037 CreateChannels(0, 0);
2038
2039 EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
2040 EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
2041 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
2042 EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
2043 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2044 EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
2045 EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
2046 cricket::kPacketizationParamRaw);
2047 EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
2048 EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
2049 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2050 EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
2051 EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
2052 cricket::kPacketizationParamRaw);
2053}
2054
2055TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2056 const cricket::VideoCodec kLocalCodec(98, "VP8");
2057 cricket::VideoCodec remote_codec(99, "VP8");
2058 remote_codec.packetization = cricket::kPacketizationParamRaw;
2059 cricket::VideoContentDescription local_video;
2060 local_video.set_codecs({kLocalCodec});
2061 cricket::VideoContentDescription remote_video;
2062 remote_video.set_codecs({remote_codec});
2063
2064 CreateChannels(0, 0);
2065
2066 EXPECT_TRUE(
2067 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2068 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2069 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2070 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2071 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2072 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2073}
2074
2075TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2076 cricket::VideoCodec local_codec(98, "VP8");
2077 local_codec.packetization = cricket::kPacketizationParamRaw;
2078 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2079 cricket::VideoContentDescription local_video;
2080 local_video.set_codecs({local_codec});
2081 cricket::VideoContentDescription remote_video;
2082 remote_video.set_codecs({kRemoteCodec});
2083
2084 CreateChannels(0, 0);
2085
2086 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2087 EXPECT_TRUE(
2088 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2089 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2090 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
2091 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2092 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2093}
2094
2095TEST_F(VideoChannelSingleThreadTest,
2096 TestSetRemoteAnswerWithInvalidPacketization) {
2097 cricket::VideoCodec local_codec(98, "VP8");
2098 local_codec.packetization = cricket::kPacketizationParamRaw;
2099 cricket::VideoCodec remote_codec(99, "VP8");
2100 remote_codec.packetization = "unknownpacketizationattributevalue";
2101 cricket::VideoContentDescription local_video;
2102 local_video.set_codecs({local_codec});
2103 cricket::VideoContentDescription remote_video;
2104 remote_video.set_codecs({remote_codec});
2105
2106 CreateChannels(0, 0);
2107
2108 EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
2109 EXPECT_FALSE(
2110 channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
2111 ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
2112 EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
2113 cricket::kPacketizationParamRaw);
2114 EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
2115}
2116
2117TEST_F(VideoChannelSingleThreadTest,
2118 TestSetLocalAnswerWithInvalidPacketization) {
2119 cricket::VideoCodec local_codec(98, "VP8");
2120 local_codec.packetization = cricket::kPacketizationParamRaw;
2121 const cricket::VideoCodec kRemoteCodec(99, "VP8");
2122 cricket::VideoContentDescription local_video;
2123 local_video.set_codecs({local_codec});
2124 cricket::VideoContentDescription remote_video;
2125 remote_video.set_codecs({kRemoteCodec});
2126
2127 CreateChannels(0, 0);
2128
2129 EXPECT_TRUE(
2130 channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
2131 EXPECT_FALSE(
2132 channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
2133 EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
2134 ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
2135 EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
2136}
2137
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002138// VideoChannelDoubleThreadTest
2139TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2140 Base::TestInit();
2141}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002143TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2144 Base::TestDeinit();
2145}
2146
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002147TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2148 Base::TestSetContents();
2149}
2150
Johannes Kron9190b822018-10-29 11:22:05 +01002151TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2152 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2153}
2154
2155TEST_F(VideoChannelDoubleThreadTest,
2156 TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2157 Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2158}
2159
2160TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2161 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2162}
2163
2164TEST_F(VideoChannelDoubleThreadTest,
2165 TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2166 Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2167}
2168
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002169TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2170 Base::TestSetContentsNullOffer();
2171}
2172
2173TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2174 Base::TestSetContentsRtcpMux();
2175}
2176
2177TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2178 Base::TestSetContentsRtcpMux();
2179}
2180
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002181TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2182 Base::TestChangeStreamParamsInContent();
2183}
2184
2185TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2186 Base::TestPlayoutAndSendingStates();
2187}
2188
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002189TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2190 Base::TestMediaContentDirection();
2191}
2192
2193TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2194 Base::TestNetworkRouteChanges();
2195}
2196
2197TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2198 Base::TestCallSetup();
2199}
2200
2201TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
2202 Base::TestCallTeardownRtcpMux();
2203}
2204
2205TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2206 Base::SendRtpToRtp();
2207}
2208
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002209TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
Zhi Huange830e682018-03-30 10:48:35 -07002210 Base::SendDtlsSrtpToDtlsSrtp(0, 0);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002211}
2212
2213TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
Zhi Huange830e682018-03-30 10:48:35 -07002214 Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002215}
2216
2217TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2218 Base::SendEarlyMediaUsingRtcpMuxSrtp();
2219}
2220
2221TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2222 Base::SendRtpToRtpOnThread();
2223}
2224
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002225TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2226 Base::SendWithWritabilityLoss();
2227}
2228
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002229TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2230 Base::TestSetContentFailure();
2231}
2232
2233TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2234 Base::TestSendTwoOffers();
2235}
2236
2237TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2238 Base::TestReceiveTwoOffers();
2239}
2240
2241TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2242 Base::TestSendPrAnswer();
2243}
2244
2245TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2246 Base::TestReceivePrAnswer();
2247}
2248
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002249TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2250 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2251}
2252
2253TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2254 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2255}
2256
2257TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2258 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2259}
2260
2261TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2262 Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2263}
2264
zstein56162b92017-04-24 16:54:35 -07002265TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2266 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002267}
2268
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002269TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2270 Base::DefaultMaxBitrateIsUnlimited();
2271}
2272
Steve Anton8a63f782017-10-23 13:08:53 -07002273TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2274 Base::SocketOptionsMergedOnSetTransport();
2275}
2276
deadbeef953c2ce2017-01-09 14:53:41 -08002277// RtpDataChannelSingleThreadTest
2278class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002280 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002281 RtpDataChannelSingleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002282 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
2283};
2284
deadbeef953c2ce2017-01-09 14:53:41 -08002285// RtpDataChannelDoubleThreadTest
2286class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002287 public:
2288 typedef ChannelTest<DataTraits> Base;
deadbeef953c2ce2017-01-09 14:53:41 -08002289 RtpDataChannelDoubleThreadTest()
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002290 : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291};
2292
2293// Override to avoid engine channel parameter.
deadbeefcbecd352015-09-23 11:50:27 -07002294template <>
Steve Anton8699a322017-11-06 15:53:33 -08002295std::unique_ptr<cricket::RtpDataChannel> ChannelTest<DataTraits>::CreateChannel(
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002296 rtc::Thread* worker_thread,
2297 rtc::Thread* network_thread,
Steve Anton8699a322017-11-06 15:53:33 -08002298 std::unique_ptr<cricket::FakeDataMediaChannel> ch,
Zhi Huange830e682018-03-30 10:48:35 -07002299 webrtc::RtpTransportInternal* rtp_transport,
jbauchcb560652016-08-04 05:20:32 -07002300 int flags) {
deadbeeff5346592017-01-24 21:51:21 -08002301 rtc::Thread* signaling_thread = rtc::Thread::Current();
Mirko Bonadei317a1f02019-09-17 17:06:18 +02002302 auto channel = std::make_unique<cricket::RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -08002303 worker_thread, network_thread, signaling_thread, std::move(ch),
Amit Hilbuchbcd39d42019-01-25 17:13:56 -08002304 cricket::CN_DATA, (flags & DTLS) != 0, webrtc::CryptoOptions(),
2305 &ssrc_generator_);
Niels Möller2a707032020-06-16 16:39:13 +02002306 channel->Init_w(rtp_transport);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307 return channel;
2308}
2309
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002310template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311void ChannelTest<DataTraits>::CreateContent(
2312 int flags,
2313 const cricket::AudioCodec& audio_codec,
2314 const cricket::VideoCodec& video_codec,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002315 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 data->AddCodec(kGoogleDataCodec);
2317 data->set_rtcp_mux((flags & RTCP_MUX) != 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318}
2319
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002320template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321void ChannelTest<DataTraits>::CopyContent(
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002322 const cricket::RtpDataContentDescription& source,
2323 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324 *data = source;
2325}
2326
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002327template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002328bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
2329 const cricket::DataCodec& c2) {
2330 return c1.name == c2.name;
2331}
2332
Peter Boström0c4e06b2015-10-07 12:23:21 +02002333template <>
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334void ChannelTest<DataTraits>::AddLegacyStreamInContent(
Peter Boström0c4e06b2015-10-07 12:23:21 +02002335 uint32_t ssrc,
2336 int flags,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +02002337 cricket::RtpDataContentDescription* data) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 data->AddLegacyStream(ssrc);
2339}
2340
deadbeef953c2ce2017-01-09 14:53:41 -08002341TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342 Base::TestInit();
2343 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2344}
2345
deadbeef953c2ce2017-01-09 14:53:41 -08002346TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002347 Base::TestDeinit();
2348}
2349
deadbeef953c2ce2017-01-09 14:53:41 -08002350TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 Base::TestSetContents();
2352}
2353
deadbeef953c2ce2017-01-09 14:53:41 -08002354TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 Base::TestSetContentsNullOffer();
2356}
2357
deadbeef953c2ce2017-01-09 14:53:41 -08002358TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 Base::TestSetContentsRtcpMux();
2360}
2361
deadbeef953c2ce2017-01-09 14:53:41 -08002362TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 Base::TestChangeStreamParamsInContent();
2364}
2365
deadbeef953c2ce2017-01-09 14:53:41 -08002366TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 Base::TestPlayoutAndSendingStates();
2368}
2369
deadbeef953c2ce2017-01-09 14:53:41 -08002370TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 Base::TestMediaContentDirection();
2372}
2373
deadbeef953c2ce2017-01-09 14:53:41 -08002374TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 Base::TestCallSetup();
2376}
2377
deadbeef953c2ce2017-01-09 14:53:41 -08002378TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379 Base::TestCallTeardownRtcpMux();
2380}
2381
zstein56162b92017-04-24 16:54:35 -07002382TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
2383 Base::TestOnTransportReadyToSend();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384}
2385
deadbeef953c2ce2017-01-09 14:53:41 -08002386TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 Base::SendRtpToRtp();
2388}
2389
deadbeef953c2ce2017-01-09 14:53:41 -08002390TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 Base::SendRtpToRtpOnThread();
2392}
2393
deadbeef953c2ce2017-01-09 14:53:41 -08002394TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 Base::SendWithWritabilityLoss();
2396}
2397
Steve Anton8a63f782017-10-23 13:08:53 -07002398TEST_F(RtpDataChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2399 Base::SocketOptionsMergedOnSetTransport();
2400}
2401
deadbeef953c2ce2017-01-09 14:53:41 -08002402TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002403 CreateChannels(0, 0);
2404 EXPECT_TRUE(SendInitiate());
2405 EXPECT_TRUE(SendAccept());
2406
2407 cricket::SendDataParams params;
2408 params.ssrc = 42;
2409 unsigned char data[] = {'f', 'o', 'o'};
2410 rtc::CopyOnWriteBuffer payload(data, 3);
2411 cricket::SendDataResult result;
2412 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
2413 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
2414 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2415}
2416
deadbeef953c2ce2017-01-09 14:53:41 -08002417TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002418 Base::TestInit();
2419 EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
2420}
2421
deadbeef953c2ce2017-01-09 14:53:41 -08002422TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
Danil Chapovalovdae07ba2016-05-14 01:43:50 +02002423 Base::TestDeinit();
2424}
2425
deadbeef953c2ce2017-01-09 14:53:41 -08002426TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002427 Base::TestSetContents();
2428}
2429
deadbeef953c2ce2017-01-09 14:53:41 -08002430TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002431 Base::TestSetContentsNullOffer();
2432}
2433
deadbeef953c2ce2017-01-09 14:53:41 -08002434TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002435 Base::TestSetContentsRtcpMux();
2436}
2437
deadbeef953c2ce2017-01-09 14:53:41 -08002438TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002439 Base::TestChangeStreamParamsInContent();
2440}
2441
deadbeef953c2ce2017-01-09 14:53:41 -08002442TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002443 Base::TestPlayoutAndSendingStates();
2444}
2445
deadbeef953c2ce2017-01-09 14:53:41 -08002446TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002447 Base::TestMediaContentDirection();
2448}
2449
deadbeef953c2ce2017-01-09 14:53:41 -08002450TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002451 Base::TestCallSetup();
2452}
2453
deadbeef953c2ce2017-01-09 14:53:41 -08002454TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002455 Base::TestCallTeardownRtcpMux();
2456}
2457
zstein56162b92017-04-24 16:54:35 -07002458TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2459 Base::TestOnTransportReadyToSend();
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002460}
2461
deadbeef953c2ce2017-01-09 14:53:41 -08002462TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002463 Base::SendRtpToRtp();
2464}
2465
deadbeef953c2ce2017-01-09 14:53:41 -08002466TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002467 Base::SendRtpToRtpOnThread();
2468}
2469
deadbeef953c2ce2017-01-09 14:53:41 -08002470TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +02002471 Base::SendWithWritabilityLoss();
2472}
2473
Steve Anton8a63f782017-10-23 13:08:53 -07002474TEST_F(RtpDataChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2475 Base::SocketOptionsMergedOnSetTransport();
2476}
2477
deadbeef953c2ce2017-01-09 14:53:41 -08002478TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 CreateChannels(0, 0);
2480 EXPECT_TRUE(SendInitiate());
2481 EXPECT_TRUE(SendAccept());
2482
2483 cricket::SendDataParams params;
2484 params.ssrc = 42;
Yves Gerey665174f2018-06-19 15:03:05 +02002485 unsigned char data[] = {'f', 'o', 'o'};
jbaucheec21bd2016-03-20 06:15:43 -07002486 rtc::CopyOnWriteBuffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487 cricket::SendDataResult result;
2488 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
Yves Gerey665174f2018-06-19 15:03:05 +02002489 EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002490 EXPECT_EQ("foo", media_channel1_->last_sent_data());
2491}
2492
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493// TODO(pthatcher): TestSetReceiver?