1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2009 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "pc/channel.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker #include <type_traits>
18*d9f75844SAndroid Build Coastguard Worker
19*d9f75844SAndroid Build Coastguard Worker #include "absl/functional/any_invocable.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/audio_options.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h"
24*d9f75844SAndroid Build Coastguard Worker #include "media/base/codec.h"
25*d9f75844SAndroid Build Coastguard Worker #include "media/base/fake_media_engine.h"
26*d9f75844SAndroid Build Coastguard Worker #include "media/base/fake_rtp.h"
27*d9f75844SAndroid Build Coastguard Worker #include "media/base/media_channel.h"
28*d9f75844SAndroid Build Coastguard Worker #include "media/base/media_constants.h"
29*d9f75844SAndroid Build Coastguard Worker #include "media/base/rid_description.h"
30*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/candidate_pair_interface.h"
31*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/dtls_transport_internal.h"
32*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/fake_dtls_transport.h"
33*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/fake_packet_transport.h"
34*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/ice_transport_internal.h"
35*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/p2p_constants.h"
36*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/packet_transport_internal.h"
37*d9f75844SAndroid Build Coastguard Worker #include "pc/dtls_srtp_transport.h"
38*d9f75844SAndroid Build Coastguard Worker #include "pc/jsep_transport.h"
39*d9f75844SAndroid Build Coastguard Worker #include "pc/rtp_transport.h"
40*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/arraysize.h"
41*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
42*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/byte_order.h"
43*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
44*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/rtc_certificate.h"
45*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_identity.h"
46*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue_for_test.h"
47*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
48*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
49*d9f75844SAndroid Build Coastguard Worker #include "test/scoped_key_value_config.h"
50*d9f75844SAndroid Build Coastguard Worker
51*d9f75844SAndroid Build Coastguard Worker using cricket::DtlsTransportInternal;
52*d9f75844SAndroid Build Coastguard Worker using cricket::FakeVoiceMediaChannel;
53*d9f75844SAndroid Build Coastguard Worker using cricket::RidDescription;
54*d9f75844SAndroid Build Coastguard Worker using cricket::RidDirection;
55*d9f75844SAndroid Build Coastguard Worker using cricket::StreamParams;
56*d9f75844SAndroid Build Coastguard Worker using webrtc::RtpTransceiverDirection;
57*d9f75844SAndroid Build Coastguard Worker using webrtc::SdpType;
58*d9f75844SAndroid Build Coastguard Worker
59*d9f75844SAndroid Build Coastguard Worker namespace {
60*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
61*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
62*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
63*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kH264Codec(97, "H264");
64*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
65*d9f75844SAndroid Build Coastguard Worker const uint32_t kSsrc1 = 0x1111;
66*d9f75844SAndroid Build Coastguard Worker const uint32_t kSsrc2 = 0x2222;
67*d9f75844SAndroid Build Coastguard Worker const uint32_t kSsrc3 = 0x3333;
68*d9f75844SAndroid Build Coastguard Worker const uint32_t kSsrc4 = 0x4444;
69*d9f75844SAndroid Build Coastguard Worker const int kAudioPts[] = {0, 8};
70*d9f75844SAndroid Build Coastguard Worker const int kVideoPts[] = {97, 99};
71*d9f75844SAndroid Build Coastguard Worker enum class NetworkIsWorker { Yes, No };
72*d9f75844SAndroid Build Coastguard Worker
73*d9f75844SAndroid Build Coastguard Worker } // namespace
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Worker template <class ChannelT,
76*d9f75844SAndroid Build Coastguard Worker class MediaChannelT,
77*d9f75844SAndroid Build Coastguard Worker class ContentT,
78*d9f75844SAndroid Build Coastguard Worker class CodecT,
79*d9f75844SAndroid Build Coastguard Worker class MediaInfoT,
80*d9f75844SAndroid Build Coastguard Worker class OptionsT>
81*d9f75844SAndroid Build Coastguard Worker class Traits {
82*d9f75844SAndroid Build Coastguard Worker public:
83*d9f75844SAndroid Build Coastguard Worker typedef ChannelT Channel;
84*d9f75844SAndroid Build Coastguard Worker typedef MediaChannelT MediaChannel;
85*d9f75844SAndroid Build Coastguard Worker typedef ContentT Content;
86*d9f75844SAndroid Build Coastguard Worker typedef CodecT Codec;
87*d9f75844SAndroid Build Coastguard Worker typedef MediaInfoT MediaInfo;
88*d9f75844SAndroid Build Coastguard Worker typedef OptionsT Options;
89*d9f75844SAndroid Build Coastguard Worker };
90*d9f75844SAndroid Build Coastguard Worker
91*d9f75844SAndroid Build Coastguard Worker class VoiceTraits : public Traits<cricket::VoiceChannel,
92*d9f75844SAndroid Build Coastguard Worker cricket::FakeVoiceMediaChannel,
93*d9f75844SAndroid Build Coastguard Worker cricket::AudioContentDescription,
94*d9f75844SAndroid Build Coastguard Worker cricket::AudioCodec,
95*d9f75844SAndroid Build Coastguard Worker cricket::VoiceMediaInfo,
96*d9f75844SAndroid Build Coastguard Worker cricket::AudioOptions> {};
97*d9f75844SAndroid Build Coastguard Worker
98*d9f75844SAndroid Build Coastguard Worker class VideoTraits : public Traits<cricket::VideoChannel,
99*d9f75844SAndroid Build Coastguard Worker cricket::FakeVideoMediaChannel,
100*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription,
101*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec,
102*d9f75844SAndroid Build Coastguard Worker cricket::VideoMediaInfo,
103*d9f75844SAndroid Build Coastguard Worker cricket::VideoOptions> {};
104*d9f75844SAndroid Build Coastguard Worker
105*d9f75844SAndroid Build Coastguard Worker // Base class for Voice/Video tests
106*d9f75844SAndroid Build Coastguard Worker template <class T>
107*d9f75844SAndroid Build Coastguard Worker class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
108*d9f75844SAndroid Build Coastguard Worker public:
109*d9f75844SAndroid Build Coastguard Worker enum Flags {
110*d9f75844SAndroid Build Coastguard Worker RTCP_MUX = 0x1,
111*d9f75844SAndroid Build Coastguard Worker SSRC_MUX = 0x8,
112*d9f75844SAndroid Build Coastguard Worker DTLS = 0x10,
113*d9f75844SAndroid Build Coastguard Worker // Use BaseChannel with PacketTransportInternal rather than
114*d9f75844SAndroid Build Coastguard Worker // DtlsTransportInternal.
115*d9f75844SAndroid Build Coastguard Worker RAW_PACKET_TRANSPORT = 0x20,
116*d9f75844SAndroid Build Coastguard Worker };
117*d9f75844SAndroid Build Coastguard Worker
ChannelTest(bool verify_playout,rtc::ArrayView<const uint8_t> rtp_data,rtc::ArrayView<const uint8_t> rtcp_data,NetworkIsWorker network_is_worker)118*d9f75844SAndroid Build Coastguard Worker ChannelTest(bool verify_playout,
119*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<const uint8_t> rtp_data,
120*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<const uint8_t> rtcp_data,
121*d9f75844SAndroid Build Coastguard Worker NetworkIsWorker network_is_worker)
122*d9f75844SAndroid Build Coastguard Worker : verify_playout_(verify_playout),
123*d9f75844SAndroid Build Coastguard Worker rtp_packet_(rtp_data.data(), rtp_data.size()),
124*d9f75844SAndroid Build Coastguard Worker rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
125*d9f75844SAndroid Build Coastguard Worker if (network_is_worker == NetworkIsWorker::Yes) {
126*d9f75844SAndroid Build Coastguard Worker network_thread_ = rtc::Thread::Current();
127*d9f75844SAndroid Build Coastguard Worker } else {
128*d9f75844SAndroid Build Coastguard Worker network_thread_keeper_ = rtc::Thread::Create();
129*d9f75844SAndroid Build Coastguard Worker network_thread_keeper_->SetName("Network", nullptr);
130*d9f75844SAndroid Build Coastguard Worker network_thread_ = network_thread_keeper_.get();
131*d9f75844SAndroid Build Coastguard Worker }
132*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(network_thread_);
133*d9f75844SAndroid Build Coastguard Worker }
134*d9f75844SAndroid Build Coastguard Worker
~ChannelTest()135*d9f75844SAndroid Build Coastguard Worker ~ChannelTest() {
136*d9f75844SAndroid Build Coastguard Worker if (network_thread_) {
137*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this]() {
138*d9f75844SAndroid Build Coastguard Worker network_thread_safety_->SetNotAlive();
139*d9f75844SAndroid Build Coastguard Worker DeinitChannels();
140*d9f75844SAndroid Build Coastguard Worker });
141*d9f75844SAndroid Build Coastguard Worker }
142*d9f75844SAndroid Build Coastguard Worker }
143*d9f75844SAndroid Build Coastguard Worker
CreateChannels(int flags1,int flags2)144*d9f75844SAndroid Build Coastguard Worker void CreateChannels(int flags1, int flags2) {
145*d9f75844SAndroid Build Coastguard Worker CreateChannels(std::make_unique<typename T::MediaChannel>(
146*d9f75844SAndroid Build Coastguard Worker nullptr, typename T::Options(), network_thread_),
147*d9f75844SAndroid Build Coastguard Worker std::make_unique<typename T::MediaChannel>(
148*d9f75844SAndroid Build Coastguard Worker nullptr, typename T::Options(), network_thread_),
149*d9f75844SAndroid Build Coastguard Worker flags1, flags2);
150*d9f75844SAndroid Build Coastguard Worker }
CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,std::unique_ptr<typename T::MediaChannel> ch2,int flags1,int flags2)151*d9f75844SAndroid Build Coastguard Worker void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
152*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::MediaChannel> ch2,
153*d9f75844SAndroid Build Coastguard Worker int flags1,
154*d9f75844SAndroid Build Coastguard Worker int flags2) {
155*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(!channel1_);
156*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(!channel2_);
157*d9f75844SAndroid Build Coastguard Worker
158*d9f75844SAndroid Build Coastguard Worker // Network thread is started in CreateChannels, to allow the test to
159*d9f75844SAndroid Build Coastguard Worker // configure a fake clock before any threads are spawned and attempt to
160*d9f75844SAndroid Build Coastguard Worker // access the time.
161*d9f75844SAndroid Build Coastguard Worker if (network_thread_keeper_) {
162*d9f75844SAndroid Build Coastguard Worker network_thread_keeper_->Start();
163*d9f75844SAndroid Build Coastguard Worker }
164*d9f75844SAndroid Build Coastguard Worker
165*d9f75844SAndroid Build Coastguard Worker // Make sure if using raw packet transports, they're used for both
166*d9f75844SAndroid Build Coastguard Worker // channels.
167*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
168*d9f75844SAndroid Build Coastguard Worker rtc::Thread* worker_thread = rtc::Thread::Current();
169*d9f75844SAndroid Build Coastguard Worker // Based on flags, create fake DTLS or raw packet transports.
170*d9f75844SAndroid Build Coastguard Worker if (flags1 & RAW_PACKET_TRANSPORT) {
171*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport1_.reset(
172*d9f75844SAndroid Build Coastguard Worker new rtc::FakePacketTransport("channel1_rtp"));
173*d9f75844SAndroid Build Coastguard Worker if (!(flags1 & RTCP_MUX)) {
174*d9f75844SAndroid Build Coastguard Worker fake_rtcp_packet_transport1_.reset(
175*d9f75844SAndroid Build Coastguard Worker new rtc::FakePacketTransport("channel1_rtcp"));
176*d9f75844SAndroid Build Coastguard Worker }
177*d9f75844SAndroid Build Coastguard Worker } else {
178*d9f75844SAndroid Build Coastguard Worker // Confirmed to work with KT_RSA and KT_ECDSA.
179*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
180*d9f75844SAndroid Build Coastguard Worker "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
181*d9f75844SAndroid Build Coastguard Worker if (!(flags1 & RTCP_MUX)) {
182*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
183*d9f75844SAndroid Build Coastguard Worker "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
184*d9f75844SAndroid Build Coastguard Worker network_thread_));
185*d9f75844SAndroid Build Coastguard Worker }
186*d9f75844SAndroid Build Coastguard Worker if (flags1 & DTLS) {
187*d9f75844SAndroid Build Coastguard Worker auto cert1 = rtc::RTCCertificate::Create(
188*d9f75844SAndroid Build Coastguard Worker rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
189*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
190*d9f75844SAndroid Build Coastguard Worker if (fake_rtcp_dtls_transport1_) {
191*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
192*d9f75844SAndroid Build Coastguard Worker }
193*d9f75844SAndroid Build Coastguard Worker }
194*d9f75844SAndroid Build Coastguard Worker }
195*d9f75844SAndroid Build Coastguard Worker // Based on flags, create fake DTLS or raw packet transports.
196*d9f75844SAndroid Build Coastguard Worker if (flags2 & RAW_PACKET_TRANSPORT) {
197*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport2_.reset(
198*d9f75844SAndroid Build Coastguard Worker new rtc::FakePacketTransport("channel2_rtp"));
199*d9f75844SAndroid Build Coastguard Worker if (!(flags2 & RTCP_MUX)) {
200*d9f75844SAndroid Build Coastguard Worker fake_rtcp_packet_transport2_.reset(
201*d9f75844SAndroid Build Coastguard Worker new rtc::FakePacketTransport("channel2_rtcp"));
202*d9f75844SAndroid Build Coastguard Worker }
203*d9f75844SAndroid Build Coastguard Worker } else {
204*d9f75844SAndroid Build Coastguard Worker // Confirmed to work with KT_RSA and KT_ECDSA.
205*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
206*d9f75844SAndroid Build Coastguard Worker "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
207*d9f75844SAndroid Build Coastguard Worker if (!(flags2 & RTCP_MUX)) {
208*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
209*d9f75844SAndroid Build Coastguard Worker "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
210*d9f75844SAndroid Build Coastguard Worker network_thread_));
211*d9f75844SAndroid Build Coastguard Worker }
212*d9f75844SAndroid Build Coastguard Worker if (flags2 & DTLS) {
213*d9f75844SAndroid Build Coastguard Worker auto cert2 = rtc::RTCCertificate::Create(
214*d9f75844SAndroid Build Coastguard Worker rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
215*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
216*d9f75844SAndroid Build Coastguard Worker if (fake_rtcp_dtls_transport2_) {
217*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
218*d9f75844SAndroid Build Coastguard Worker }
219*d9f75844SAndroid Build Coastguard Worker }
220*d9f75844SAndroid Build Coastguard Worker }
221*d9f75844SAndroid Build Coastguard Worker rtp_transport1_ = CreateRtpTransportBasedOnFlags(
222*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
223*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
224*d9f75844SAndroid Build Coastguard Worker flags1);
225*d9f75844SAndroid Build Coastguard Worker rtp_transport2_ = CreateRtpTransportBasedOnFlags(
226*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
227*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
228*d9f75844SAndroid Build Coastguard Worker flags2);
229*d9f75844SAndroid Build Coastguard Worker
230*d9f75844SAndroid Build Coastguard Worker channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1),
231*d9f75844SAndroid Build Coastguard Worker rtp_transport1_.get(), flags1);
232*d9f75844SAndroid Build Coastguard Worker channel2_ = CreateChannel(worker_thread, network_thread_, std::move(ch2),
233*d9f75844SAndroid Build Coastguard Worker rtp_transport2_.get(), flags2);
234*d9f75844SAndroid Build Coastguard Worker CreateContent(flags1, kPcmuCodec, kH264Codec, &local_media_content1_);
235*d9f75844SAndroid Build Coastguard Worker CreateContent(flags2, kPcmuCodec, kH264Codec, &local_media_content2_);
236*d9f75844SAndroid Build Coastguard Worker CopyContent(local_media_content1_, &remote_media_content1_);
237*d9f75844SAndroid Build Coastguard Worker CopyContent(local_media_content2_, &remote_media_content2_);
238*d9f75844SAndroid Build Coastguard Worker
239*d9f75844SAndroid Build Coastguard Worker // Add stream information (SSRC) to the local content but not to the remote
240*d9f75844SAndroid Build Coastguard Worker // content. This means that we per default know the SSRC of what we send but
241*d9f75844SAndroid Build Coastguard Worker // not what we receive.
242*d9f75844SAndroid Build Coastguard Worker AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
243*d9f75844SAndroid Build Coastguard Worker AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
244*d9f75844SAndroid Build Coastguard Worker
245*d9f75844SAndroid Build Coastguard Worker // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
246*d9f75844SAndroid Build Coastguard Worker if (flags1 & SSRC_MUX) {
247*d9f75844SAndroid Build Coastguard Worker AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
248*d9f75844SAndroid Build Coastguard Worker }
249*d9f75844SAndroid Build Coastguard Worker if (flags2 & SSRC_MUX) {
250*d9f75844SAndroid Build Coastguard Worker AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
251*d9f75844SAndroid Build Coastguard Worker }
252*d9f75844SAndroid Build Coastguard Worker }
253*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Channel> CreateChannel(
254*d9f75844SAndroid Build Coastguard Worker rtc::Thread* worker_thread,
255*d9f75844SAndroid Build Coastguard Worker rtc::Thread* network_thread,
256*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::MediaChannel> ch,
257*d9f75844SAndroid Build Coastguard Worker webrtc::RtpTransportInternal* rtp_transport,
258*d9f75844SAndroid Build Coastguard Worker int flags);
259*d9f75844SAndroid Build Coastguard Worker
CreateRtpTransportBasedOnFlags(rtc::PacketTransportInternal * rtp_packet_transport,rtc::PacketTransportInternal * rtcp_packet_transport,DtlsTransportInternal * rtp_dtls_transport,DtlsTransportInternal * rtcp_dtls_transport,int flags)260*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpTransportInternal> CreateRtpTransportBasedOnFlags(
261*d9f75844SAndroid Build Coastguard Worker rtc::PacketTransportInternal* rtp_packet_transport,
262*d9f75844SAndroid Build Coastguard Worker rtc::PacketTransportInternal* rtcp_packet_transport,
263*d9f75844SAndroid Build Coastguard Worker DtlsTransportInternal* rtp_dtls_transport,
264*d9f75844SAndroid Build Coastguard Worker DtlsTransportInternal* rtcp_dtls_transport,
265*d9f75844SAndroid Build Coastguard Worker int flags) {
266*d9f75844SAndroid Build Coastguard Worker if (flags & RTCP_MUX) {
267*d9f75844SAndroid Build Coastguard Worker rtcp_packet_transport = nullptr;
268*d9f75844SAndroid Build Coastguard Worker rtcp_dtls_transport = nullptr;
269*d9f75844SAndroid Build Coastguard Worker }
270*d9f75844SAndroid Build Coastguard Worker
271*d9f75844SAndroid Build Coastguard Worker if (flags & DTLS) {
272*d9f75844SAndroid Build Coastguard Worker return CreateDtlsSrtpTransport(rtp_dtls_transport, rtcp_dtls_transport);
273*d9f75844SAndroid Build Coastguard Worker } else {
274*d9f75844SAndroid Build Coastguard Worker if (flags & RAW_PACKET_TRANSPORT) {
275*d9f75844SAndroid Build Coastguard Worker return CreateUnencryptedTransport(rtp_packet_transport,
276*d9f75844SAndroid Build Coastguard Worker rtcp_packet_transport);
277*d9f75844SAndroid Build Coastguard Worker } else {
278*d9f75844SAndroid Build Coastguard Worker return CreateUnencryptedTransport(rtp_dtls_transport,
279*d9f75844SAndroid Build Coastguard Worker rtcp_dtls_transport);
280*d9f75844SAndroid Build Coastguard Worker }
281*d9f75844SAndroid Build Coastguard Worker }
282*d9f75844SAndroid Build Coastguard Worker }
283*d9f75844SAndroid Build Coastguard Worker
284*d9f75844SAndroid Build Coastguard Worker // Unininitializes the channels on the network thread.
DeinitChannels()285*d9f75844SAndroid Build Coastguard Worker void DeinitChannels() {
286*d9f75844SAndroid Build Coastguard Worker if (!channel1_ && !channel2_)
287*d9f75844SAndroid Build Coastguard Worker return;
288*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this]() {
289*d9f75844SAndroid Build Coastguard Worker if (channel1_) {
290*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(channel1_->network_thread());
291*d9f75844SAndroid Build Coastguard Worker channel1_->SetRtpTransport(nullptr);
292*d9f75844SAndroid Build Coastguard Worker }
293*d9f75844SAndroid Build Coastguard Worker if (channel2_) {
294*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(channel2_->network_thread());
295*d9f75844SAndroid Build Coastguard Worker channel2_->SetRtpTransport(nullptr);
296*d9f75844SAndroid Build Coastguard Worker }
297*d9f75844SAndroid Build Coastguard Worker });
298*d9f75844SAndroid Build Coastguard Worker }
299*d9f75844SAndroid Build Coastguard Worker
CreateUnencryptedTransport(rtc::PacketTransportInternal * rtp_packet_transport,rtc::PacketTransportInternal * rtcp_packet_transport)300*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedTransport(
301*d9f75844SAndroid Build Coastguard Worker rtc::PacketTransportInternal* rtp_packet_transport,
302*d9f75844SAndroid Build Coastguard Worker rtc::PacketTransportInternal* rtcp_packet_transport) {
303*d9f75844SAndroid Build Coastguard Worker auto rtp_transport = std::make_unique<webrtc::RtpTransport>(
304*d9f75844SAndroid Build Coastguard Worker rtcp_packet_transport == nullptr);
305*d9f75844SAndroid Build Coastguard Worker
306*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_,
307*d9f75844SAndroid Build Coastguard Worker [&rtp_transport, rtp_packet_transport, rtcp_packet_transport] {
308*d9f75844SAndroid Build Coastguard Worker rtp_transport->SetRtpPacketTransport(rtp_packet_transport);
309*d9f75844SAndroid Build Coastguard Worker if (rtcp_packet_transport) {
310*d9f75844SAndroid Build Coastguard Worker rtp_transport->SetRtcpPacketTransport(rtcp_packet_transport);
311*d9f75844SAndroid Build Coastguard Worker }
312*d9f75844SAndroid Build Coastguard Worker });
313*d9f75844SAndroid Build Coastguard Worker return rtp_transport;
314*d9f75844SAndroid Build Coastguard Worker }
315*d9f75844SAndroid Build Coastguard Worker
CreateDtlsSrtpTransport(cricket::DtlsTransportInternal * rtp_dtls_transport,cricket::DtlsTransportInternal * rtcp_dtls_transport)316*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
317*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtp_dtls_transport,
318*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtcp_dtls_transport) {
319*d9f75844SAndroid Build Coastguard Worker auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
320*d9f75844SAndroid Build Coastguard Worker rtcp_dtls_transport == nullptr, field_trials_);
321*d9f75844SAndroid Build Coastguard Worker
322*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_,
323*d9f75844SAndroid Build Coastguard Worker [&dtls_srtp_transport, rtp_dtls_transport, rtcp_dtls_transport] {
324*d9f75844SAndroid Build Coastguard Worker dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport,
325*d9f75844SAndroid Build Coastguard Worker rtcp_dtls_transport);
326*d9f75844SAndroid Build Coastguard Worker });
327*d9f75844SAndroid Build Coastguard Worker return dtls_srtp_transport;
328*d9f75844SAndroid Build Coastguard Worker }
329*d9f75844SAndroid Build Coastguard Worker
ConnectFakeTransports()330*d9f75844SAndroid Build Coastguard Worker void ConnectFakeTransports() {
331*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this] {
332*d9f75844SAndroid Build Coastguard Worker bool asymmetric = false;
333*d9f75844SAndroid Build Coastguard Worker // Depending on test flags, could be using DTLS or raw packet transport.
334*d9f75844SAndroid Build Coastguard Worker if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
335*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->SetDestination(
336*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport2_.get(), asymmetric);
337*d9f75844SAndroid Build Coastguard Worker }
338*d9f75844SAndroid Build Coastguard Worker if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
339*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport1_->SetDestination(
340*d9f75844SAndroid Build Coastguard Worker fake_rtcp_dtls_transport2_.get(), asymmetric);
341*d9f75844SAndroid Build Coastguard Worker }
342*d9f75844SAndroid Build Coastguard Worker if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
343*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport1_->SetDestination(
344*d9f75844SAndroid Build Coastguard Worker fake_rtp_packet_transport2_.get(), asymmetric);
345*d9f75844SAndroid Build Coastguard Worker }
346*d9f75844SAndroid Build Coastguard Worker if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
347*d9f75844SAndroid Build Coastguard Worker fake_rtcp_packet_transport1_->SetDestination(
348*d9f75844SAndroid Build Coastguard Worker fake_rtcp_packet_transport2_.get(), asymmetric);
349*d9f75844SAndroid Build Coastguard Worker }
350*d9f75844SAndroid Build Coastguard Worker });
351*d9f75844SAndroid Build Coastguard Worker // The transport becoming writable will asynchronously update the send state
352*d9f75844SAndroid Build Coastguard Worker // on the worker thread; since this test uses the main thread as the worker
353*d9f75844SAndroid Build Coastguard Worker // thread, we must process the message queue for this to occur.
354*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
355*d9f75844SAndroid Build Coastguard Worker }
356*d9f75844SAndroid Build Coastguard Worker
SendInitiate()357*d9f75844SAndroid Build Coastguard Worker bool SendInitiate() {
358*d9f75844SAndroid Build Coastguard Worker std::string err;
359*d9f75844SAndroid Build Coastguard Worker bool result = channel1_->SetLocalContent(&local_media_content1_,
360*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err);
361*d9f75844SAndroid Build Coastguard Worker if (result) {
362*d9f75844SAndroid Build Coastguard Worker channel1_->Enable(true);
363*d9f75844SAndroid Build Coastguard Worker FlushCurrentThread();
364*d9f75844SAndroid Build Coastguard Worker result = channel2_->SetRemoteContent(&remote_media_content1_,
365*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err);
366*d9f75844SAndroid Build Coastguard Worker if (result) {
367*d9f75844SAndroid Build Coastguard Worker ConnectFakeTransports();
368*d9f75844SAndroid Build Coastguard Worker result = channel2_->SetLocalContent(&local_media_content2_,
369*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err);
370*d9f75844SAndroid Build Coastguard Worker }
371*d9f75844SAndroid Build Coastguard Worker }
372*d9f75844SAndroid Build Coastguard Worker return result;
373*d9f75844SAndroid Build Coastguard Worker }
374*d9f75844SAndroid Build Coastguard Worker
SendAccept()375*d9f75844SAndroid Build Coastguard Worker bool SendAccept() {
376*d9f75844SAndroid Build Coastguard Worker channel2_->Enable(true);
377*d9f75844SAndroid Build Coastguard Worker FlushCurrentThread();
378*d9f75844SAndroid Build Coastguard Worker std::string err;
379*d9f75844SAndroid Build Coastguard Worker return channel1_->SetRemoteContent(&remote_media_content2_,
380*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err);
381*d9f75844SAndroid Build Coastguard Worker }
382*d9f75844SAndroid Build Coastguard Worker
SendOffer()383*d9f75844SAndroid Build Coastguard Worker bool SendOffer() {
384*d9f75844SAndroid Build Coastguard Worker std::string err;
385*d9f75844SAndroid Build Coastguard Worker bool result = channel1_->SetLocalContent(&local_media_content1_,
386*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err);
387*d9f75844SAndroid Build Coastguard Worker if (result) {
388*d9f75844SAndroid Build Coastguard Worker channel1_->Enable(true);
389*d9f75844SAndroid Build Coastguard Worker result = channel2_->SetRemoteContent(&remote_media_content1_,
390*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err);
391*d9f75844SAndroid Build Coastguard Worker }
392*d9f75844SAndroid Build Coastguard Worker return result;
393*d9f75844SAndroid Build Coastguard Worker }
394*d9f75844SAndroid Build Coastguard Worker
SendProvisionalAnswer()395*d9f75844SAndroid Build Coastguard Worker bool SendProvisionalAnswer() {
396*d9f75844SAndroid Build Coastguard Worker std::string err;
397*d9f75844SAndroid Build Coastguard Worker bool result = channel2_->SetLocalContent(&local_media_content2_,
398*d9f75844SAndroid Build Coastguard Worker SdpType::kPrAnswer, err);
399*d9f75844SAndroid Build Coastguard Worker if (result) {
400*d9f75844SAndroid Build Coastguard Worker channel2_->Enable(true);
401*d9f75844SAndroid Build Coastguard Worker result = channel1_->SetRemoteContent(&remote_media_content2_,
402*d9f75844SAndroid Build Coastguard Worker SdpType::kPrAnswer, err);
403*d9f75844SAndroid Build Coastguard Worker ConnectFakeTransports();
404*d9f75844SAndroid Build Coastguard Worker }
405*d9f75844SAndroid Build Coastguard Worker return result;
406*d9f75844SAndroid Build Coastguard Worker }
407*d9f75844SAndroid Build Coastguard Worker
SendFinalAnswer()408*d9f75844SAndroid Build Coastguard Worker bool SendFinalAnswer() {
409*d9f75844SAndroid Build Coastguard Worker std::string err;
410*d9f75844SAndroid Build Coastguard Worker bool result = channel2_->SetLocalContent(&local_media_content2_,
411*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err);
412*d9f75844SAndroid Build Coastguard Worker if (result) {
413*d9f75844SAndroid Build Coastguard Worker result = channel1_->SetRemoteContent(&remote_media_content2_,
414*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err);
415*d9f75844SAndroid Build Coastguard Worker }
416*d9f75844SAndroid Build Coastguard Worker return result;
417*d9f75844SAndroid Build Coastguard Worker }
418*d9f75844SAndroid Build Coastguard Worker
SendRtp(typename T::MediaChannel * media_channel,rtc::Buffer data)419*d9f75844SAndroid Build Coastguard Worker void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
420*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(webrtc::SafeTask(
421*d9f75844SAndroid Build Coastguard Worker network_thread_safety_, [media_channel, data = std::move(data)]() {
422*d9f75844SAndroid Build Coastguard Worker media_channel->SendRtp(data.data(), data.size(),
423*d9f75844SAndroid Build Coastguard Worker rtc::PacketOptions());
424*d9f75844SAndroid Build Coastguard Worker }));
425*d9f75844SAndroid Build Coastguard Worker }
426*d9f75844SAndroid Build Coastguard Worker
SendRtp1()427*d9f75844SAndroid Build Coastguard Worker void SendRtp1() {
428*d9f75844SAndroid Build Coastguard Worker SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
429*d9f75844SAndroid Build Coastguard Worker }
430*d9f75844SAndroid Build Coastguard Worker
SendRtp1(rtc::Buffer data)431*d9f75844SAndroid Build Coastguard Worker void SendRtp1(rtc::Buffer data) {
432*d9f75844SAndroid Build Coastguard Worker SendRtp(media_channel1(), std::move(data));
433*d9f75844SAndroid Build Coastguard Worker }
434*d9f75844SAndroid Build Coastguard Worker
SendRtp2()435*d9f75844SAndroid Build Coastguard Worker void SendRtp2() {
436*d9f75844SAndroid Build Coastguard Worker SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
437*d9f75844SAndroid Build Coastguard Worker }
438*d9f75844SAndroid Build Coastguard Worker
SendRtp2(rtc::Buffer data)439*d9f75844SAndroid Build Coastguard Worker void SendRtp2(rtc::Buffer data) {
440*d9f75844SAndroid Build Coastguard Worker SendRtp(media_channel2(), std::move(data));
441*d9f75844SAndroid Build Coastguard Worker }
442*d9f75844SAndroid Build Coastguard Worker
443*d9f75844SAndroid Build Coastguard Worker // Methods to send custom data.
SendCustomRtp1(uint32_t ssrc,int sequence_number,int pl_type=-1)444*d9f75844SAndroid Build Coastguard Worker void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
445*d9f75844SAndroid Build Coastguard Worker SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
446*d9f75844SAndroid Build Coastguard Worker }
SendCustomRtp2(uint32_t ssrc,int sequence_number,int pl_type=-1)447*d9f75844SAndroid Build Coastguard Worker void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
448*d9f75844SAndroid Build Coastguard Worker SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
449*d9f75844SAndroid Build Coastguard Worker }
450*d9f75844SAndroid Build Coastguard Worker
CheckRtp1()451*d9f75844SAndroid Build Coastguard Worker bool CheckRtp1() {
452*d9f75844SAndroid Build Coastguard Worker return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
453*d9f75844SAndroid Build Coastguard Worker }
CheckRtp2()454*d9f75844SAndroid Build Coastguard Worker bool CheckRtp2() {
455*d9f75844SAndroid Build Coastguard Worker return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
456*d9f75844SAndroid Build Coastguard Worker }
457*d9f75844SAndroid Build Coastguard Worker // Methods to check custom data.
CheckCustomRtp1(uint32_t ssrc,int sequence_number,int pl_type=-1)458*d9f75844SAndroid Build Coastguard Worker bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
459*d9f75844SAndroid Build Coastguard Worker rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
460*d9f75844SAndroid Build Coastguard Worker return media_channel1()->CheckRtp(data.data(), data.size());
461*d9f75844SAndroid Build Coastguard Worker }
CheckCustomRtp2(uint32_t ssrc,int sequence_number,int pl_type=-1)462*d9f75844SAndroid Build Coastguard Worker bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
463*d9f75844SAndroid Build Coastguard Worker rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
464*d9f75844SAndroid Build Coastguard Worker return media_channel2()->CheckRtp(data.data(), data.size());
465*d9f75844SAndroid Build Coastguard Worker }
CreateRtpData(uint32_t ssrc,int sequence_number,int pl_type)466*d9f75844SAndroid Build Coastguard Worker rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
467*d9f75844SAndroid Build Coastguard Worker rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
468*d9f75844SAndroid Build Coastguard Worker // Set SSRC in the rtp packet copy.
469*d9f75844SAndroid Build Coastguard Worker rtc::SetBE32(data.data() + 8, ssrc);
470*d9f75844SAndroid Build Coastguard Worker rtc::SetBE16(data.data() + 2, sequence_number);
471*d9f75844SAndroid Build Coastguard Worker if (pl_type >= 0) {
472*d9f75844SAndroid Build Coastguard Worker rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
473*d9f75844SAndroid Build Coastguard Worker }
474*d9f75844SAndroid Build Coastguard Worker return data;
475*d9f75844SAndroid Build Coastguard Worker }
476*d9f75844SAndroid Build Coastguard Worker
CheckNoRtp1()477*d9f75844SAndroid Build Coastguard Worker bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
CheckNoRtp2()478*d9f75844SAndroid Build Coastguard Worker bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
479*d9f75844SAndroid Build Coastguard Worker
CreateContent(int flags,const cricket::AudioCodec & audio_codec,const cricket::VideoCodec & video_codec,typename T::Content * content)480*d9f75844SAndroid Build Coastguard Worker void CreateContent(int flags,
481*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec& audio_codec,
482*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec& video_codec,
483*d9f75844SAndroid Build Coastguard Worker typename T::Content* content) {
484*d9f75844SAndroid Build Coastguard Worker // overridden in specialized classes
485*d9f75844SAndroid Build Coastguard Worker }
CopyContent(const typename T::Content & source,typename T::Content * content)486*d9f75844SAndroid Build Coastguard Worker void CopyContent(const typename T::Content& source,
487*d9f75844SAndroid Build Coastguard Worker typename T::Content* content) {
488*d9f75844SAndroid Build Coastguard Worker // overridden in specialized classes
489*d9f75844SAndroid Build Coastguard Worker }
490*d9f75844SAndroid Build Coastguard Worker
491*d9f75844SAndroid Build Coastguard Worker // Creates a MediaContent with one stream.
492*d9f75844SAndroid Build Coastguard Worker // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
CreateMediaContentWithStream(uint32_t ssrc)493*d9f75844SAndroid Build Coastguard Worker typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
494*d9f75844SAndroid Build Coastguard Worker typename T::Content* content = new typename T::Content();
495*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, content);
496*d9f75844SAndroid Build Coastguard Worker AddLegacyStreamInContent(ssrc, 0, content);
497*d9f75844SAndroid Build Coastguard Worker return content;
498*d9f75844SAndroid Build Coastguard Worker }
499*d9f75844SAndroid Build Coastguard Worker
500*d9f75844SAndroid Build Coastguard Worker // Will manage the lifetime of a CallThread, making sure it's
501*d9f75844SAndroid Build Coastguard Worker // destroyed before this object goes out of scope.
502*d9f75844SAndroid Build Coastguard Worker class ScopedCallThread {
503*d9f75844SAndroid Build Coastguard Worker public:
ScopedCallThread(absl::AnyInvocable<void ()&&> functor)504*d9f75844SAndroid Build Coastguard Worker explicit ScopedCallThread(absl::AnyInvocable<void() &&> functor)
505*d9f75844SAndroid Build Coastguard Worker : thread_(rtc::Thread::Create()) {
506*d9f75844SAndroid Build Coastguard Worker thread_->Start();
507*d9f75844SAndroid Build Coastguard Worker thread_->PostTask(std::move(functor));
508*d9f75844SAndroid Build Coastguard Worker }
509*d9f75844SAndroid Build Coastguard Worker
~ScopedCallThread()510*d9f75844SAndroid Build Coastguard Worker ~ScopedCallThread() { thread_->Stop(); }
511*d9f75844SAndroid Build Coastguard Worker
thread()512*d9f75844SAndroid Build Coastguard Worker rtc::Thread* thread() { return thread_.get(); }
513*d9f75844SAndroid Build Coastguard Worker
514*d9f75844SAndroid Build Coastguard Worker private:
515*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::Thread> thread_;
516*d9f75844SAndroid Build Coastguard Worker };
517*d9f75844SAndroid Build Coastguard Worker
CodecMatches(const typename T::Codec & c1,const typename T::Codec & c2)518*d9f75844SAndroid Build Coastguard Worker bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
519*d9f75844SAndroid Build Coastguard Worker return false; // overridden in specialized classes
520*d9f75844SAndroid Build Coastguard Worker }
521*d9f75844SAndroid Build Coastguard Worker
last_selected_candidate_pair()522*d9f75844SAndroid Build Coastguard Worker cricket::CandidatePairInterface* last_selected_candidate_pair() {
523*d9f75844SAndroid Build Coastguard Worker return last_selected_candidate_pair_;
524*d9f75844SAndroid Build Coastguard Worker }
525*d9f75844SAndroid Build Coastguard Worker
AddLegacyStreamInContent(uint32_t ssrc,int flags,typename T::Content * content)526*d9f75844SAndroid Build Coastguard Worker void AddLegacyStreamInContent(uint32_t ssrc,
527*d9f75844SAndroid Build Coastguard Worker int flags,
528*d9f75844SAndroid Build Coastguard Worker typename T::Content* content) {
529*d9f75844SAndroid Build Coastguard Worker // Base implementation.
530*d9f75844SAndroid Build Coastguard Worker }
531*d9f75844SAndroid Build Coastguard Worker
532*d9f75844SAndroid Build Coastguard Worker // Utility method that calls BaseChannel::srtp_active() on the network thread
533*d9f75844SAndroid Build Coastguard Worker // and returns the result. The `srtp_active()` state is maintained on the
534*d9f75844SAndroid Build Coastguard Worker // network thread, which callers need to factor in.
IsSrtpActive(std::unique_ptr<typename T::Channel> & channel)535*d9f75844SAndroid Build Coastguard Worker bool IsSrtpActive(std::unique_ptr<typename T::Channel>& channel) {
536*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel.get());
537*d9f75844SAndroid Build Coastguard Worker bool result;
538*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [&] { result = channel->srtp_active(); });
539*d9f75844SAndroid Build Coastguard Worker return result;
540*d9f75844SAndroid Build Coastguard Worker }
541*d9f75844SAndroid Build Coastguard Worker
542*d9f75844SAndroid Build Coastguard Worker // Returns true iff the transport is set for a channel and rtcp_mux_enabled()
543*d9f75844SAndroid Build Coastguard Worker // returns true.
IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel> & channel)544*d9f75844SAndroid Build Coastguard Worker bool IsRtcpMuxEnabled(std::unique_ptr<typename T::Channel>& channel) {
545*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel.get());
546*d9f75844SAndroid Build Coastguard Worker bool result;
547*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [&] {
548*d9f75844SAndroid Build Coastguard Worker result = channel->rtp_transport() &&
549*d9f75844SAndroid Build Coastguard Worker channel->rtp_transport()->rtcp_mux_enabled();
550*d9f75844SAndroid Build Coastguard Worker });
551*d9f75844SAndroid Build Coastguard Worker return result;
552*d9f75844SAndroid Build Coastguard Worker }
553*d9f75844SAndroid Build Coastguard Worker
554*d9f75844SAndroid Build Coastguard Worker // Tests that can be used by derived classes.
555*d9f75844SAndroid Build Coastguard Worker
556*d9f75844SAndroid Build Coastguard Worker // Basic sanity check.
TestInit()557*d9f75844SAndroid Build Coastguard Worker void TestInit() {
558*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
559*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsSrtpActive(channel1_));
560*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
561*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
562*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->playout());
563*d9f75844SAndroid Build Coastguard Worker }
564*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->codecs().empty());
565*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->recv_streams().empty());
566*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->rtp_packets().empty());
567*d9f75844SAndroid Build Coastguard Worker }
568*d9f75844SAndroid Build Coastguard Worker
569*d9f75844SAndroid Build Coastguard Worker // Test that SetLocalContent and SetRemoteContent properly configure
570*d9f75844SAndroid Build Coastguard Worker // the codecs.
TestSetContents()571*d9f75844SAndroid Build Coastguard Worker void TestSetContents() {
572*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
573*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
574*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
575*d9f75844SAndroid Build Coastguard Worker std::string err;
576*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
577*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0U, media_channel1()->codecs().size());
578*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
579*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1U, media_channel1()->codecs().size());
580*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
581*d9f75844SAndroid Build Coastguard Worker CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
582*d9f75844SAndroid Build Coastguard Worker }
583*d9f75844SAndroid Build Coastguard Worker
584*d9f75844SAndroid Build Coastguard Worker // Test that SetLocalContent and SetRemoteContent properly configure
585*d9f75844SAndroid Build Coastguard Worker // extmap-allow-mixed.
TestSetContentsExtmapAllowMixedCaller(bool offer,bool answer)586*d9f75844SAndroid Build Coastguard Worker void TestSetContentsExtmapAllowMixedCaller(bool offer, bool answer) {
587*d9f75844SAndroid Build Coastguard Worker // For a caller, SetLocalContent() is called first with an offer and next
588*d9f75844SAndroid Build Coastguard Worker // SetRemoteContent() is called with the answer.
589*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
590*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
591*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
592*d9f75844SAndroid Build Coastguard Worker auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
593*d9f75844SAndroid Build Coastguard Worker auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
594*d9f75844SAndroid Build Coastguard Worker content.set_extmap_allow_mixed_enum(offer_enum);
595*d9f75844SAndroid Build Coastguard Worker std::string err;
596*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
597*d9f75844SAndroid Build Coastguard Worker content.set_extmap_allow_mixed_enum(answer_enum);
598*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
599*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
600*d9f75844SAndroid Build Coastguard Worker }
TestSetContentsExtmapAllowMixedCallee(bool offer,bool answer)601*d9f75844SAndroid Build Coastguard Worker void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
602*d9f75844SAndroid Build Coastguard Worker // For a callee, SetRemoteContent() is called first with an offer and next
603*d9f75844SAndroid Build Coastguard Worker // SetLocalContent() is called with the answer.
604*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
605*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
606*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
607*d9f75844SAndroid Build Coastguard Worker auto offer_enum = offer ? (T::Content::kSession) : (T::Content::kNo);
608*d9f75844SAndroid Build Coastguard Worker auto answer_enum = answer ? (T::Content::kSession) : (T::Content::kNo);
609*d9f75844SAndroid Build Coastguard Worker content.set_extmap_allow_mixed_enum(offer_enum);
610*d9f75844SAndroid Build Coastguard Worker std::string err;
611*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, err));
612*d9f75844SAndroid Build Coastguard Worker content.set_extmap_allow_mixed_enum(answer_enum);
613*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, err));
614*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
615*d9f75844SAndroid Build Coastguard Worker }
616*d9f75844SAndroid Build Coastguard Worker
617*d9f75844SAndroid Build Coastguard Worker // Test that SetLocalContent and SetRemoteContent properly deals
618*d9f75844SAndroid Build Coastguard Worker // with an empty offer.
TestSetContentsNullOffer()619*d9f75844SAndroid Build Coastguard Worker void TestSetContentsNullOffer() {
620*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
621*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
622*d9f75844SAndroid Build Coastguard Worker std::string err;
623*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
624*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
625*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0U, media_channel1()->codecs().size());
626*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
627*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1U, media_channel1()->codecs().size());
628*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
629*d9f75844SAndroid Build Coastguard Worker CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
630*d9f75844SAndroid Build Coastguard Worker }
631*d9f75844SAndroid Build Coastguard Worker
632*d9f75844SAndroid Build Coastguard Worker // Test that SetLocalContent and SetRemoteContent properly set RTCP
633*d9f75844SAndroid Build Coastguard Worker // mux.
TestSetContentsRtcpMux()634*d9f75844SAndroid Build Coastguard Worker void TestSetContentsRtcpMux() {
635*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
636*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
637*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
638*d9f75844SAndroid Build Coastguard Worker // Both sides agree on mux. Should no longer be a separate RTCP channel.
639*d9f75844SAndroid Build Coastguard Worker content.set_rtcp_mux(true);
640*d9f75844SAndroid Build Coastguard Worker std::string err;
641*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, err));
642*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, err));
643*d9f75844SAndroid Build Coastguard Worker // Only initiator supports mux. Should still have a separate RTCP channel.
644*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content, SdpType::kOffer, err));
645*d9f75844SAndroid Build Coastguard Worker content.set_rtcp_mux(false);
646*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetRemoteContent(&content, SdpType::kAnswer, err));
647*d9f75844SAndroid Build Coastguard Worker }
648*d9f75844SAndroid Build Coastguard Worker
649*d9f75844SAndroid Build Coastguard Worker // Test that SetLocalContent and SetRemoteContent properly
650*d9f75844SAndroid Build Coastguard Worker // handles adding and removing StreamParams when the action is a full
651*d9f75844SAndroid Build Coastguard Worker // SdpType::kOffer / SdpType::kAnswer.
TestChangeStreamParamsInContent()652*d9f75844SAndroid Build Coastguard Worker void TestChangeStreamParamsInContent() {
653*d9f75844SAndroid Build Coastguard Worker cricket::StreamParams stream1;
654*d9f75844SAndroid Build Coastguard Worker stream1.id = "stream1";
655*d9f75844SAndroid Build Coastguard Worker stream1.ssrcs.push_back(kSsrc1);
656*d9f75844SAndroid Build Coastguard Worker stream1.cname = "stream1_cname";
657*d9f75844SAndroid Build Coastguard Worker
658*d9f75844SAndroid Build Coastguard Worker cricket::StreamParams stream2;
659*d9f75844SAndroid Build Coastguard Worker stream2.id = "stream2";
660*d9f75844SAndroid Build Coastguard Worker stream2.ssrcs.push_back(kSsrc2);
661*d9f75844SAndroid Build Coastguard Worker stream2.cname = "stream2_cname";
662*d9f75844SAndroid Build Coastguard Worker
663*d9f75844SAndroid Build Coastguard Worker // Setup a call where channel 1 send `stream1` to channel 2.
664*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
665*d9f75844SAndroid Build Coastguard Worker typename T::Content content1;
666*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content1);
667*d9f75844SAndroid Build Coastguard Worker content1.AddStream(stream1);
668*d9f75844SAndroid Build Coastguard Worker std::string err;
669*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
670*d9f75844SAndroid Build Coastguard Worker channel1_->Enable(true);
671*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, media_channel1()->send_streams().size());
672*d9f75844SAndroid Build Coastguard Worker
673*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
674*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, media_channel2()->recv_streams().size());
675*d9f75844SAndroid Build Coastguard Worker ConnectFakeTransports();
676*d9f75844SAndroid Build Coastguard Worker
677*d9f75844SAndroid Build Coastguard Worker // Channel 2 do not send anything.
678*d9f75844SAndroid Build Coastguard Worker typename T::Content content2;
679*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content2);
680*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
681*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, media_channel1()->recv_streams().size());
682*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
683*d9f75844SAndroid Build Coastguard Worker channel2_->Enable(true);
684*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, media_channel2()->send_streams().size());
685*d9f75844SAndroid Build Coastguard Worker
686*d9f75844SAndroid Build Coastguard Worker SendCustomRtp1(kSsrc1, 0);
687*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
688*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
689*d9f75844SAndroid Build Coastguard Worker
690*d9f75844SAndroid Build Coastguard Worker // Let channel 2 update the content by sending `stream2` and enable SRTP.
691*d9f75844SAndroid Build Coastguard Worker typename T::Content content3;
692*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content3);
693*d9f75844SAndroid Build Coastguard Worker content3.AddStream(stream2);
694*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, err));
695*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, media_channel2()->send_streams().size());
696*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
697*d9f75844SAndroid Build Coastguard Worker
698*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, err));
699*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, media_channel1()->recv_streams().size());
700*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
701*d9f75844SAndroid Build Coastguard Worker
702*d9f75844SAndroid Build Coastguard Worker // Channel 1 replies but stop sending stream1.
703*d9f75844SAndroid Build Coastguard Worker typename T::Content content4;
704*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content4);
705*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, err));
706*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, media_channel1()->send_streams().size());
707*d9f75844SAndroid Build Coastguard Worker
708*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, err));
709*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, media_channel2()->recv_streams().size());
710*d9f75844SAndroid Build Coastguard Worker
711*d9f75844SAndroid Build Coastguard Worker SendCustomRtp2(kSsrc2, 0);
712*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
713*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
714*d9f75844SAndroid Build Coastguard Worker }
715*d9f75844SAndroid Build Coastguard Worker
716*d9f75844SAndroid Build Coastguard Worker // Test that we only start playout and sending at the right times.
TestPlayoutAndSendingStates()717*d9f75844SAndroid Build Coastguard Worker void TestPlayoutAndSendingStates() {
718*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
719*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
720*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->playout());
721*d9f75844SAndroid Build Coastguard Worker }
722*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
723*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
724*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout());
725*d9f75844SAndroid Build Coastguard Worker }
726*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending());
727*d9f75844SAndroid Build Coastguard Worker channel1_->Enable(true);
728*d9f75844SAndroid Build Coastguard Worker FlushCurrentThread();
729*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
730*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->playout());
731*d9f75844SAndroid Build Coastguard Worker }
732*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
733*d9f75844SAndroid Build Coastguard Worker std::string err;
734*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
735*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err));
736*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
737*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
738*d9f75844SAndroid Build Coastguard Worker }
739*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
740*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
741*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err));
742*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
743*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout());
744*d9f75844SAndroid Build Coastguard Worker }
745*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending());
746*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
747*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err));
748*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
749*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout());
750*d9f75844SAndroid Build Coastguard Worker }
751*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending());
752*d9f75844SAndroid Build Coastguard Worker ConnectFakeTransports();
753*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
754*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
755*d9f75844SAndroid Build Coastguard Worker }
756*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
757*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
758*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout());
759*d9f75844SAndroid Build Coastguard Worker }
760*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending());
761*d9f75844SAndroid Build Coastguard Worker channel2_->Enable(true);
762*d9f75844SAndroid Build Coastguard Worker FlushCurrentThread();
763*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
764*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->playout());
765*d9f75844SAndroid Build Coastguard Worker }
766*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->sending());
767*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
768*d9f75844SAndroid Build Coastguard Worker SdpType::kAnswer, err));
769*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
770*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
771*d9f75844SAndroid Build Coastguard Worker }
772*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
773*d9f75844SAndroid Build Coastguard Worker }
774*d9f75844SAndroid Build Coastguard Worker
775*d9f75844SAndroid Build Coastguard Worker // Test that changing the MediaContentDirection in the local and remote
776*d9f75844SAndroid Build Coastguard Worker // session description start playout and sending at the right time.
TestMediaContentDirection()777*d9f75844SAndroid Build Coastguard Worker void TestMediaContentDirection() {
778*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
779*d9f75844SAndroid Build Coastguard Worker typename T::Content content1;
780*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content1);
781*d9f75844SAndroid Build Coastguard Worker typename T::Content content2;
782*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content2);
783*d9f75844SAndroid Build Coastguard Worker // Set `content2` to be InActive.
784*d9f75844SAndroid Build Coastguard Worker content2.set_direction(RtpTransceiverDirection::kInactive);
785*d9f75844SAndroid Build Coastguard Worker
786*d9f75844SAndroid Build Coastguard Worker channel1_->Enable(true);
787*d9f75844SAndroid Build Coastguard Worker channel2_->Enable(true);
788*d9f75844SAndroid Build Coastguard Worker FlushCurrentThread();
789*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
790*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->playout());
791*d9f75844SAndroid Build Coastguard Worker }
792*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
793*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
794*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout());
795*d9f75844SAndroid Build Coastguard Worker }
796*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending());
797*d9f75844SAndroid Build Coastguard Worker
798*d9f75844SAndroid Build Coastguard Worker std::string err;
799*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
800*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, err));
801*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
802*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
803*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
804*d9f75844SAndroid Build Coastguard Worker ConnectFakeTransports();
805*d9f75844SAndroid Build Coastguard Worker
806*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
807*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
808*d9f75844SAndroid Build Coastguard Worker }
809*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending()); // remote InActive
810*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
811*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->playout()); // local InActive
812*d9f75844SAndroid Build Coastguard Worker }
813*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending()); // local InActive
814*d9f75844SAndroid Build Coastguard Worker
815*d9f75844SAndroid Build Coastguard Worker // Update `content2` to be RecvOnly.
816*d9f75844SAndroid Build Coastguard Worker content2.set_direction(RtpTransceiverDirection::kRecvOnly);
817*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kPrAnswer, err));
818*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
819*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, err));
820*d9f75844SAndroid Build Coastguard Worker
821*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
822*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
823*d9f75844SAndroid Build Coastguard Worker }
824*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
825*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
826*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
827*d9f75844SAndroid Build Coastguard Worker }
828*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
829*d9f75844SAndroid Build Coastguard Worker
830*d9f75844SAndroid Build Coastguard Worker // Update `content2` to be SendRecv.
831*d9f75844SAndroid Build Coastguard Worker content2.set_direction(RtpTransceiverDirection::kSendRecv);
832*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, err));
833*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, err));
834*d9f75844SAndroid Build Coastguard Worker
835*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
836*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
837*d9f75844SAndroid Build Coastguard Worker }
838*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
839*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
840*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->playout());
841*d9f75844SAndroid Build Coastguard Worker }
842*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->sending());
843*d9f75844SAndroid Build Coastguard Worker }
844*d9f75844SAndroid Build Coastguard Worker
845*d9f75844SAndroid Build Coastguard Worker // Tests that when the transport channel signals a candidate pair change
846*d9f75844SAndroid Build Coastguard Worker // event, the media channel will receive a call on the network route change.
TestNetworkRouteChanges()847*d9f75844SAndroid Build Coastguard Worker void TestNetworkRouteChanges() {
848*d9f75844SAndroid Build Coastguard Worker static constexpr uint16_t kLocalNetId = 1;
849*d9f75844SAndroid Build Coastguard Worker static constexpr uint16_t kRemoteNetId = 2;
850*d9f75844SAndroid Build Coastguard Worker static constexpr int kLastPacketId = 100;
851*d9f75844SAndroid Build Coastguard Worker // Ipv4(20) + UDP(8).
852*d9f75844SAndroid Build Coastguard Worker static constexpr int kTransportOverheadPerPacket = 28;
853*d9f75844SAndroid Build Coastguard Worker static constexpr int kSrtpOverheadPerPacket = 10;
854*d9f75844SAndroid Build Coastguard Worker
855*d9f75844SAndroid Build Coastguard Worker CreateChannels(DTLS, DTLS);
856*d9f75844SAndroid Build Coastguard Worker SendInitiate();
857*d9f75844SAndroid Build Coastguard Worker
858*d9f75844SAndroid Build Coastguard Worker typename T::MediaChannel* media_channel1 =
859*d9f75844SAndroid Build Coastguard Worker static_cast<typename T::MediaChannel*>(channel1_->media_channel());
860*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(media_channel1);
861*d9f75844SAndroid Build Coastguard Worker
862*d9f75844SAndroid Build Coastguard Worker // Need to wait for the threads before calling
863*d9f75844SAndroid Build Coastguard Worker // `set_num_network_route_changes` because the network route would be set
864*d9f75844SAndroid Build Coastguard Worker // when creating the channel.
865*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
866*d9f75844SAndroid Build Coastguard Worker media_channel1->set_num_network_route_changes(0);
867*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this] {
868*d9f75844SAndroid Build Coastguard Worker rtc::NetworkRoute network_route;
869*d9f75844SAndroid Build Coastguard Worker // The transport channel becomes disconnected.
870*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
871*d9f75844SAndroid Build Coastguard Worker absl::optional<rtc::NetworkRoute>(network_route));
872*d9f75844SAndroid Build Coastguard Worker });
873*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
874*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, media_channel1->num_network_route_changes());
875*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1->last_network_route().connected);
876*d9f75844SAndroid Build Coastguard Worker media_channel1->set_num_network_route_changes(0);
877*d9f75844SAndroid Build Coastguard Worker
878*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this] {
879*d9f75844SAndroid Build Coastguard Worker rtc::NetworkRoute network_route;
880*d9f75844SAndroid Build Coastguard Worker network_route.connected = true;
881*d9f75844SAndroid Build Coastguard Worker network_route.local =
882*d9f75844SAndroid Build Coastguard Worker rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
883*d9f75844SAndroid Build Coastguard Worker network_route.remote =
884*d9f75844SAndroid Build Coastguard Worker rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
885*d9f75844SAndroid Build Coastguard Worker network_route.last_sent_packet_id = kLastPacketId;
886*d9f75844SAndroid Build Coastguard Worker network_route.packet_overhead = kTransportOverheadPerPacket;
887*d9f75844SAndroid Build Coastguard Worker // The transport channel becomes connected.
888*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
889*d9f75844SAndroid Build Coastguard Worker
890*d9f75844SAndroid Build Coastguard Worker absl::optional<rtc::NetworkRoute>(network_route));
891*d9f75844SAndroid Build Coastguard Worker });
892*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
893*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, media_channel1->num_network_route_changes());
894*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1->last_network_route().connected);
895*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLocalNetId,
896*d9f75844SAndroid Build Coastguard Worker media_channel1->last_network_route().local.network_id());
897*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kRemoteNetId,
898*d9f75844SAndroid Build Coastguard Worker media_channel1->last_network_route().remote.network_id());
899*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLastPacketId,
900*d9f75844SAndroid Build Coastguard Worker media_channel1->last_network_route().last_sent_packet_id);
901*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTransportOverheadPerPacket + kSrtpOverheadPerPacket,
902*d9f75844SAndroid Build Coastguard Worker media_channel1->transport_overhead_per_packet());
903*d9f75844SAndroid Build Coastguard Worker }
904*d9f75844SAndroid Build Coastguard Worker
905*d9f75844SAndroid Build Coastguard Worker // Test setting up a call.
TestCallSetup()906*d9f75844SAndroid Build Coastguard Worker void TestCallSetup() {
907*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
908*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsSrtpActive(channel1_));
909*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
910*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
911*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->playout());
912*d9f75844SAndroid Build Coastguard Worker }
913*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->sending());
914*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
915*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsSrtpActive(channel1_));
916*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
917*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, media_channel1()->codecs().size());
918*d9f75844SAndroid Build Coastguard Worker if (verify_playout_) {
919*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->playout());
920*d9f75844SAndroid Build Coastguard Worker }
921*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel2()->sending());
922*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, media_channel2()->codecs().size());
923*d9f75844SAndroid Build Coastguard Worker }
924*d9f75844SAndroid Build Coastguard Worker
925*d9f75844SAndroid Build Coastguard Worker // Send voice RTP data to the other side and ensure it gets there.
SendRtpToRtp()926*d9f75844SAndroid Build Coastguard Worker void SendRtpToRtp() {
927*d9f75844SAndroid Build Coastguard Worker CreateChannels(RTCP_MUX, RTCP_MUX);
928*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
929*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
930*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
931*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
932*d9f75844SAndroid Build Coastguard Worker SendRtp1();
933*d9f75844SAndroid Build Coastguard Worker SendRtp2();
934*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
935*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
936*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
937*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
938*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
939*d9f75844SAndroid Build Coastguard Worker }
940*d9f75844SAndroid Build Coastguard Worker
TestDeinit()941*d9f75844SAndroid Build Coastguard Worker void TestDeinit() {
942*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
943*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
944*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
945*d9f75844SAndroid Build Coastguard Worker SendRtp1();
946*d9f75844SAndroid Build Coastguard Worker SendRtp2();
947*d9f75844SAndroid Build Coastguard Worker
948*d9f75844SAndroid Build Coastguard Worker DeinitChannels();
949*d9f75844SAndroid Build Coastguard Worker
950*d9f75844SAndroid Build Coastguard Worker // Do not wait, destroy channels.
951*d9f75844SAndroid Build Coastguard Worker channel1_.reset(nullptr);
952*d9f75844SAndroid Build Coastguard Worker channel2_.reset(nullptr);
953*d9f75844SAndroid Build Coastguard Worker }
954*d9f75844SAndroid Build Coastguard Worker
SendDtlsSrtpToDtlsSrtp(int flags1,int flags2)955*d9f75844SAndroid Build Coastguard Worker void SendDtlsSrtpToDtlsSrtp(int flags1, int flags2) {
956*d9f75844SAndroid Build Coastguard Worker CreateChannels(flags1 | DTLS, flags2 | DTLS);
957*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsSrtpActive(channel1_));
958*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsSrtpActive(channel2_));
959*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
960*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
961*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
962*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel1_));
963*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel2_));
964*d9f75844SAndroid Build Coastguard Worker SendRtp1();
965*d9f75844SAndroid Build Coastguard Worker SendRtp2();
966*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
967*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
968*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
969*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
970*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
971*d9f75844SAndroid Build Coastguard Worker }
972*d9f75844SAndroid Build Coastguard Worker
973*d9f75844SAndroid Build Coastguard Worker // Test that we can send and receive early media when a provisional answer is
974*d9f75844SAndroid Build Coastguard Worker // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
SendEarlyMediaUsingRtcpMuxSrtp()975*d9f75844SAndroid Build Coastguard Worker void SendEarlyMediaUsingRtcpMuxSrtp() {
976*d9f75844SAndroid Build Coastguard Worker int sequence_number1_1 = 0, sequence_number2_2 = 0;
977*d9f75844SAndroid Build Coastguard Worker
978*d9f75844SAndroid Build Coastguard Worker CreateChannels(SSRC_MUX | RTCP_MUX | DTLS, SSRC_MUX | RTCP_MUX | DTLS);
979*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendOffer());
980*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendProvisionalAnswer());
981*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel1_));
982*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel2_));
983*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
984*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
985*d9f75844SAndroid Build Coastguard Worker WaitForThreads(); // Wait for 'sending' flag go through network thread.
986*d9f75844SAndroid Build Coastguard Worker SendCustomRtp1(kSsrc1, ++sequence_number1_1);
987*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
988*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
989*d9f75844SAndroid Build Coastguard Worker
990*d9f75844SAndroid Build Coastguard Worker // Send packets from callee and verify that it is received.
991*d9f75844SAndroid Build Coastguard Worker SendCustomRtp2(kSsrc2, ++sequence_number2_2);
992*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
993*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
994*d9f75844SAndroid Build Coastguard Worker
995*d9f75844SAndroid Build Coastguard Worker // Complete call setup and ensure everything is still OK.
996*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendFinalAnswer());
997*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel1_));
998*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsSrtpActive(channel2_));
999*d9f75844SAndroid Build Coastguard Worker SendCustomRtp1(kSsrc1, ++sequence_number1_1);
1000*d9f75844SAndroid Build Coastguard Worker SendCustomRtp2(kSsrc2, ++sequence_number2_2);
1001*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1002*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
1003*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
1004*d9f75844SAndroid Build Coastguard Worker }
1005*d9f75844SAndroid Build Coastguard Worker
1006*d9f75844SAndroid Build Coastguard Worker // Test that we properly send RTP without SRTP from a thread.
SendRtpToRtpOnThread()1007*d9f75844SAndroid Build Coastguard Worker void SendRtpToRtpOnThread() {
1008*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1009*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
1010*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
1011*d9f75844SAndroid Build Coastguard Worker ScopedCallThread send_rtp1([this] { SendRtp1(); });
1012*d9f75844SAndroid Build Coastguard Worker ScopedCallThread send_rtp2([this] { SendRtp2(); });
1013*d9f75844SAndroid Build Coastguard Worker rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread()};
1014*d9f75844SAndroid Build Coastguard Worker WaitForThreads(involved_threads);
1015*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1016*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
1017*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1018*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1019*d9f75844SAndroid Build Coastguard Worker }
1020*d9f75844SAndroid Build Coastguard Worker
1021*d9f75844SAndroid Build Coastguard Worker // Test that the mediachannel retains its sending state after the transport
1022*d9f75844SAndroid Build Coastguard Worker // becomes non-writable.
SendWithWritabilityLoss()1023*d9f75844SAndroid Build Coastguard Worker void SendWithWritabilityLoss() {
1024*d9f75844SAndroid Build Coastguard Worker CreateChannels(RTCP_MUX, RTCP_MUX);
1025*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
1026*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
1027*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel1_));
1028*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpMuxEnabled(channel2_));
1029*d9f75844SAndroid Build Coastguard Worker SendRtp1();
1030*d9f75844SAndroid Build Coastguard Worker SendRtp2();
1031*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1032*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1033*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
1034*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1035*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1036*d9f75844SAndroid Build Coastguard Worker
1037*d9f75844SAndroid Build Coastguard Worker // Lose writability, which should fail.
1038*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_,
1039*d9f75844SAndroid Build Coastguard Worker [this] { fake_rtp_dtls_transport1_->SetWritable(false); });
1040*d9f75844SAndroid Build Coastguard Worker SendRtp1();
1041*d9f75844SAndroid Build Coastguard Worker SendRtp2();
1042*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1043*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1044*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1045*d9f75844SAndroid Build Coastguard Worker
1046*d9f75844SAndroid Build Coastguard Worker // Regain writability
1047*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_,
1048*d9f75844SAndroid Build Coastguard Worker [this] { fake_rtp_dtls_transport1_->SetWritable(true); });
1049*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
1050*d9f75844SAndroid Build Coastguard Worker SendRtp1();
1051*d9f75844SAndroid Build Coastguard Worker SendRtp2();
1052*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1053*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1054*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
1055*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1056*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1057*d9f75844SAndroid Build Coastguard Worker
1058*d9f75844SAndroid Build Coastguard Worker // Lose writability completely
1059*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this] {
1060*d9f75844SAndroid Build Coastguard Worker bool asymmetric = true;
1061*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
1062*d9f75844SAndroid Build Coastguard Worker });
1063*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
1064*d9f75844SAndroid Build Coastguard Worker
1065*d9f75844SAndroid Build Coastguard Worker // Should fail also.
1066*d9f75844SAndroid Build Coastguard Worker SendRtp1();
1067*d9f75844SAndroid Build Coastguard Worker SendRtp2();
1068*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1069*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1070*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1071*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1072*d9f75844SAndroid Build Coastguard Worker
1073*d9f75844SAndroid Build Coastguard Worker // Gain writability back
1074*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [this] {
1075*d9f75844SAndroid Build Coastguard Worker bool asymmetric = true;
1076*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
1077*d9f75844SAndroid Build Coastguard Worker asymmetric);
1078*d9f75844SAndroid Build Coastguard Worker });
1079*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->sending());
1080*d9f75844SAndroid Build Coastguard Worker SendRtp1();
1081*d9f75844SAndroid Build Coastguard Worker SendRtp2();
1082*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1083*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp1());
1084*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckRtp2());
1085*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1086*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1087*d9f75844SAndroid Build Coastguard Worker }
1088*d9f75844SAndroid Build Coastguard Worker
SendBundleToBundle(const int * pl_types,int len,bool rtcp_mux,bool secure)1089*d9f75844SAndroid Build Coastguard Worker void SendBundleToBundle(const int* pl_types,
1090*d9f75844SAndroid Build Coastguard Worker int len,
1091*d9f75844SAndroid Build Coastguard Worker bool rtcp_mux,
1092*d9f75844SAndroid Build Coastguard Worker bool secure) {
1093*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2, len);
1094*d9f75844SAndroid Build Coastguard Worker int sequence_number1_1 = 0, sequence_number2_2 = 0;
1095*d9f75844SAndroid Build Coastguard Worker // Only pl_type1 was added to the bundle filter for both `channel1_`
1096*d9f75844SAndroid Build Coastguard Worker // and `channel2_`.
1097*d9f75844SAndroid Build Coastguard Worker int pl_type1 = pl_types[0];
1098*d9f75844SAndroid Build Coastguard Worker int pl_type2 = pl_types[1];
1099*d9f75844SAndroid Build Coastguard Worker int flags = SSRC_MUX;
1100*d9f75844SAndroid Build Coastguard Worker if (secure)
1101*d9f75844SAndroid Build Coastguard Worker flags |= DTLS;
1102*d9f75844SAndroid Build Coastguard Worker if (rtcp_mux) {
1103*d9f75844SAndroid Build Coastguard Worker flags |= RTCP_MUX;
1104*d9f75844SAndroid Build Coastguard Worker }
1105*d9f75844SAndroid Build Coastguard Worker CreateChannels(flags, flags);
1106*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendInitiate());
1107*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SendAccept());
1108*d9f75844SAndroid Build Coastguard Worker
1109*d9f75844SAndroid Build Coastguard Worker // Both channels can receive pl_type1 only.
1110*d9f75844SAndroid Build Coastguard Worker SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
1111*d9f75844SAndroid Build Coastguard Worker SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
1112*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1113*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
1114*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
1115*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp1());
1116*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(CheckNoRtp2());
1117*d9f75844SAndroid Build Coastguard Worker
1118*d9f75844SAndroid Build Coastguard Worker SendCustomRtp1(kSsrc3, ++sequence_number1_1, pl_type2);
1119*d9f75844SAndroid Build Coastguard Worker SendCustomRtp2(kSsrc4, ++sequence_number2_2, pl_type2);
1120*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1121*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(CheckCustomRtp2(kSsrc3, sequence_number1_1, pl_type2));
1122*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(CheckCustomRtp1(kSsrc4, sequence_number2_2, pl_type2));
1123*d9f75844SAndroid Build Coastguard Worker }
1124*d9f75844SAndroid Build Coastguard Worker
TestSetContentFailure()1125*d9f75844SAndroid Build Coastguard Worker void TestSetContentFailure() {
1126*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1127*d9f75844SAndroid Build Coastguard Worker
1128*d9f75844SAndroid Build Coastguard Worker std::string err;
1129*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content(
1130*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(1));
1131*d9f75844SAndroid Build Coastguard Worker
1132*d9f75844SAndroid Build Coastguard Worker media_channel1()->set_fail_set_recv_codecs(true);
1133*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(
1134*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content.get(), SdpType::kOffer, err));
1135*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(
1136*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content.get(), SdpType::kAnswer, err));
1137*d9f75844SAndroid Build Coastguard Worker
1138*d9f75844SAndroid Build Coastguard Worker media_channel1()->set_fail_set_send_codecs(true);
1139*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(
1140*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content.get(), SdpType::kOffer, err));
1141*d9f75844SAndroid Build Coastguard Worker
1142*d9f75844SAndroid Build Coastguard Worker media_channel1()->set_fail_set_send_codecs(true);
1143*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(
1144*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, err));
1145*d9f75844SAndroid Build Coastguard Worker }
1146*d9f75844SAndroid Build Coastguard Worker
TestSendTwoOffers()1147*d9f75844SAndroid Build Coastguard Worker void TestSendTwoOffers() {
1148*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1149*d9f75844SAndroid Build Coastguard Worker
1150*d9f75844SAndroid Build Coastguard Worker std::string err;
1151*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content1(
1152*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(1));
1153*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1154*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
1155*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(1));
1156*d9f75844SAndroid Build Coastguard Worker
1157*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content2(
1158*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(2));
1159*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1160*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content2.get(), SdpType::kOffer, err));
1161*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->HasSendStream(1));
1162*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(2));
1163*d9f75844SAndroid Build Coastguard Worker }
1164*d9f75844SAndroid Build Coastguard Worker
TestReceiveTwoOffers()1165*d9f75844SAndroid Build Coastguard Worker void TestReceiveTwoOffers() {
1166*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1167*d9f75844SAndroid Build Coastguard Worker
1168*d9f75844SAndroid Build Coastguard Worker std::string err;
1169*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content1(
1170*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(1));
1171*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1172*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
1173*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1174*d9f75844SAndroid Build Coastguard Worker
1175*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content2(
1176*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(2));
1177*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1178*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, err));
1179*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->HasRecvStream(1));
1180*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(2));
1181*d9f75844SAndroid Build Coastguard Worker }
1182*d9f75844SAndroid Build Coastguard Worker
TestSendPrAnswer()1183*d9f75844SAndroid Build Coastguard Worker void TestSendPrAnswer() {
1184*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1185*d9f75844SAndroid Build Coastguard Worker
1186*d9f75844SAndroid Build Coastguard Worker std::string err;
1187*d9f75844SAndroid Build Coastguard Worker // Receive offer
1188*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content1(
1189*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(1));
1190*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1191*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, err));
1192*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1193*d9f75844SAndroid Build Coastguard Worker
1194*d9f75844SAndroid Build Coastguard Worker // Send PR answer
1195*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content2(
1196*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(2));
1197*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1198*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, err));
1199*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1200*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(2));
1201*d9f75844SAndroid Build Coastguard Worker
1202*d9f75844SAndroid Build Coastguard Worker // Send answer
1203*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content3(
1204*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(3));
1205*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1206*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, err));
1207*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(1));
1208*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->HasSendStream(2));
1209*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(3));
1210*d9f75844SAndroid Build Coastguard Worker }
1211*d9f75844SAndroid Build Coastguard Worker
TestReceivePrAnswer()1212*d9f75844SAndroid Build Coastguard Worker void TestReceivePrAnswer() {
1213*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1214*d9f75844SAndroid Build Coastguard Worker
1215*d9f75844SAndroid Build Coastguard Worker std::string err;
1216*d9f75844SAndroid Build Coastguard Worker // Send offer
1217*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content1(
1218*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(1));
1219*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1220*d9f75844SAndroid Build Coastguard Worker channel1_->SetLocalContent(content1.get(), SdpType::kOffer, err));
1221*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(1));
1222*d9f75844SAndroid Build Coastguard Worker
1223*d9f75844SAndroid Build Coastguard Worker // Receive PR answer
1224*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content2(
1225*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(2));
1226*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1227*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, err));
1228*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(1));
1229*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(2));
1230*d9f75844SAndroid Build Coastguard Worker
1231*d9f75844SAndroid Build Coastguard Worker // Receive answer
1232*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Content> content3(
1233*d9f75844SAndroid Build Coastguard Worker CreateMediaContentWithStream(3));
1234*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
1235*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, err));
1236*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasSendStream(1));
1237*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->HasRecvStream(2));
1238*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->HasRecvStream(3));
1239*d9f75844SAndroid Build Coastguard Worker }
1240*d9f75844SAndroid Build Coastguard Worker
TestOnTransportReadyToSend()1241*d9f75844SAndroid Build Coastguard Worker void TestOnTransportReadyToSend() {
1242*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1243*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->ready_to_send());
1244*d9f75844SAndroid Build Coastguard Worker
1245*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(
1246*d9f75844SAndroid Build Coastguard Worker [this] { channel1_->OnTransportReadyToSend(true); });
1247*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1248*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->ready_to_send());
1249*d9f75844SAndroid Build Coastguard Worker
1250*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(
1251*d9f75844SAndroid Build Coastguard Worker [this] { channel1_->OnTransportReadyToSend(false); });
1252*d9f75844SAndroid Build Coastguard Worker WaitForThreads();
1253*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->ready_to_send());
1254*d9f75844SAndroid Build Coastguard Worker }
1255*d9f75844SAndroid Build Coastguard Worker
SetRemoteContentWithBitrateLimit(int remote_limit)1256*d9f75844SAndroid Build Coastguard Worker bool SetRemoteContentWithBitrateLimit(int remote_limit) {
1257*d9f75844SAndroid Build Coastguard Worker typename T::Content content;
1258*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, &content);
1259*d9f75844SAndroid Build Coastguard Worker content.set_bandwidth(remote_limit);
1260*d9f75844SAndroid Build Coastguard Worker return channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL);
1261*d9f75844SAndroid Build Coastguard Worker }
1262*d9f75844SAndroid Build Coastguard Worker
BitrateLimitedParameters(absl::optional<int> limit)1263*d9f75844SAndroid Build Coastguard Worker webrtc::RtpParameters BitrateLimitedParameters(absl::optional<int> limit) {
1264*d9f75844SAndroid Build Coastguard Worker webrtc::RtpParameters parameters;
1265*d9f75844SAndroid Build Coastguard Worker webrtc::RtpEncodingParameters encoding;
1266*d9f75844SAndroid Build Coastguard Worker encoding.max_bitrate_bps = limit;
1267*d9f75844SAndroid Build Coastguard Worker parameters.encodings.push_back(encoding);
1268*d9f75844SAndroid Build Coastguard Worker return parameters;
1269*d9f75844SAndroid Build Coastguard Worker }
1270*d9f75844SAndroid Build Coastguard Worker
VerifyMaxBitrate(const webrtc::RtpParameters & parameters,absl::optional<int> expected_bitrate)1271*d9f75844SAndroid Build Coastguard Worker void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
1272*d9f75844SAndroid Build Coastguard Worker absl::optional<int> expected_bitrate) {
1273*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1UL, parameters.encodings.size());
1274*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
1275*d9f75844SAndroid Build Coastguard Worker }
1276*d9f75844SAndroid Build Coastguard Worker
DefaultMaxBitrateIsUnlimited()1277*d9f75844SAndroid Build Coastguard Worker void DefaultMaxBitrateIsUnlimited() {
1278*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1279*d9f75844SAndroid Build Coastguard Worker std::string err;
1280*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
1281*d9f75844SAndroid Build Coastguard Worker SdpType::kOffer, err));
1282*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->max_bps(), -1);
1283*d9f75844SAndroid Build Coastguard Worker VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
1284*d9f75844SAndroid Build Coastguard Worker absl::nullopt);
1285*d9f75844SAndroid Build Coastguard Worker }
1286*d9f75844SAndroid Build Coastguard Worker
1287*d9f75844SAndroid Build Coastguard Worker // Test that when a channel gets new RtpTransport with a call to
1288*d9f75844SAndroid Build Coastguard Worker // `SetRtpTransport`, the socket options from the old RtpTransport is merged
1289*d9f75844SAndroid Build Coastguard Worker // with the options on the new one.
1290*d9f75844SAndroid Build Coastguard Worker
1291*d9f75844SAndroid Build Coastguard Worker // For example, audio and video may use separate socket options, but initially
1292*d9f75844SAndroid Build Coastguard Worker // be unbundled, then later become bundled. When this happens, their preferred
1293*d9f75844SAndroid Build Coastguard Worker // socket options should be merged to the underlying transport they share.
SocketOptionsMergedOnSetTransport()1294*d9f75844SAndroid Build Coastguard Worker void SocketOptionsMergedOnSetTransport() {
1295*d9f75844SAndroid Build Coastguard Worker constexpr int kSndBufSize = 4000;
1296*d9f75844SAndroid Build Coastguard Worker constexpr int kRcvBufSize = 8000;
1297*d9f75844SAndroid Build Coastguard Worker
1298*d9f75844SAndroid Build Coastguard Worker CreateChannels(DTLS, DTLS);
1299*d9f75844SAndroid Build Coastguard Worker
1300*d9f75844SAndroid Build Coastguard Worker new_rtp_transport_ = CreateDtlsSrtpTransport(
1301*d9f75844SAndroid Build Coastguard Worker fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
1302*d9f75844SAndroid Build Coastguard Worker
1303*d9f75844SAndroid Build Coastguard Worker bool rcv_success, send_success;
1304*d9f75844SAndroid Build Coastguard Worker int rcv_buf, send_buf;
1305*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_, [&] {
1306*d9f75844SAndroid Build Coastguard Worker channel1_->SetOption(cricket::BaseChannel::ST_RTP,
1307*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
1308*d9f75844SAndroid Build Coastguard Worker channel2_->SetOption(cricket::BaseChannel::ST_RTP,
1309*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
1310*d9f75844SAndroid Build Coastguard Worker channel1_->SetRtpTransport(new_rtp_transport_.get());
1311*d9f75844SAndroid Build Coastguard Worker send_success = fake_rtp_dtls_transport2_->GetOption(
1312*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option::OPT_SNDBUF, &send_buf);
1313*d9f75844SAndroid Build Coastguard Worker rcv_success = fake_rtp_dtls_transport2_->GetOption(
1314*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option::OPT_RCVBUF, &rcv_buf);
1315*d9f75844SAndroid Build Coastguard Worker });
1316*d9f75844SAndroid Build Coastguard Worker
1317*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(send_success);
1318*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kSndBufSize, send_buf);
1319*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(rcv_success);
1320*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kRcvBufSize, rcv_buf);
1321*d9f75844SAndroid Build Coastguard Worker }
1322*d9f75844SAndroid Build Coastguard Worker
CreateSimulcastContent(const std::vector<std::string> & rids,typename T::Content * content)1323*d9f75844SAndroid Build Coastguard Worker void CreateSimulcastContent(const std::vector<std::string>& rids,
1324*d9f75844SAndroid Build Coastguard Worker typename T::Content* content) {
1325*d9f75844SAndroid Build Coastguard Worker std::vector<RidDescription> rid_descriptions;
1326*d9f75844SAndroid Build Coastguard Worker for (const std::string& name : rids) {
1327*d9f75844SAndroid Build Coastguard Worker rid_descriptions.push_back(RidDescription(name, RidDirection::kSend));
1328*d9f75844SAndroid Build Coastguard Worker }
1329*d9f75844SAndroid Build Coastguard Worker
1330*d9f75844SAndroid Build Coastguard Worker StreamParams stream;
1331*d9f75844SAndroid Build Coastguard Worker stream.set_rids(rid_descriptions);
1332*d9f75844SAndroid Build Coastguard Worker CreateContent(0, kPcmuCodec, kH264Codec, content);
1333*d9f75844SAndroid Build Coastguard Worker // This is for unified plan, so there can be only one StreamParams.
1334*d9f75844SAndroid Build Coastguard Worker content->mutable_streams().clear();
1335*d9f75844SAndroid Build Coastguard Worker content->AddStream(stream);
1336*d9f75844SAndroid Build Coastguard Worker }
1337*d9f75844SAndroid Build Coastguard Worker
VerifySimulcastStreamParams(const StreamParams & expected,const typename T::Channel * channel)1338*d9f75844SAndroid Build Coastguard Worker void VerifySimulcastStreamParams(const StreamParams& expected,
1339*d9f75844SAndroid Build Coastguard Worker const typename T::Channel* channel) {
1340*d9f75844SAndroid Build Coastguard Worker const std::vector<StreamParams>& streams = channel->local_streams();
1341*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, streams.size());
1342*d9f75844SAndroid Build Coastguard Worker const StreamParams& result = streams[0];
1343*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(expected.rids(), result.rids());
1344*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.has_ssrcs());
1345*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(expected.rids().size() * 2, result.ssrcs.size());
1346*d9f75844SAndroid Build Coastguard Worker std::vector<uint32_t> primary_ssrcs;
1347*d9f75844SAndroid Build Coastguard Worker result.GetPrimarySsrcs(&primary_ssrcs);
1348*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(expected.rids().size(), primary_ssrcs.size());
1349*d9f75844SAndroid Build Coastguard Worker }
1350*d9f75844SAndroid Build Coastguard Worker
TestUpdateLocalStreamsWithSimulcast()1351*d9f75844SAndroid Build Coastguard Worker void TestUpdateLocalStreamsWithSimulcast() {
1352*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
1353*d9f75844SAndroid Build Coastguard Worker typename T::Content content1, content2, content3;
1354*d9f75844SAndroid Build Coastguard Worker CreateSimulcastContent({"f", "h", "q"}, &content1);
1355*d9f75844SAndroid Build Coastguard Worker std::string err;
1356*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, err));
1357*d9f75844SAndroid Build Coastguard Worker VerifySimulcastStreamParams(content1.streams()[0], channel1_.get());
1358*d9f75844SAndroid Build Coastguard Worker StreamParams stream1 = channel1_->local_streams()[0];
1359*d9f75844SAndroid Build Coastguard Worker
1360*d9f75844SAndroid Build Coastguard Worker // Create a similar offer. SetLocalContent should not remove and add.
1361*d9f75844SAndroid Build Coastguard Worker CreateSimulcastContent({"f", "h", "q"}, &content2);
1362*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content2, SdpType::kOffer, err));
1363*d9f75844SAndroid Build Coastguard Worker VerifySimulcastStreamParams(content2.streams()[0], channel1_.get());
1364*d9f75844SAndroid Build Coastguard Worker StreamParams stream2 = channel1_->local_streams()[0];
1365*d9f75844SAndroid Build Coastguard Worker // Check that the streams are identical (SSRCs didn't change).
1366*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stream1, stream2);
1367*d9f75844SAndroid Build Coastguard Worker
1368*d9f75844SAndroid Build Coastguard Worker // Create third offer that has same RIDs in different order.
1369*d9f75844SAndroid Build Coastguard Worker CreateSimulcastContent({"f", "q", "h"}, &content3);
1370*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&content3, SdpType::kOffer, err));
1371*d9f75844SAndroid Build Coastguard Worker VerifySimulcastStreamParams(content3.streams()[0], channel1_.get());
1372*d9f75844SAndroid Build Coastguard Worker }
1373*d9f75844SAndroid Build Coastguard Worker
1374*d9f75844SAndroid Build Coastguard Worker protected:
WaitForThreads()1375*d9f75844SAndroid Build Coastguard Worker void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
ProcessThreadQueue(rtc::Thread * thread)1376*d9f75844SAndroid Build Coastguard Worker static void ProcessThreadQueue(rtc::Thread* thread) {
1377*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(thread->IsCurrent());
1378*d9f75844SAndroid Build Coastguard Worker while (!thread->empty()) {
1379*d9f75844SAndroid Build Coastguard Worker thread->ProcessMessages(0);
1380*d9f75844SAndroid Build Coastguard Worker }
1381*d9f75844SAndroid Build Coastguard Worker }
FlushCurrentThread()1382*d9f75844SAndroid Build Coastguard Worker static void FlushCurrentThread() {
1383*d9f75844SAndroid Build Coastguard Worker rtc::Thread::Current()->ProcessMessages(0);
1384*d9f75844SAndroid Build Coastguard Worker }
WaitForThreads(rtc::ArrayView<rtc::Thread * > threads)1385*d9f75844SAndroid Build Coastguard Worker void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
1386*d9f75844SAndroid Build Coastguard Worker // `threads` and current thread post packets to network thread.
1387*d9f75844SAndroid Build Coastguard Worker for (rtc::Thread* thread : threads) {
1388*d9f75844SAndroid Build Coastguard Worker SendTask(thread, [thread] { ProcessThreadQueue(thread); });
1389*d9f75844SAndroid Build Coastguard Worker }
1390*d9f75844SAndroid Build Coastguard Worker ProcessThreadQueue(rtc::Thread::Current());
1391*d9f75844SAndroid Build Coastguard Worker // Network thread move them around and post back to worker = current thread.
1392*d9f75844SAndroid Build Coastguard Worker if (!network_thread_->IsCurrent()) {
1393*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread_,
1394*d9f75844SAndroid Build Coastguard Worker [this] { ProcessThreadQueue(network_thread_); });
1395*d9f75844SAndroid Build Coastguard Worker }
1396*d9f75844SAndroid Build Coastguard Worker // Worker thread = current Thread process received messages.
1397*d9f75844SAndroid Build Coastguard Worker ProcessThreadQueue(rtc::Thread::Current());
1398*d9f75844SAndroid Build Coastguard Worker }
1399*d9f75844SAndroid Build Coastguard Worker
media_channel1()1400*d9f75844SAndroid Build Coastguard Worker typename T::MediaChannel* media_channel1() {
1401*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel1_);
1402*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel1_->media_channel());
1403*d9f75844SAndroid Build Coastguard Worker return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
1404*d9f75844SAndroid Build Coastguard Worker }
1405*d9f75844SAndroid Build Coastguard Worker
media_channel2()1406*d9f75844SAndroid Build Coastguard Worker typename T::MediaChannel* media_channel2() {
1407*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel2_);
1408*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(channel2_->media_channel());
1409*d9f75844SAndroid Build Coastguard Worker return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
1410*d9f75844SAndroid Build Coastguard Worker }
1411*d9f75844SAndroid Build Coastguard Worker
1412*d9f75844SAndroid Build Coastguard Worker rtc::AutoThread main_thread_;
1413*d9f75844SAndroid Build Coastguard Worker // TODO(pbos): Remove playout from all media channels and let renderers mute
1414*d9f75844SAndroid Build Coastguard Worker // themselves.
1415*d9f75844SAndroid Build Coastguard Worker const bool verify_playout_;
1416*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
1417*d9f75844SAndroid Build Coastguard Worker webrtc::PendingTaskSafetyFlag::CreateDetached();
1418*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::Thread> network_thread_keeper_;
1419*d9f75844SAndroid Build Coastguard Worker rtc::Thread* network_thread_;
1420*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
1421*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
1422*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
1423*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
1424*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
1425*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
1426*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
1427*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
1428*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport1_;
1429*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
1430*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
1431*d9f75844SAndroid Build Coastguard Worker cricket::FakeMediaEngine media_engine_;
1432*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Channel> channel1_;
1433*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<typename T::Channel> channel2_;
1434*d9f75844SAndroid Build Coastguard Worker typename T::Content local_media_content1_;
1435*d9f75844SAndroid Build Coastguard Worker typename T::Content local_media_content2_;
1436*d9f75844SAndroid Build Coastguard Worker typename T::Content remote_media_content1_;
1437*d9f75844SAndroid Build Coastguard Worker typename T::Content remote_media_content2_;
1438*d9f75844SAndroid Build Coastguard Worker // The RTP and RTCP packets to send in the tests.
1439*d9f75844SAndroid Build Coastguard Worker rtc::Buffer rtp_packet_;
1440*d9f75844SAndroid Build Coastguard Worker rtc::Buffer rtcp_packet_;
1441*d9f75844SAndroid Build Coastguard Worker cricket::CandidatePairInterface* last_selected_candidate_pair_;
1442*d9f75844SAndroid Build Coastguard Worker rtc::UniqueRandomIdGenerator ssrc_generator_;
1443*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials_;
1444*d9f75844SAndroid Build Coastguard Worker };
1445*d9f75844SAndroid Build Coastguard Worker
1446*d9f75844SAndroid Build Coastguard Worker template <>
CreateChannel(rtc::Thread * worker_thread,rtc::Thread * network_thread,std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,webrtc::RtpTransportInternal * rtp_transport,int flags)1447*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::VoiceChannel> ChannelTest<VoiceTraits>::CreateChannel(
1448*d9f75844SAndroid Build Coastguard Worker rtc::Thread* worker_thread,
1449*d9f75844SAndroid Build Coastguard Worker rtc::Thread* network_thread,
1450*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeVoiceMediaChannel> ch,
1451*d9f75844SAndroid Build Coastguard Worker webrtc::RtpTransportInternal* rtp_transport,
1452*d9f75844SAndroid Build Coastguard Worker int flags) {
1453*d9f75844SAndroid Build Coastguard Worker rtc::Thread* signaling_thread = rtc::Thread::Current();
1454*d9f75844SAndroid Build Coastguard Worker auto channel = std::make_unique<cricket::VoiceChannel>(
1455*d9f75844SAndroid Build Coastguard Worker worker_thread, network_thread, signaling_thread, std::move(ch),
1456*d9f75844SAndroid Build Coastguard Worker cricket::CN_AUDIO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1457*d9f75844SAndroid Build Coastguard Worker &ssrc_generator_);
1458*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread, [&]() {
1459*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(channel->network_thread());
1460*d9f75844SAndroid Build Coastguard Worker channel->SetRtpTransport(rtp_transport);
1461*d9f75844SAndroid Build Coastguard Worker });
1462*d9f75844SAndroid Build Coastguard Worker return channel;
1463*d9f75844SAndroid Build Coastguard Worker }
1464*d9f75844SAndroid Build Coastguard Worker
1465*d9f75844SAndroid Build Coastguard Worker template <>
CreateContent(int flags,const cricket::AudioCodec & audio_codec,const cricket::VideoCodec & video_codec,cricket::AudioContentDescription * audio)1466*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VoiceTraits>::CreateContent(
1467*d9f75844SAndroid Build Coastguard Worker int flags,
1468*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec& audio_codec,
1469*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec& video_codec,
1470*d9f75844SAndroid Build Coastguard Worker cricket::AudioContentDescription* audio) {
1471*d9f75844SAndroid Build Coastguard Worker audio->AddCodec(audio_codec);
1472*d9f75844SAndroid Build Coastguard Worker audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
1473*d9f75844SAndroid Build Coastguard Worker }
1474*d9f75844SAndroid Build Coastguard Worker
1475*d9f75844SAndroid Build Coastguard Worker template <>
CopyContent(const cricket::AudioContentDescription & source,cricket::AudioContentDescription * audio)1476*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VoiceTraits>::CopyContent(
1477*d9f75844SAndroid Build Coastguard Worker const cricket::AudioContentDescription& source,
1478*d9f75844SAndroid Build Coastguard Worker cricket::AudioContentDescription* audio) {
1479*d9f75844SAndroid Build Coastguard Worker *audio = source;
1480*d9f75844SAndroid Build Coastguard Worker }
1481*d9f75844SAndroid Build Coastguard Worker
1482*d9f75844SAndroid Build Coastguard Worker template <>
CodecMatches(const cricket::AudioCodec & c1,const cricket::AudioCodec & c2)1483*d9f75844SAndroid Build Coastguard Worker bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
1484*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec& c2) {
1485*d9f75844SAndroid Build Coastguard Worker return c1.name == c2.name && c1.clockrate == c2.clockrate &&
1486*d9f75844SAndroid Build Coastguard Worker c1.bitrate == c2.bitrate && c1.channels == c2.channels;
1487*d9f75844SAndroid Build Coastguard Worker }
1488*d9f75844SAndroid Build Coastguard Worker
1489*d9f75844SAndroid Build Coastguard Worker template <>
AddLegacyStreamInContent(uint32_t ssrc,int flags,cricket::AudioContentDescription * audio)1490*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
1491*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
1492*d9f75844SAndroid Build Coastguard Worker int flags,
1493*d9f75844SAndroid Build Coastguard Worker cricket::AudioContentDescription* audio) {
1494*d9f75844SAndroid Build Coastguard Worker audio->AddLegacyStream(ssrc);
1495*d9f75844SAndroid Build Coastguard Worker }
1496*d9f75844SAndroid Build Coastguard Worker
1497*d9f75844SAndroid Build Coastguard Worker class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
1498*d9f75844SAndroid Build Coastguard Worker public:
1499*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VoiceTraits> Base;
VoiceChannelSingleThreadTest()1500*d9f75844SAndroid Build Coastguard Worker VoiceChannelSingleThreadTest()
1501*d9f75844SAndroid Build Coastguard Worker : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
1502*d9f75844SAndroid Build Coastguard Worker };
1503*d9f75844SAndroid Build Coastguard Worker
1504*d9f75844SAndroid Build Coastguard Worker class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
1505*d9f75844SAndroid Build Coastguard Worker public:
1506*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VoiceTraits> Base;
VoiceChannelDoubleThreadTest()1507*d9f75844SAndroid Build Coastguard Worker VoiceChannelDoubleThreadTest()
1508*d9f75844SAndroid Build Coastguard Worker : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
1509*d9f75844SAndroid Build Coastguard Worker };
1510*d9f75844SAndroid Build Coastguard Worker
1511*d9f75844SAndroid Build Coastguard Worker class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
1512*d9f75844SAndroid Build Coastguard Worker : public ChannelTest<VoiceTraits> {
1513*d9f75844SAndroid Build Coastguard Worker public:
1514*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VoiceTraits> Base;
VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()1515*d9f75844SAndroid Build Coastguard Worker VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
1516*d9f75844SAndroid Build Coastguard Worker : Base(true,
1517*d9f75844SAndroid Build Coastguard Worker kPcmuFrameWithExtensions,
1518*d9f75844SAndroid Build Coastguard Worker kRtcpReport,
1519*d9f75844SAndroid Build Coastguard Worker NetworkIsWorker::Yes) {}
1520*d9f75844SAndroid Build Coastguard Worker };
1521*d9f75844SAndroid Build Coastguard Worker
1522*d9f75844SAndroid Build Coastguard Worker class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
1523*d9f75844SAndroid Build Coastguard Worker : public ChannelTest<VoiceTraits> {
1524*d9f75844SAndroid Build Coastguard Worker public:
1525*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VoiceTraits> Base;
VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()1526*d9f75844SAndroid Build Coastguard Worker VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
1527*d9f75844SAndroid Build Coastguard Worker : Base(true, kPcmuFrameWithExtensions, kRtcpReport, NetworkIsWorker::No) {
1528*d9f75844SAndroid Build Coastguard Worker }
1529*d9f75844SAndroid Build Coastguard Worker };
1530*d9f75844SAndroid Build Coastguard Worker
1531*d9f75844SAndroid Build Coastguard Worker // override to add NULL parameter
1532*d9f75844SAndroid Build Coastguard Worker template <>
CreateChannel(rtc::Thread * worker_thread,rtc::Thread * network_thread,std::unique_ptr<cricket::FakeVideoMediaChannel> ch,webrtc::RtpTransportInternal * rtp_transport,int flags)1533*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::VideoChannel> ChannelTest<VideoTraits>::CreateChannel(
1534*d9f75844SAndroid Build Coastguard Worker rtc::Thread* worker_thread,
1535*d9f75844SAndroid Build Coastguard Worker rtc::Thread* network_thread,
1536*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<cricket::FakeVideoMediaChannel> ch,
1537*d9f75844SAndroid Build Coastguard Worker webrtc::RtpTransportInternal* rtp_transport,
1538*d9f75844SAndroid Build Coastguard Worker int flags) {
1539*d9f75844SAndroid Build Coastguard Worker rtc::Thread* signaling_thread = rtc::Thread::Current();
1540*d9f75844SAndroid Build Coastguard Worker auto channel = std::make_unique<cricket::VideoChannel>(
1541*d9f75844SAndroid Build Coastguard Worker worker_thread, network_thread, signaling_thread, std::move(ch),
1542*d9f75844SAndroid Build Coastguard Worker cricket::CN_VIDEO, (flags & DTLS) != 0, webrtc::CryptoOptions(),
1543*d9f75844SAndroid Build Coastguard Worker &ssrc_generator_);
1544*d9f75844SAndroid Build Coastguard Worker SendTask(network_thread, [&]() {
1545*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(channel->network_thread());
1546*d9f75844SAndroid Build Coastguard Worker channel->SetRtpTransport(rtp_transport);
1547*d9f75844SAndroid Build Coastguard Worker });
1548*d9f75844SAndroid Build Coastguard Worker return channel;
1549*d9f75844SAndroid Build Coastguard Worker }
1550*d9f75844SAndroid Build Coastguard Worker
1551*d9f75844SAndroid Build Coastguard Worker template <>
CreateContent(int flags,const cricket::AudioCodec & audio_codec,const cricket::VideoCodec & video_codec,cricket::VideoContentDescription * video)1552*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VideoTraits>::CreateContent(
1553*d9f75844SAndroid Build Coastguard Worker int flags,
1554*d9f75844SAndroid Build Coastguard Worker const cricket::AudioCodec& audio_codec,
1555*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec& video_codec,
1556*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription* video) {
1557*d9f75844SAndroid Build Coastguard Worker video->AddCodec(video_codec);
1558*d9f75844SAndroid Build Coastguard Worker video->set_rtcp_mux((flags & RTCP_MUX) != 0);
1559*d9f75844SAndroid Build Coastguard Worker }
1560*d9f75844SAndroid Build Coastguard Worker
1561*d9f75844SAndroid Build Coastguard Worker template <>
CopyContent(const cricket::VideoContentDescription & source,cricket::VideoContentDescription * video)1562*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VideoTraits>::CopyContent(
1563*d9f75844SAndroid Build Coastguard Worker const cricket::VideoContentDescription& source,
1564*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription* video) {
1565*d9f75844SAndroid Build Coastguard Worker *video = source;
1566*d9f75844SAndroid Build Coastguard Worker }
1567*d9f75844SAndroid Build Coastguard Worker
1568*d9f75844SAndroid Build Coastguard Worker template <>
CodecMatches(const cricket::VideoCodec & c1,const cricket::VideoCodec & c2)1569*d9f75844SAndroid Build Coastguard Worker bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
1570*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec& c2) {
1571*d9f75844SAndroid Build Coastguard Worker return c1.name == c2.name;
1572*d9f75844SAndroid Build Coastguard Worker }
1573*d9f75844SAndroid Build Coastguard Worker
1574*d9f75844SAndroid Build Coastguard Worker template <>
AddLegacyStreamInContent(uint32_t ssrc,int flags,cricket::VideoContentDescription * video)1575*d9f75844SAndroid Build Coastguard Worker void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
1576*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
1577*d9f75844SAndroid Build Coastguard Worker int flags,
1578*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription* video) {
1579*d9f75844SAndroid Build Coastguard Worker video->AddLegacyStream(ssrc);
1580*d9f75844SAndroid Build Coastguard Worker }
1581*d9f75844SAndroid Build Coastguard Worker
1582*d9f75844SAndroid Build Coastguard Worker class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
1583*d9f75844SAndroid Build Coastguard Worker public:
1584*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VideoTraits> Base;
VideoChannelSingleThreadTest()1585*d9f75844SAndroid Build Coastguard Worker VideoChannelSingleThreadTest()
1586*d9f75844SAndroid Build Coastguard Worker : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
1587*d9f75844SAndroid Build Coastguard Worker };
1588*d9f75844SAndroid Build Coastguard Worker
1589*d9f75844SAndroid Build Coastguard Worker class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
1590*d9f75844SAndroid Build Coastguard Worker public:
1591*d9f75844SAndroid Build Coastguard Worker typedef ChannelTest<VideoTraits> Base;
VideoChannelDoubleThreadTest()1592*d9f75844SAndroid Build Coastguard Worker VideoChannelDoubleThreadTest()
1593*d9f75844SAndroid Build Coastguard Worker : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
1594*d9f75844SAndroid Build Coastguard Worker };
1595*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestInit)1596*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestInit) {
1597*d9f75844SAndroid Build Coastguard Worker Base::TestInit();
1598*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1599*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
1600*d9f75844SAndroid Build Coastguard Worker }
1601*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestDeinit)1602*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
1603*d9f75844SAndroid Build Coastguard Worker Base::TestDeinit();
1604*d9f75844SAndroid Build Coastguard Worker }
1605*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContents)1606*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
1607*d9f75844SAndroid Build Coastguard Worker Base::TestSetContents();
1608*d9f75844SAndroid Build Coastguard Worker }
1609*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsExtmapAllowMixedAsCaller)1610*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1611*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1612*d9f75844SAndroid Build Coastguard Worker }
1613*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCaller)1614*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest,
1615*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1616*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1617*d9f75844SAndroid Build Coastguard Worker }
1618*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsExtmapAllowMixedAsCallee)1619*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1620*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1621*d9f75844SAndroid Build Coastguard Worker }
1622*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCallee)1623*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest,
1624*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1625*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1626*d9f75844SAndroid Build Coastguard Worker }
1627*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsNullOffer)1628*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
1629*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsNullOffer();
1630*d9f75844SAndroid Build Coastguard Worker }
1631*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsRtcpMux)1632*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
1633*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1634*d9f75844SAndroid Build Coastguard Worker }
1635*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentsRtcpMuxWithPrAnswer)1636*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1637*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1638*d9f75844SAndroid Build Coastguard Worker }
1639*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestChangeStreamParamsInContent)1640*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1641*d9f75844SAndroid Build Coastguard Worker Base::TestChangeStreamParamsInContent();
1642*d9f75844SAndroid Build Coastguard Worker }
1643*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestPlayoutAndSendingStates)1644*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1645*d9f75844SAndroid Build Coastguard Worker Base::TestPlayoutAndSendingStates();
1646*d9f75844SAndroid Build Coastguard Worker }
1647*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestMediaContentDirection)1648*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
1649*d9f75844SAndroid Build Coastguard Worker Base::TestMediaContentDirection();
1650*d9f75844SAndroid Build Coastguard Worker }
1651*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestNetworkRouteChanges)1652*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
1653*d9f75844SAndroid Build Coastguard Worker Base::TestNetworkRouteChanges();
1654*d9f75844SAndroid Build Coastguard Worker }
1655*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestCallSetup)1656*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
1657*d9f75844SAndroid Build Coastguard Worker Base::TestCallSetup();
1658*d9f75844SAndroid Build Coastguard Worker }
1659*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendRtpToRtp)1660*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
1661*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtp();
1662*d9f75844SAndroid Build Coastguard Worker }
1663*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendDtlsSrtpToDtlsSrtp)1664*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
1665*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(0, 0);
1666*d9f75844SAndroid Build Coastguard Worker }
1667*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendDtlsSrtpToDtlsSrtpRtcpMux)1668*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
1669*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
1670*d9f75844SAndroid Build Coastguard Worker }
1671*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendEarlyMediaUsingRtcpMuxSrtp)1672*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1673*d9f75844SAndroid Build Coastguard Worker Base::SendEarlyMediaUsingRtcpMuxSrtp();
1674*d9f75844SAndroid Build Coastguard Worker }
1675*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendRtpToRtpOnThread)1676*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
1677*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtpOnThread();
1678*d9f75844SAndroid Build Coastguard Worker }
1679*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendWithWritabilityLoss)1680*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
1681*d9f75844SAndroid Build Coastguard Worker Base::SendWithWritabilityLoss();
1682*d9f75844SAndroid Build Coastguard Worker }
1683*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSetContentFailure)1684*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
1685*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentFailure();
1686*d9f75844SAndroid Build Coastguard Worker }
1687*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSendTwoOffers)1688*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
1689*d9f75844SAndroid Build Coastguard Worker Base::TestSendTwoOffers();
1690*d9f75844SAndroid Build Coastguard Worker }
1691*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestReceiveTwoOffers)1692*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
1693*d9f75844SAndroid Build Coastguard Worker Base::TestReceiveTwoOffers();
1694*d9f75844SAndroid Build Coastguard Worker }
1695*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestSendPrAnswer)1696*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
1697*d9f75844SAndroid Build Coastguard Worker Base::TestSendPrAnswer();
1698*d9f75844SAndroid Build Coastguard Worker }
1699*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestReceivePrAnswer)1700*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
1701*d9f75844SAndroid Build Coastguard Worker Base::TestReceivePrAnswer();
1702*d9f75844SAndroid Build Coastguard Worker }
1703*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,TestOnTransportReadyToSend)1704*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
1705*d9f75844SAndroid Build Coastguard Worker Base::TestOnTransportReadyToSend();
1706*d9f75844SAndroid Build Coastguard Worker }
1707*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendBundleToBundle)1708*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
1709*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1710*d9f75844SAndroid Build Coastguard Worker }
1711*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendBundleToBundleSecure)1712*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
1713*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1714*d9f75844SAndroid Build Coastguard Worker }
1715*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendBundleToBundleWithRtcpMux)1716*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
1717*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1718*d9f75844SAndroid Build Coastguard Worker }
1719*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SendBundleToBundleWithRtcpMuxSecure)1720*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1721*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1722*d9f75844SAndroid Build Coastguard Worker }
1723*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,DefaultMaxBitrateIsUnlimited)1724*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
1725*d9f75844SAndroid Build Coastguard Worker Base::DefaultMaxBitrateIsUnlimited();
1726*d9f75844SAndroid Build Coastguard Worker }
1727*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelSingleThreadTest,SocketOptionsMergedOnSetTransport)1728*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
1729*d9f75844SAndroid Build Coastguard Worker Base::SocketOptionsMergedOnSetTransport();
1730*d9f75844SAndroid Build Coastguard Worker }
1731*d9f75844SAndroid Build Coastguard Worker
1732*d9f75844SAndroid Build Coastguard Worker // VoiceChannelDoubleThreadTest
TEST_F(VoiceChannelDoubleThreadTest,TestInit)1733*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
1734*d9f75844SAndroid Build Coastguard Worker Base::TestInit();
1735*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
1736*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
1737*d9f75844SAndroid Build Coastguard Worker }
1738*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestDeinit)1739*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
1740*d9f75844SAndroid Build Coastguard Worker Base::TestDeinit();
1741*d9f75844SAndroid Build Coastguard Worker }
1742*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContents)1743*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
1744*d9f75844SAndroid Build Coastguard Worker Base::TestSetContents();
1745*d9f75844SAndroid Build Coastguard Worker }
1746*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedAsCaller)1747*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1748*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1749*d9f75844SAndroid Build Coastguard Worker }
1750*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCaller)1751*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest,
1752*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1753*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1754*d9f75844SAndroid Build Coastguard Worker }
1755*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedAsCallee)1756*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1757*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1758*d9f75844SAndroid Build Coastguard Worker }
1759*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCallee)1760*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest,
1761*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1762*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1763*d9f75844SAndroid Build Coastguard Worker }
1764*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsNullOffer)1765*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
1766*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsNullOffer();
1767*d9f75844SAndroid Build Coastguard Worker }
1768*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsRtcpMux)1769*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
1770*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1771*d9f75844SAndroid Build Coastguard Worker }
1772*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentsRtcpMuxWithPrAnswer)1773*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1774*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1775*d9f75844SAndroid Build Coastguard Worker }
1776*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestChangeStreamParamsInContent)1777*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
1778*d9f75844SAndroid Build Coastguard Worker Base::TestChangeStreamParamsInContent();
1779*d9f75844SAndroid Build Coastguard Worker }
1780*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestPlayoutAndSendingStates)1781*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
1782*d9f75844SAndroid Build Coastguard Worker Base::TestPlayoutAndSendingStates();
1783*d9f75844SAndroid Build Coastguard Worker }
1784*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestMediaContentDirection)1785*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
1786*d9f75844SAndroid Build Coastguard Worker Base::TestMediaContentDirection();
1787*d9f75844SAndroid Build Coastguard Worker }
1788*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestNetworkRouteChanges)1789*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
1790*d9f75844SAndroid Build Coastguard Worker Base::TestNetworkRouteChanges();
1791*d9f75844SAndroid Build Coastguard Worker }
1792*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestCallSetup)1793*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
1794*d9f75844SAndroid Build Coastguard Worker Base::TestCallSetup();
1795*d9f75844SAndroid Build Coastguard Worker }
1796*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendRtpToRtp)1797*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
1798*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtp();
1799*d9f75844SAndroid Build Coastguard Worker }
1800*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendDtlsSrtpToDtlsSrtp)1801*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
1802*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(0, 0);
1803*d9f75844SAndroid Build Coastguard Worker }
1804*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendDtlsSrtpToDtlsSrtpRtcpMux)1805*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
1806*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
1807*d9f75844SAndroid Build Coastguard Worker }
1808*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendEarlyMediaUsingRtcpMuxSrtp)1809*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1810*d9f75844SAndroid Build Coastguard Worker Base::SendEarlyMediaUsingRtcpMuxSrtp();
1811*d9f75844SAndroid Build Coastguard Worker }
1812*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendRtpToRtpOnThread)1813*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
1814*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtpOnThread();
1815*d9f75844SAndroid Build Coastguard Worker }
1816*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendWithWritabilityLoss)1817*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
1818*d9f75844SAndroid Build Coastguard Worker Base::SendWithWritabilityLoss();
1819*d9f75844SAndroid Build Coastguard Worker }
1820*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSetContentFailure)1821*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
1822*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentFailure();
1823*d9f75844SAndroid Build Coastguard Worker }
1824*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSendTwoOffers)1825*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
1826*d9f75844SAndroid Build Coastguard Worker Base::TestSendTwoOffers();
1827*d9f75844SAndroid Build Coastguard Worker }
1828*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestReceiveTwoOffers)1829*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
1830*d9f75844SAndroid Build Coastguard Worker Base::TestReceiveTwoOffers();
1831*d9f75844SAndroid Build Coastguard Worker }
1832*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestSendPrAnswer)1833*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
1834*d9f75844SAndroid Build Coastguard Worker Base::TestSendPrAnswer();
1835*d9f75844SAndroid Build Coastguard Worker }
1836*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestReceivePrAnswer)1837*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
1838*d9f75844SAndroid Build Coastguard Worker Base::TestReceivePrAnswer();
1839*d9f75844SAndroid Build Coastguard Worker }
1840*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,TestOnTransportReadyToSend)1841*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
1842*d9f75844SAndroid Build Coastguard Worker Base::TestOnTransportReadyToSend();
1843*d9f75844SAndroid Build Coastguard Worker }
1844*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendBundleToBundle)1845*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
1846*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
1847*d9f75844SAndroid Build Coastguard Worker }
1848*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendBundleToBundleSecure)1849*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
1850*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
1851*d9f75844SAndroid Build Coastguard Worker }
1852*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendBundleToBundleWithRtcpMux)1853*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
1854*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
1855*d9f75844SAndroid Build Coastguard Worker }
1856*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SendBundleToBundleWithRtcpMuxSecure)1857*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1858*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
1859*d9f75844SAndroid Build Coastguard Worker }
1860*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,DefaultMaxBitrateIsUnlimited)1861*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
1862*d9f75844SAndroid Build Coastguard Worker Base::DefaultMaxBitrateIsUnlimited();
1863*d9f75844SAndroid Build Coastguard Worker }
1864*d9f75844SAndroid Build Coastguard Worker
TEST_F(VoiceChannelDoubleThreadTest,SocketOptionsMergedOnSetTransport)1865*d9f75844SAndroid Build Coastguard Worker TEST_F(VoiceChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
1866*d9f75844SAndroid Build Coastguard Worker Base::SocketOptionsMergedOnSetTransport();
1867*d9f75844SAndroid Build Coastguard Worker }
1868*d9f75844SAndroid Build Coastguard Worker
1869*d9f75844SAndroid Build Coastguard Worker // VideoChannelSingleThreadTest
TEST_F(VideoChannelSingleThreadTest,TestInit)1870*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestInit) {
1871*d9f75844SAndroid Build Coastguard Worker Base::TestInit();
1872*d9f75844SAndroid Build Coastguard Worker }
1873*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestDeinit)1874*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
1875*d9f75844SAndroid Build Coastguard Worker Base::TestDeinit();
1876*d9f75844SAndroid Build Coastguard Worker }
1877*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContents)1878*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
1879*d9f75844SAndroid Build Coastguard Worker Base::TestSetContents();
1880*d9f75844SAndroid Build Coastguard Worker }
1881*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsExtmapAllowMixedAsCaller)1882*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
1883*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
1884*d9f75844SAndroid Build Coastguard Worker }
1885*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCaller)1886*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest,
1887*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
1888*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
1889*d9f75844SAndroid Build Coastguard Worker }
1890*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsExtmapAllowMixedAsCallee)1891*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
1892*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
1893*d9f75844SAndroid Build Coastguard Worker }
1894*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCallee)1895*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest,
1896*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
1897*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
1898*d9f75844SAndroid Build Coastguard Worker }
1899*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsNullOffer)1900*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
1901*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsNullOffer();
1902*d9f75844SAndroid Build Coastguard Worker }
1903*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsRtcpMux)1904*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
1905*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1906*d9f75844SAndroid Build Coastguard Worker }
1907*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentsRtcpMuxWithPrAnswer)1908*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
1909*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
1910*d9f75844SAndroid Build Coastguard Worker }
1911*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestChangeStreamParamsInContent)1912*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
1913*d9f75844SAndroid Build Coastguard Worker Base::TestChangeStreamParamsInContent();
1914*d9f75844SAndroid Build Coastguard Worker }
1915*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestPlayoutAndSendingStates)1916*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
1917*d9f75844SAndroid Build Coastguard Worker Base::TestPlayoutAndSendingStates();
1918*d9f75844SAndroid Build Coastguard Worker }
1919*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestMediaContentDirection)1920*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
1921*d9f75844SAndroid Build Coastguard Worker Base::TestMediaContentDirection();
1922*d9f75844SAndroid Build Coastguard Worker }
1923*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestNetworkRouteChanges)1924*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
1925*d9f75844SAndroid Build Coastguard Worker Base::TestNetworkRouteChanges();
1926*d9f75844SAndroid Build Coastguard Worker }
1927*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestCallSetup)1928*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
1929*d9f75844SAndroid Build Coastguard Worker Base::TestCallSetup();
1930*d9f75844SAndroid Build Coastguard Worker }
1931*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendRtpToRtp)1932*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
1933*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtp();
1934*d9f75844SAndroid Build Coastguard Worker }
1935*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendDtlsSrtpToDtlsSrtp)1936*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
1937*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(0, 0);
1938*d9f75844SAndroid Build Coastguard Worker }
1939*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendDtlsSrtpToDtlsSrtpRtcpMux)1940*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
1941*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
1942*d9f75844SAndroid Build Coastguard Worker }
1943*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendEarlyMediaUsingRtcpMuxSrtp)1944*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
1945*d9f75844SAndroid Build Coastguard Worker Base::SendEarlyMediaUsingRtcpMuxSrtp();
1946*d9f75844SAndroid Build Coastguard Worker }
1947*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendRtpToRtpOnThread)1948*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
1949*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtpOnThread();
1950*d9f75844SAndroid Build Coastguard Worker }
1951*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendWithWritabilityLoss)1952*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
1953*d9f75844SAndroid Build Coastguard Worker Base::SendWithWritabilityLoss();
1954*d9f75844SAndroid Build Coastguard Worker }
1955*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetContentFailure)1956*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
1957*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentFailure();
1958*d9f75844SAndroid Build Coastguard Worker }
1959*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSendTwoOffers)1960*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
1961*d9f75844SAndroid Build Coastguard Worker Base::TestSendTwoOffers();
1962*d9f75844SAndroid Build Coastguard Worker }
1963*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestReceiveTwoOffers)1964*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
1965*d9f75844SAndroid Build Coastguard Worker Base::TestReceiveTwoOffers();
1966*d9f75844SAndroid Build Coastguard Worker }
1967*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSendPrAnswer)1968*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
1969*d9f75844SAndroid Build Coastguard Worker Base::TestSendPrAnswer();
1970*d9f75844SAndroid Build Coastguard Worker }
1971*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestReceivePrAnswer)1972*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
1973*d9f75844SAndroid Build Coastguard Worker Base::TestReceivePrAnswer();
1974*d9f75844SAndroid Build Coastguard Worker }
1975*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendBundleToBundle)1976*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
1977*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
1978*d9f75844SAndroid Build Coastguard Worker }
1979*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendBundleToBundleSecure)1980*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
1981*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
1982*d9f75844SAndroid Build Coastguard Worker }
1983*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendBundleToBundleWithRtcpMux)1984*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
1985*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
1986*d9f75844SAndroid Build Coastguard Worker }
1987*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SendBundleToBundleWithRtcpMuxSecure)1988*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
1989*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
1990*d9f75844SAndroid Build Coastguard Worker }
1991*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestOnTransportReadyToSend)1992*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
1993*d9f75844SAndroid Build Coastguard Worker Base::TestOnTransportReadyToSend();
1994*d9f75844SAndroid Build Coastguard Worker }
1995*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,DefaultMaxBitrateIsUnlimited)1996*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
1997*d9f75844SAndroid Build Coastguard Worker Base::DefaultMaxBitrateIsUnlimited();
1998*d9f75844SAndroid Build Coastguard Worker }
1999*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,SocketOptionsMergedOnSetTransport)2000*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
2001*d9f75844SAndroid Build Coastguard Worker Base::SocketOptionsMergedOnSetTransport();
2002*d9f75844SAndroid Build Coastguard Worker }
2003*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,UpdateLocalStreamsWithSimulcast)2004*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, UpdateLocalStreamsWithSimulcast) {
2005*d9f75844SAndroid Build Coastguard Worker Base::TestUpdateLocalStreamsWithSimulcast();
2006*d9f75844SAndroid Build Coastguard Worker }
2007*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetLocalOfferWithPacketization)2008*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
2009*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kVp8Codec(97, "VP8");
2010*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec vp9_codec(98, "VP9");
2011*d9f75844SAndroid Build Coastguard Worker vp9_codec.packetization = cricket::kPacketizationParamRaw;
2012*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription video;
2013*d9f75844SAndroid Build Coastguard Worker video.set_codecs({kVp8Codec, vp9_codec});
2014*d9f75844SAndroid Build Coastguard Worker
2015*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2016*d9f75844SAndroid Build Coastguard Worker
2017*d9f75844SAndroid Build Coastguard Worker std::string err;
2018*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2019*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2020*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2021*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2022*d9f75844SAndroid Build Coastguard Worker media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2023*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2024*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2025*d9f75844SAndroid Build Coastguard Worker media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2026*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
2027*d9f75844SAndroid Build Coastguard Worker cricket::kPacketizationParamRaw);
2028*d9f75844SAndroid Build Coastguard Worker }
2029*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetRemoteOfferWithPacketization)2030*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
2031*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kVp8Codec(97, "VP8");
2032*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec vp9_codec(98, "VP9");
2033*d9f75844SAndroid Build Coastguard Worker vp9_codec.packetization = cricket::kPacketizationParamRaw;
2034*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription video;
2035*d9f75844SAndroid Build Coastguard Worker video.set_codecs({kVp8Codec, vp9_codec});
2036*d9f75844SAndroid Build Coastguard Worker
2037*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2038*d9f75844SAndroid Build Coastguard Worker
2039*d9f75844SAndroid Build Coastguard Worker std::string err;
2040*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, err));
2041*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(err.empty());
2042*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2043*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2044*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2045*d9f75844SAndroid Build Coastguard Worker media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2046*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2047*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2048*d9f75844SAndroid Build Coastguard Worker media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2049*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
2050*d9f75844SAndroid Build Coastguard Worker cricket::kPacketizationParamRaw);
2051*d9f75844SAndroid Build Coastguard Worker }
2052*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetAnswerWithPacketization)2053*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
2054*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kVp8Codec(97, "VP8");
2055*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec vp9_codec(98, "VP9");
2056*d9f75844SAndroid Build Coastguard Worker vp9_codec.packetization = cricket::kPacketizationParamRaw;
2057*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription video;
2058*d9f75844SAndroid Build Coastguard Worker video.set_codecs({kVp8Codec, vp9_codec});
2059*d9f75844SAndroid Build Coastguard Worker
2060*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2061*d9f75844SAndroid Build Coastguard Worker
2062*d9f75844SAndroid Build Coastguard Worker std::string err;
2063*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, err));
2064*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(err.empty());
2065*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, err));
2066*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(err.empty());
2067*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
2068*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2069*d9f75844SAndroid Build Coastguard Worker media_channel1()->recv_codecs()[0].Matches(kVp8Codec, &field_trials_));
2070*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2071*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2072*d9f75844SAndroid Build Coastguard Worker media_channel1()->recv_codecs()[1].Matches(vp9_codec, &field_trials_));
2073*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
2074*d9f75844SAndroid Build Coastguard Worker cricket::kPacketizationParamRaw);
2075*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
2076*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2077*d9f75844SAndroid Build Coastguard Worker media_channel1()->send_codecs()[0].Matches(kVp8Codec, &field_trials_));
2078*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2079*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2080*d9f75844SAndroid Build Coastguard Worker media_channel1()->send_codecs()[1].Matches(vp9_codec, &field_trials_));
2081*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
2082*d9f75844SAndroid Build Coastguard Worker cricket::kPacketizationParamRaw);
2083*d9f75844SAndroid Build Coastguard Worker }
2084*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetLocalAnswerWithoutPacketization)2085*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
2086*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kLocalCodec(98, "VP8");
2087*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec remote_codec(99, "VP8");
2088*d9f75844SAndroid Build Coastguard Worker remote_codec.packetization = cricket::kPacketizationParamRaw;
2089*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription local_video;
2090*d9f75844SAndroid Build Coastguard Worker local_video.set_codecs({kLocalCodec});
2091*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription remote_video;
2092*d9f75844SAndroid Build Coastguard Worker remote_video.set_codecs({remote_codec});
2093*d9f75844SAndroid Build Coastguard Worker
2094*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2095*d9f75844SAndroid Build Coastguard Worker
2096*d9f75844SAndroid Build Coastguard Worker std::string err;
2097*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2098*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2099*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2100*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2101*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2102*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2103*d9f75844SAndroid Build Coastguard Worker }
2104*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetRemoteAnswerWithoutPacketization)2105*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
2106*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec local_codec(98, "VP8");
2107*d9f75844SAndroid Build Coastguard Worker local_codec.packetization = cricket::kPacketizationParamRaw;
2108*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kRemoteCodec(99, "VP8");
2109*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription local_video;
2110*d9f75844SAndroid Build Coastguard Worker local_video.set_codecs({local_codec});
2111*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription remote_video;
2112*d9f75844SAndroid Build Coastguard Worker remote_video.set_codecs({kRemoteCodec});
2113*d9f75844SAndroid Build Coastguard Worker
2114*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2115*d9f75844SAndroid Build Coastguard Worker
2116*d9f75844SAndroid Build Coastguard Worker std::string err;
2117*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2118*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
2119*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2120*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
2122*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2123*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2124*d9f75844SAndroid Build Coastguard Worker }
2125*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetRemoteAnswerWithInvalidPacketization)2126*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest,
2127*d9f75844SAndroid Build Coastguard Worker TestSetRemoteAnswerWithInvalidPacketization) {
2128*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec local_codec(98, "VP8");
2129*d9f75844SAndroid Build Coastguard Worker local_codec.packetization = cricket::kPacketizationParamRaw;
2130*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec remote_codec(99, "VP8");
2131*d9f75844SAndroid Build Coastguard Worker remote_codec.packetization = "unknownpacketizationattributevalue";
2132*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription local_video;
2133*d9f75844SAndroid Build Coastguard Worker local_video.set_codecs({local_codec});
2134*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription remote_video;
2135*d9f75844SAndroid Build Coastguard Worker remote_video.set_codecs({remote_codec});
2136*d9f75844SAndroid Build Coastguard Worker
2137*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2138*d9f75844SAndroid Build Coastguard Worker
2139*d9f75844SAndroid Build Coastguard Worker std::string err;
2140*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, err));
2141*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(err.empty());
2142*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(
2143*d9f75844SAndroid Build Coastguard Worker channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, err));
2144*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(err.empty());
2145*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
2146*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
2147*d9f75844SAndroid Build Coastguard Worker cricket::kPacketizationParamRaw);
2148*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
2149*d9f75844SAndroid Build Coastguard Worker }
2150*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelSingleThreadTest,TestSetLocalAnswerWithInvalidPacketization)2151*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelSingleThreadTest,
2152*d9f75844SAndroid Build Coastguard Worker TestSetLocalAnswerWithInvalidPacketization) {
2153*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec local_codec(98, "VP8");
2154*d9f75844SAndroid Build Coastguard Worker local_codec.packetization = cricket::kPacketizationParamRaw;
2155*d9f75844SAndroid Build Coastguard Worker const cricket::VideoCodec kRemoteCodec(99, "VP8");
2156*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription local_video;
2157*d9f75844SAndroid Build Coastguard Worker local_video.set_codecs({local_codec});
2158*d9f75844SAndroid Build Coastguard Worker cricket::VideoContentDescription remote_video;
2159*d9f75844SAndroid Build Coastguard Worker remote_video.set_codecs({kRemoteCodec});
2160*d9f75844SAndroid Build Coastguard Worker
2161*d9f75844SAndroid Build Coastguard Worker CreateChannels(0, 0);
2162*d9f75844SAndroid Build Coastguard Worker
2163*d9f75844SAndroid Build Coastguard Worker std::string err;
2164*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, err));
2165*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(err.empty());
2166*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, err));
2167*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(err.empty());
2168*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
2169*d9f75844SAndroid Build Coastguard Worker ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
2170*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
2171*d9f75844SAndroid Build Coastguard Worker }
2172*d9f75844SAndroid Build Coastguard Worker
2173*d9f75844SAndroid Build Coastguard Worker // VideoChannelDoubleThreadTest
TEST_F(VideoChannelDoubleThreadTest,TestInit)2174*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestInit) {
2175*d9f75844SAndroid Build Coastguard Worker Base::TestInit();
2176*d9f75844SAndroid Build Coastguard Worker }
2177*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestDeinit)2178*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
2179*d9f75844SAndroid Build Coastguard Worker Base::TestDeinit();
2180*d9f75844SAndroid Build Coastguard Worker }
2181*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContents)2182*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
2183*d9f75844SAndroid Build Coastguard Worker Base::TestSetContents();
2184*d9f75844SAndroid Build Coastguard Worker }
2185*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedAsCaller)2186*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCaller) {
2187*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/true);
2188*d9f75844SAndroid Build Coastguard Worker }
2189*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCaller)2190*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest,
2191*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCaller) {
2192*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCaller(/*offer=*/true, /*answer=*/false);
2193*d9f75844SAndroid Build Coastguard Worker }
2194*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedAsCallee)2195*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentsExtmapAllowMixedAsCallee) {
2196*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/true);
2197*d9f75844SAndroid Build Coastguard Worker }
2198*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsExtmapAllowMixedNotSupportedAsCallee)2199*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest,
2200*d9f75844SAndroid Build Coastguard Worker TestSetContentsExtmapAllowMixedNotSupportedAsCallee) {
2201*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsExtmapAllowMixedCallee(/*offer=*/true, /*answer=*/false);
2202*d9f75844SAndroid Build Coastguard Worker }
2203*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsNullOffer)2204*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
2205*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsNullOffer();
2206*d9f75844SAndroid Build Coastguard Worker }
2207*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsRtcpMux)2208*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
2209*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
2210*d9f75844SAndroid Build Coastguard Worker }
2211*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentsRtcpMuxWithPrAnswer)2212*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
2213*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentsRtcpMux();
2214*d9f75844SAndroid Build Coastguard Worker }
2215*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestChangeStreamParamsInContent)2216*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
2217*d9f75844SAndroid Build Coastguard Worker Base::TestChangeStreamParamsInContent();
2218*d9f75844SAndroid Build Coastguard Worker }
2219*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestPlayoutAndSendingStates)2220*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
2221*d9f75844SAndroid Build Coastguard Worker Base::TestPlayoutAndSendingStates();
2222*d9f75844SAndroid Build Coastguard Worker }
2223*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestMediaContentDirection)2224*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
2225*d9f75844SAndroid Build Coastguard Worker Base::TestMediaContentDirection();
2226*d9f75844SAndroid Build Coastguard Worker }
2227*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestNetworkRouteChanges)2228*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
2229*d9f75844SAndroid Build Coastguard Worker Base::TestNetworkRouteChanges();
2230*d9f75844SAndroid Build Coastguard Worker }
2231*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestCallSetup)2232*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
2233*d9f75844SAndroid Build Coastguard Worker Base::TestCallSetup();
2234*d9f75844SAndroid Build Coastguard Worker }
2235*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendRtpToRtp)2236*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
2237*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtp();
2238*d9f75844SAndroid Build Coastguard Worker }
2239*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendDtlsSrtpToDtlsSrtp)2240*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
2241*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(0, 0);
2242*d9f75844SAndroid Build Coastguard Worker }
2243*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendDtlsSrtpToDtlsSrtpRtcpMux)2244*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
2245*d9f75844SAndroid Build Coastguard Worker Base::SendDtlsSrtpToDtlsSrtp(RTCP_MUX, RTCP_MUX);
2246*d9f75844SAndroid Build Coastguard Worker }
2247*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendEarlyMediaUsingRtcpMuxSrtp)2248*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
2249*d9f75844SAndroid Build Coastguard Worker Base::SendEarlyMediaUsingRtcpMuxSrtp();
2250*d9f75844SAndroid Build Coastguard Worker }
2251*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendRtpToRtpOnThread)2252*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
2253*d9f75844SAndroid Build Coastguard Worker Base::SendRtpToRtpOnThread();
2254*d9f75844SAndroid Build Coastguard Worker }
2255*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendWithWritabilityLoss)2256*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
2257*d9f75844SAndroid Build Coastguard Worker Base::SendWithWritabilityLoss();
2258*d9f75844SAndroid Build Coastguard Worker }
2259*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSetContentFailure)2260*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
2261*d9f75844SAndroid Build Coastguard Worker Base::TestSetContentFailure();
2262*d9f75844SAndroid Build Coastguard Worker }
2263*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSendTwoOffers)2264*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
2265*d9f75844SAndroid Build Coastguard Worker Base::TestSendTwoOffers();
2266*d9f75844SAndroid Build Coastguard Worker }
2267*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestReceiveTwoOffers)2268*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
2269*d9f75844SAndroid Build Coastguard Worker Base::TestReceiveTwoOffers();
2270*d9f75844SAndroid Build Coastguard Worker }
2271*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestSendPrAnswer)2272*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
2273*d9f75844SAndroid Build Coastguard Worker Base::TestSendPrAnswer();
2274*d9f75844SAndroid Build Coastguard Worker }
2275*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestReceivePrAnswer)2276*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
2277*d9f75844SAndroid Build Coastguard Worker Base::TestReceivePrAnswer();
2278*d9f75844SAndroid Build Coastguard Worker }
2279*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendBundleToBundle)2280*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
2281*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
2282*d9f75844SAndroid Build Coastguard Worker }
2283*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendBundleToBundleSecure)2284*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
2285*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
2286*d9f75844SAndroid Build Coastguard Worker }
2287*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendBundleToBundleWithRtcpMux)2288*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
2289*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
2290*d9f75844SAndroid Build Coastguard Worker }
2291*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SendBundleToBundleWithRtcpMuxSecure)2292*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
2293*d9f75844SAndroid Build Coastguard Worker Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
2294*d9f75844SAndroid Build Coastguard Worker }
2295*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,TestOnTransportReadyToSend)2296*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
2297*d9f75844SAndroid Build Coastguard Worker Base::TestOnTransportReadyToSend();
2298*d9f75844SAndroid Build Coastguard Worker }
2299*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,DefaultMaxBitrateIsUnlimited)2300*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
2301*d9f75844SAndroid Build Coastguard Worker Base::DefaultMaxBitrateIsUnlimited();
2302*d9f75844SAndroid Build Coastguard Worker }
2303*d9f75844SAndroid Build Coastguard Worker
TEST_F(VideoChannelDoubleThreadTest,SocketOptionsMergedOnSetTransport)2304*d9f75844SAndroid Build Coastguard Worker TEST_F(VideoChannelDoubleThreadTest, SocketOptionsMergedOnSetTransport) {
2305*d9f75844SAndroid Build Coastguard Worker Base::SocketOptionsMergedOnSetTransport();
2306*d9f75844SAndroid Build Coastguard Worker }
2307*d9f75844SAndroid Build Coastguard Worker
2308*d9f75844SAndroid Build Coastguard Worker
2309*d9f75844SAndroid Build Coastguard Worker // TODO(pthatcher): TestSetReceiver?
2310