| Index: webrtc/pc/channel_unittest.cc
|
| diff --git a/webrtc/pc/channel_unittest.cc b/webrtc/pc/channel_unittest.cc
|
| index 00ceb7d9d53a9567b03195905dd69a0241092325..183f736f2cb7f45af3aeacfce82b562d231ad595 100644
|
| --- a/webrtc/pc/channel_unittest.cc
|
| +++ b/webrtc/pc/channel_unittest.cc
|
| @@ -21,8 +21,9 @@
|
| #include "webrtc/media/base/fakertp.h"
|
| #include "webrtc/media/base/mediachannel.h"
|
| #include "webrtc/media/base/testutils.h"
|
| -#include "webrtc/p2p/base/dtlstransportinternal.h"
|
| -#include "webrtc/p2p/base/faketransportcontroller.h"
|
| +#include "webrtc/p2p/base/fakecandidatepair.h"
|
| +#include "webrtc/p2p/base/fakedtlstransport.h"
|
| +#include "webrtc/p2p/base/fakepackettransport.h"
|
| #include "webrtc/pc/channel.h"
|
|
|
| #define MAYBE_SKIP_TEST(feature) \
|
| @@ -102,7 +103,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| SECURE = 0x4,
|
| SSRC_MUX = 0x8,
|
| DTLS = 0x10,
|
| - GCM_CIPHER = 0x20
|
| + GCM_CIPHER = 0x20,
|
| + // Use BaseChannel with PacketTransportInterface rather than
|
| + // DtlsTransportInternal.
|
| + RAW_PACKET_TRANSPORT = 0x40,
|
| };
|
|
|
| ChannelTest(bool verify_playout,
|
| @@ -110,12 +114,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| rtc::ArrayView<const uint8_t> rtcp_data,
|
| NetworkIsWorker network_is_worker)
|
| : verify_playout_(verify_playout),
|
| - media_channel1_(NULL),
|
| - media_channel2_(NULL),
|
| rtp_packet_(rtp_data.data(), rtp_data.size()),
|
| - rtcp_packet_(rtcp_data.data(), rtcp_data.size()),
|
| - media_info_callbacks1_(),
|
| - media_info_callbacks2_() {
|
| + rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
|
| if (network_is_worker == NetworkIsWorker::Yes) {
|
| network_thread_ = rtc::Thread::Current();
|
| } else {
|
| @@ -124,10 +124,6 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| network_thread_keeper_->Start();
|
| network_thread_ = network_thread_keeper_.get();
|
| }
|
| - transport_controller1_.reset(new cricket::FakeTransportController(
|
| - network_thread_, cricket::ICEROLE_CONTROLLING));
|
| - transport_controller2_.reset(new cricket::FakeTransportController(
|
| - network_thread_, cricket::ICEROLE_CONTROLLED));
|
| }
|
|
|
| void CreateChannels(int flags1, int flags2) {
|
| @@ -140,27 +136,94 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| int flags1,
|
| int flags2) {
|
| // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
|
| - ASSERT_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
|
| - ASSERT_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
|
| + RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
|
| + RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
|
| + // Make sure if using raw packet transports, they're used for both
|
| + // channels.
|
| + RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
|
| rtc::Thread* worker_thread = rtc::Thread::Current();
|
| media_channel1_ = ch1;
|
| media_channel2_ = ch2;
|
| + rtc::PacketTransportInterface* rtp1 = nullptr;
|
| + rtc::PacketTransportInterface* rtcp1 = nullptr;
|
| + rtc::PacketTransportInterface* rtp2 = nullptr;
|
| + rtc::PacketTransportInterface* rtcp2 = nullptr;
|
| + // Based on flags, create fake DTLS or raw packet transports.
|
| + if (flags1 & RAW_PACKET_TRANSPORT) {
|
| + fake_rtp_packet_transport1_.reset(
|
| + new rtc::FakePacketTransport("channel1_rtp"));
|
| + rtp1 = fake_rtp_packet_transport1_.get();
|
| + if (!(flags1 & RTCP_MUX_REQUIRED)) {
|
| + fake_rtcp_packet_transport1_.reset(
|
| + new rtc::FakePacketTransport("channel1_rtcp"));
|
| + rtcp1 = fake_rtcp_dtls_transport1_.get();
|
| + }
|
| + } else {
|
| + // Confirmed to work with KT_RSA and KT_ECDSA.
|
| + fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
|
| + "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
|
| + rtp1 = fake_rtp_dtls_transport1_.get();
|
| + if (!(flags1 & RTCP_MUX_REQUIRED)) {
|
| + fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
|
| + "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
|
| + rtcp1 = fake_rtcp_dtls_transport1_.get();
|
| + }
|
| + if (flags1 & DTLS) {
|
| + auto cert1 =
|
| + rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
|
| + rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
|
| + fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
|
| + if (fake_rtcp_dtls_transport1_) {
|
| + fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
|
| + }
|
| + }
|
| + }
|
| + // Based on flags, create fake DTLS or raw packet transports.
|
| + if (flags2 & RAW_PACKET_TRANSPORT) {
|
| + fake_rtp_packet_transport2_.reset(
|
| + new rtc::FakePacketTransport("channel2_rtp"));
|
| + rtp2 = fake_rtp_packet_transport2_.get();
|
| + if (!(flags2 & RTCP_MUX_REQUIRED)) {
|
| + fake_rtcp_packet_transport2_.reset(
|
| + new rtc::FakePacketTransport("channel2_rtcp"));
|
| + rtcp2 = fake_rtcp_dtls_transport2_.get();
|
| + }
|
| + } else {
|
| + // Confirmed to work with KT_RSA and KT_ECDSA.
|
| + fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
|
| + "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
|
| + rtp2 = fake_rtp_dtls_transport2_.get();
|
| + if (!(flags2 & RTCP_MUX_REQUIRED)) {
|
| + fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
|
| + "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
|
| + rtcp2 = fake_rtcp_dtls_transport2_.get();
|
| + }
|
| + if (flags2 & DTLS) {
|
| + auto cert2 =
|
| + rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
|
| + rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
|
| + fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
|
| + if (fake_rtcp_dtls_transport2_) {
|
| + fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
|
| + }
|
| + }
|
| + }
|
| channel1_.reset(
|
| CreateChannel(worker_thread, network_thread_, &media_engine_, ch1,
|
| - transport_controller1_.get(), flags1));
|
| + fake_rtp_dtls_transport1_.get(),
|
| + fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1));
|
| channel2_.reset(
|
| CreateChannel(worker_thread, network_thread_, &media_engine_, ch2,
|
| - transport_controller2_.get(), flags2));
|
| + fake_rtp_dtls_transport2_.get(),
|
| + fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2));
|
| channel1_->SignalMediaMonitor.connect(this,
|
| &ChannelTest<T>::OnMediaMonitor1);
|
| channel2_->SignalMediaMonitor.connect(this,
|
| &ChannelTest<T>::OnMediaMonitor2);
|
| channel1_->SignalRtcpMuxFullyActive.connect(
|
| - transport_controller1_.get(),
|
| - &cricket::FakeTransportController::DestroyRtcpTransport);
|
| + this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
|
| channel2_->SignalRtcpMuxFullyActive.connect(
|
| - transport_controller2_.get(),
|
| - &cricket::FakeTransportController::DestroyRtcpTransport);
|
| + this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
|
| if ((flags1 & DTLS) && (flags2 & DTLS)) {
|
| flags1 = (flags1 & ~SECURE);
|
| flags2 = (flags2 & ~SECURE);
|
| @@ -172,19 +235,6 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CopyContent(local_media_content1_, &remote_media_content1_);
|
| CopyContent(local_media_content2_, &remote_media_content2_);
|
|
|
| - if (flags1 & DTLS) {
|
| - // Confirmed to work with KT_RSA and KT_ECDSA.
|
| - transport_controller1_->SetLocalCertificate(
|
| - rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
|
| - rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT))));
|
| - }
|
| - if (flags2 & DTLS) {
|
| - // Confirmed to work with KT_RSA and KT_ECDSA.
|
| - transport_controller2_->SetLocalCertificate(
|
| - rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
|
| - rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT))));
|
| - }
|
| -
|
| // Add stream information (SSRC) to the local content but not to the remote
|
| // content. This means that we per default know the SSRC of what we send but
|
| // not what we receive.
|
| @@ -204,11 +254,12 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| rtc::Thread* network_thread,
|
| cricket::MediaEngineInterface* engine,
|
| typename T::MediaChannel* ch,
|
| - cricket::TransportController* transport_controller,
|
| + cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
|
| + cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
|
| + rtc::PacketTransportInterface* fake_rtp_packet_transport,
|
| + rtc::PacketTransportInterface* fake_rtcp_packet_transport,
|
| int flags) {
|
| - rtc::Thread* signaling_thread =
|
| - transport_controller ? transport_controller->signaling_thread()
|
| - : nullptr;
|
| + rtc::Thread* signaling_thread = rtc::Thread::Current();
|
| typename T::Channel* channel = new typename T::Channel(
|
| worker_thread, network_thread, signaling_thread, engine, ch,
|
| cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
|
| @@ -216,21 +267,41 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| rtc::CryptoOptions crypto_options;
|
| crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
|
| channel->SetCryptoOptions(crypto_options);
|
| - cricket::DtlsTransportInternal* rtp_dtls_transport =
|
| - transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
|
| - if (channel->NeedsRtcpTransport()) {
|
| - rtcp_dtls_transport = transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| + if (!channel->NeedsRtcpTransport()) {
|
| + fake_rtcp_dtls_transport = nullptr;
|
| }
|
| - if (!channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport)) {
|
| + if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
|
| + fake_rtp_packet_transport,
|
| + fake_rtcp_packet_transport)) {
|
| delete channel;
|
| channel = NULL;
|
| }
|
| return channel;
|
| }
|
|
|
| + void ConnectFakeTransports() {
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| + bool asymmetric = false;
|
| + // Depending on test flags, could be using DTLS or raw packet transport.
|
| + if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
|
| + fake_rtp_dtls_transport1_->SetDestination(
|
| + fake_rtp_dtls_transport2_.get(), asymmetric);
|
| + }
|
| + if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
|
| + fake_rtcp_dtls_transport1_->SetDestination(
|
| + fake_rtcp_dtls_transport2_.get(), asymmetric);
|
| + }
|
| + if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
|
| + fake_rtp_packet_transport1_->SetDestination(
|
| + fake_rtp_packet_transport2_.get(), asymmetric);
|
| + }
|
| + if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
|
| + fake_rtcp_packet_transport1_->SetDestination(
|
| + fake_rtcp_packet_transport2_.get(), asymmetric);
|
| + }
|
| + });
|
| + }
|
| +
|
| bool SendInitiate() {
|
| bool result = channel1_->SetLocalContent(&local_media_content1_,
|
| CA_OFFER, NULL);
|
| @@ -239,8 +310,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| result = channel2_->SetRemoteContent(&remote_media_content1_,
|
| CA_OFFER, NULL);
|
| if (result) {
|
| - transport_controller1_->Connect(transport_controller2_.get());
|
| -
|
| + ConnectFakeTransports();
|
| result = channel2_->SetLocalContent(&local_media_content2_,
|
| CA_ANSWER, NULL);
|
| }
|
| @@ -272,7 +342,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| channel2_->Enable(true);
|
| result = channel1_->SetRemoteContent(&remote_media_content2_,
|
| CA_PRANSWER, NULL);
|
| - transport_controller1_->Connect(transport_controller2_.get());
|
| + ConnectFakeTransports();
|
| }
|
| return result;
|
| }
|
| @@ -299,24 +369,6 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| return channel1_->RemoveRecvStream(id);
|
| }
|
|
|
| - std::vector<cricket::DtlsTransportInternal*> GetChannels1() {
|
| - return transport_controller1_->channels_for_testing();
|
| - }
|
| -
|
| - std::vector<cricket::DtlsTransportInternal*> GetChannels2() {
|
| - return transport_controller2_->channels_for_testing();
|
| - }
|
| -
|
| - cricket::FakeDtlsTransport* GetFakeChannel1(int component) {
|
| - return transport_controller1_->GetFakeDtlsTransport_n(
|
| - channel1_->content_name(), component);
|
| - }
|
| -
|
| - cricket::FakeDtlsTransport* GetFakeChannel2(int component) {
|
| - return transport_controller2_->GetFakeDtlsTransport_n(
|
| - channel2_->content_name(), component);
|
| - }
|
| -
|
| void SendRtp1() {
|
| media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
|
| rtc::PacketOptions());
|
| @@ -411,7 +463,11 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| // Returns true if so.
|
| bool CheckGcmCipher(typename T::Channel* channel, int flags) {
|
| int suite;
|
| - if (!channel->rtp_dtls_transport()->GetSrtpCryptoSuite(&suite)) {
|
| + cricket::FakeDtlsTransport* transport =
|
| + (channel == channel1_.get()) ? fake_rtp_dtls_transport1_.get()
|
| + : fake_rtp_dtls_transport2_.get();
|
| + RTC_DCHECK(transport);
|
| + if (!transport->GetSrtpCryptoSuite(&suite)) {
|
| return false;
|
| }
|
|
|
| @@ -482,6 +538,12 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| RTC_DCHECK_EQ(channel, channel2_.get());
|
| media_info_callbacks2_++;
|
| }
|
| + void OnRtcpMuxFullyActive1(const std::string&) {
|
| + rtcp_mux_activated_callbacks1_++;
|
| + }
|
| + void OnRtcpMuxFullyActive2(const std::string&) {
|
| + rtcp_mux_activated_callbacks2_++;
|
| + }
|
|
|
| cricket::CandidatePairInterface* last_selected_candidate_pair() {
|
| return last_selected_candidate_pair_;
|
| @@ -541,43 +603,37 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| // mux.
|
| void TestSetContentsRtcpMux() {
|
| CreateChannels(0, 0);
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() != NULL);
|
| - EXPECT_TRUE(channel2_->rtcp_dtls_transport() != NULL);
|
| typename T::Content content;
|
| CreateContent(0, kPcmuCodec, kH264Codec, &content);
|
| // Both sides agree on mux. Should no longer be a separate RTCP channel.
|
| content.set_rtcp_mux(true);
|
| EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
|
| EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() == NULL);
|
| // Only initiator supports mux. Should still have a separate RTCP channel.
|
| EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
|
| content.set_rtcp_mux(false);
|
| EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
|
| - EXPECT_TRUE(channel2_->rtcp_dtls_transport() != NULL);
|
| }
|
|
|
| // Test that SetLocalContent and SetRemoteContent properly set RTCP
|
| // mux when a provisional answer is received.
|
| void TestSetContentsRtcpMuxWithPrAnswer() {
|
| CreateChannels(0, 0);
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() != NULL);
|
| - EXPECT_TRUE(channel2_->rtcp_dtls_transport() != NULL);
|
| typename T::Content content;
|
| CreateContent(0, kPcmuCodec, kH264Codec, &content);
|
| content.set_rtcp_mux(true);
|
| EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
|
| EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() != NULL);
|
| + // Both sides agree on mux. Should signal RTCP mux as fully activated.
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
|
| - // Both sides agree on mux. Should no longer be a separate RTCP channel.
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() == NULL);
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| // Only initiator supports mux. Should still have a separate RTCP channel.
|
| EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
|
| content.set_rtcp_mux(false);
|
| EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
|
| EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
|
| - EXPECT_TRUE(channel2_->rtcp_dtls_transport() != NULL);
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
|
| }
|
|
|
| // Test that SetRemoteContent properly deals with a content update.
|
| @@ -783,7 +839,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
|
|
| EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
|
| EXPECT_EQ(1u, media_channel2_->recv_streams().size());
|
| - transport_controller1_->Connect(transport_controller2_.get());
|
| + ConnectFakeTransports();
|
|
|
| // Channel 2 do not send anything.
|
| typename T::Content content2;
|
| @@ -860,7 +916,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_FALSE(media_channel2_->playout());
|
| }
|
| EXPECT_FALSE(media_channel2_->sending());
|
| - transport_controller1_->Connect(transport_controller2_.get());
|
| + ConnectFakeTransports();
|
| if (verify_playout_) {
|
| EXPECT_TRUE(media_channel1_->playout());
|
| }
|
| @@ -908,7 +964,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
|
| EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
|
| EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
|
| - transport_controller1_->Connect(transport_controller2_.get());
|
| + ConnectFakeTransports();
|
|
|
| if (verify_playout_) {
|
| EXPECT_TRUE(media_channel1_->playout());
|
| @@ -957,36 +1013,34 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
|
|
| CreateChannels(0, 0);
|
|
|
| - cricket::DtlsTransportInternal* transport_channel1 =
|
| - channel1_->rtp_dtls_transport();
|
| - ASSERT_TRUE(transport_channel1);
|
| typename T::MediaChannel* media_channel1 =
|
| static_cast<typename T::MediaChannel*>(channel1_->media_channel());
|
| ASSERT_TRUE(media_channel1);
|
|
|
| media_channel1->set_num_network_route_changes(0);
|
| - network_thread_->Invoke<void>(RTC_FROM_HERE, [transport_channel1] {
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| // The transport channel becomes disconnected.
|
| - transport_channel1->ice_transport()->SignalSelectedCandidatePairChanged(
|
| - transport_channel1->ice_transport(), nullptr, -1, false);
|
| + fake_rtp_dtls_transport1_->ice_transport()
|
| + ->SignalSelectedCandidatePairChanged(
|
| + fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
|
| });
|
| WaitForThreads();
|
| EXPECT_EQ(1, media_channel1->num_network_route_changes());
|
| EXPECT_FALSE(media_channel1->last_network_route().connected);
|
| media_channel1->set_num_network_route_changes(0);
|
|
|
| - network_thread_->Invoke<void>(RTC_FROM_HERE, [this, transport_channel1,
|
| - media_channel1, kLocalNetId,
|
| - kRemoteNetId, kLastPacketId] {
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this, media_channel1,
|
| + kLocalNetId, kRemoteNetId,
|
| + kLastPacketId] {
|
| // The transport channel becomes connected.
|
| rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
|
| rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
|
| - std::unique_ptr<cricket::CandidatePairInterface> candidate_pair(
|
| - transport_controller1_->CreateFakeCandidatePair(
|
| - local_address, kLocalNetId, remote_address, kRemoteNetId));
|
| - transport_channel1->ice_transport()->SignalSelectedCandidatePairChanged(
|
| - transport_channel1->ice_transport(), candidate_pair.get(),
|
| - kLastPacketId, true);
|
| + auto candidate_pair = cricket::FakeCandidatePair::Create(
|
| + local_address, kLocalNetId, remote_address, kRemoteNetId);
|
| + fake_rtp_dtls_transport1_->ice_transport()
|
| + ->SignalSelectedCandidatePairChanged(
|
| + fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
|
| + kLastPacketId, true);
|
| });
|
| WaitForThreads();
|
| EXPECT_EQ(1, media_channel1->num_network_route_changes());
|
| @@ -1046,8 +1100,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
|
| EXPECT_TRUE(SendInitiate());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| SendRtp1();
|
| SendRtp2();
|
| WaitForThreads();
|
| @@ -1075,8 +1129,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(0, 0);
|
| EXPECT_TRUE(SendInitiate());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
| SendRtcp1();
|
| SendRtcp2();
|
| WaitForThreads();
|
| @@ -1091,8 +1145,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(RTCP_MUX, 0);
|
| EXPECT_TRUE(SendInitiate());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
| SendRtcp1();
|
| SendRtcp2();
|
| WaitForThreads();
|
| @@ -1106,10 +1160,12 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendRtcpMuxToRtcpMux() {
|
| CreateChannels(RTCP_MUX, RTCP_MUX);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| SendRtp1();
|
| SendRtp2();
|
| SendRtcp1();
|
| @@ -1130,8 +1186,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendRequireRtcpMuxToRtcpMux() {
|
| CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| EXPECT_TRUE(SendAccept());
|
| SendRtp1();
|
| SendRtp2();
|
| @@ -1153,10 +1209,12 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendRtcpMuxToRequireRtcpMux() {
|
| CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| SendRtp1();
|
| SendRtp2();
|
| SendRtcp1();
|
| @@ -1177,10 +1235,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendRequireRtcpMuxToRequireRtcpMux() {
|
| CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| SendRtp1();
|
| SendRtp2();
|
| SendRtcp1();
|
| @@ -1201,8 +1259,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendRequireRtcpMuxToNoRtcpMux() {
|
| CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
| EXPECT_FALSE(SendAccept());
|
| }
|
|
|
| @@ -1210,8 +1268,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendEarlyRtcpMuxToRtcp() {
|
| CreateChannels(RTCP_MUX, 0);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
|
|
| // RTCP can be sent before the call is accepted, if the transport is ready.
|
| // It should not be muxed though, as the remote side doesn't support mux.
|
| @@ -1228,7 +1286,7 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
|
|
| // Complete call setup and ensure everything is still OK.
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| SendRtcp1();
|
| SendRtcp2();
|
| WaitForThreads();
|
| @@ -1243,8 +1301,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| void SendEarlyRtcpMuxToRtcpMux() {
|
| CreateChannels(RTCP_MUX, RTCP_MUX);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
|
|
| // RTCP can't be sent yet, since the RTCP transport isn't writable, and
|
| // we haven't yet received the accept that says we should mux.
|
| @@ -1259,8 +1317,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(CheckRtcp1());
|
|
|
| // Complete call setup and ensure everything is still OK.
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| SendRtcp1();
|
| SendRtcp2();
|
| WaitForThreads();
|
| @@ -1269,10 +1329,13 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| }
|
|
|
| // Test that we properly send SRTP with RTCP in both directions.
|
| - // You can pass in DTLS and/or RTCP_MUX as flags.
|
| + // You can pass in DTLS, RTCP_MUX, GCM_CIPHER and RAW_PACKET_TRANSPORT as
|
| + // flags.
|
| void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
|
| - RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0);
|
| - RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0);
|
| + RTC_CHECK((flags1_in &
|
| + ~(RTCP_MUX | DTLS | GCM_CIPHER | RAW_PACKET_TRANSPORT)) == 0);
|
| + RTC_CHECK((flags2_in &
|
| + ~(RTCP_MUX | DTLS | GCM_CIPHER | RAW_PACKET_TRANSPORT)) == 0);
|
|
|
| int flags1 = SECURE | flags1_in;
|
| int flags2 = SECURE | flags2_in;
|
| @@ -1348,8 +1411,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(SendProvisionalAnswer());
|
| EXPECT_TRUE(channel1_->secure());
|
| EXPECT_TRUE(channel2_->secure());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
| WaitForThreads(); // Wait for 'sending' flag go through network thread.
|
| SendCustomRtcp1(kSsrc1);
|
| SendCustomRtp1(kSsrc1, ++sequence_number1_1);
|
| @@ -1365,9 +1428,13 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
|
|
|
| // Complete call setup and ensure everything is still OK.
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
|
| EXPECT_TRUE(SendFinalAnswer());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
|
| EXPECT_TRUE(channel1_->secure());
|
| EXPECT_TRUE(channel2_->secure());
|
| SendCustomRtcp1(kSsrc1);
|
| @@ -1433,8 +1500,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
|
| EXPECT_TRUE(SendInitiate());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(1U, GetChannels1().size());
|
| - EXPECT_EQ(1U, GetChannels2().size());
|
| + EXPECT_FALSE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_FALSE(channel2_->NeedsRtcpTransport());
|
| SendRtp1();
|
| SendRtp2();
|
| WaitForThreads();
|
| @@ -1444,8 +1511,9 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(CheckNoRtp2());
|
|
|
| // Lose writability, which should fail.
|
| - network_thread_->Invoke<void>(
|
| - RTC_FROM_HERE, [this] { GetFakeChannel1(1)->SetWritable(false); });
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| + fake_rtp_dtls_transport1_->SetWritable(false);
|
| + });
|
| SendRtp1();
|
| SendRtp2();
|
| WaitForThreads();
|
| @@ -1453,8 +1521,9 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(CheckNoRtp2());
|
|
|
| // Regain writability
|
| - network_thread_->Invoke<void>(
|
| - RTC_FROM_HERE, [this] { GetFakeChannel1(1)->SetWritable(true); });
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| + fake_rtp_dtls_transport1_->SetWritable(true);
|
| + });
|
| EXPECT_TRUE(media_channel1_->sending());
|
| SendRtp1();
|
| SendRtp2();
|
| @@ -1465,8 +1534,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| EXPECT_TRUE(CheckNoRtp2());
|
|
|
| // Lose writability completely
|
| - network_thread_->Invoke<void>(
|
| - RTC_FROM_HERE, [this] { GetFakeChannel1(1)->SetDestination(nullptr); });
|
| + network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| + bool asymmetric = true;
|
| + fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
|
| + });
|
| EXPECT_TRUE(media_channel1_->sending());
|
|
|
| // Should fail also.
|
| @@ -1479,7 +1550,9 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
|
|
| // Gain writability back
|
| network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| - GetFakeChannel1(1)->SetDestination(GetFakeChannel2(1));
|
| + bool asymmetric = true;
|
| + fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
|
| + asymmetric);
|
| });
|
| EXPECT_TRUE(media_channel1_->sending());
|
| SendRtp1();
|
| @@ -1501,18 +1574,16 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| int pl_type2 = pl_types[1];
|
| int flags = SSRC_MUX;
|
| if (secure) flags |= SECURE;
|
| - uint32_t expected_channels = 2U;
|
| if (rtcp_mux) {
|
| flags |= RTCP_MUX;
|
| - expected_channels = 1U;
|
| }
|
| CreateChannels(flags, flags);
|
| EXPECT_TRUE(SendInitiate());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(expected_channels, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(expected_channels, GetChannels1().size());
|
| - EXPECT_EQ(expected_channels, GetChannels2().size());
|
| + EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
|
| + EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
|
| EXPECT_TRUE(channel1_->bundle_filter()->FindPayloadType(pl_type1));
|
| EXPECT_TRUE(channel2_->bundle_filter()->FindPayloadType(pl_type1));
|
| EXPECT_FALSE(channel1_->bundle_filter()->FindPayloadType(pl_type2));
|
| @@ -1692,8 +1763,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(0, 0);
|
| EXPECT_TRUE(SendInitiate());
|
| EXPECT_TRUE(SendAccept());
|
| - EXPECT_EQ(2U, GetChannels1().size());
|
| - EXPECT_EQ(2U, GetChannels2().size());
|
| + EXPECT_TRUE(channel1_->NeedsRtcpTransport());
|
| + EXPECT_TRUE(channel2_->NeedsRtcpTransport());
|
|
|
| // Send RTCP1 from a different thread.
|
| ScopedCallThread send_rtcp([this] { SendRtcp1(); });
|
| @@ -1785,11 +1856,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| error_handler.mode_ = cricket::SrtpFilter::UNPROTECT;
|
|
|
| network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
| - cricket::DtlsTransportInternal* transport_channel =
|
| - channel2_->rtp_dtls_transport();
|
| - transport_channel->SignalReadPacket(
|
| - transport_channel, reinterpret_cast<const char*>(kBadPacket),
|
| - sizeof(kBadPacket), rtc::PacketTime(), 0);
|
| + fake_rtp_dtls_transport2_->SignalReadPacket(
|
| + fake_rtp_dtls_transport2_.get(),
|
| + reinterpret_cast<const char*>(kBadPacket), sizeof(kBadPacket),
|
| + rtc::PacketTime(), 0);
|
| });
|
| EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_handler.error_);
|
| EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, error_handler.mode_);
|
| @@ -1799,8 +1869,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
|
|
| void TestOnReadyToSend() {
|
| CreateChannels(0, 0);
|
| - DtlsTransportInternal* rtp = channel1_->rtp_dtls_transport();
|
| - DtlsTransportInternal* rtcp = channel1_->rtcp_dtls_transport();
|
| + cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
|
| + cricket::FakeDtlsTransport* rtcp = fake_rtcp_dtls_transport1_.get();
|
| EXPECT_FALSE(media_channel1_->ready_to_send());
|
|
|
| network_thread_->Invoke<void>(RTC_FROM_HERE,
|
| @@ -1846,12 +1916,13 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| CreateChannels(0, 0);
|
| typename T::Content content;
|
| CreateContent(0, kPcmuCodec, kH264Codec, &content);
|
| - // Both sides agree on mux. Should no longer be a separate RTCP channel.
|
| + // Both sides agree on mux. Should signal that RTCP mux is fully active.
|
| content.set_rtcp_mux(true);
|
| EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
|
| + EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
|
| EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
|
| - EXPECT_TRUE(channel1_->rtcp_dtls_transport() == NULL);
|
| - DtlsTransportInternal* rtp = channel1_->rtp_dtls_transport();
|
| + EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
|
| + cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
|
| EXPECT_FALSE(media_channel1_->ready_to_send());
|
| // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
|
| // should trigger the MediaChannel's OnReadyToSend.
|
| @@ -1942,12 +2013,18 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| const bool verify_playout_;
|
| std::unique_ptr<rtc::Thread> network_thread_keeper_;
|
| rtc::Thread* network_thread_;
|
| - std::unique_ptr<cricket::FakeTransportController> transport_controller1_;
|
| - std::unique_ptr<cricket::FakeTransportController> transport_controller2_;
|
| + std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
|
| + std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
|
| + std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
|
| + std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
|
| + std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
|
| + std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
|
| + std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
|
| + std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
|
| cricket::FakeMediaEngine media_engine_;
|
| // The media channels are owned by the voice channel objects below.
|
| - typename T::MediaChannel* media_channel1_;
|
| - typename T::MediaChannel* media_channel2_;
|
| + typename T::MediaChannel* media_channel1_ = nullptr;
|
| + typename T::MediaChannel* media_channel2_ = nullptr;
|
| std::unique_ptr<typename T::Channel> channel1_;
|
| std::unique_ptr<typename T::Channel> channel2_;
|
| typename T::Content local_media_content1_;
|
| @@ -1957,8 +2034,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
|
| // The RTP and RTCP packets to send in the tests.
|
| rtc::Buffer rtp_packet_;
|
| rtc::Buffer rtcp_packet_;
|
| - int media_info_callbacks1_;
|
| - int media_info_callbacks2_;
|
| + int media_info_callbacks1_ = 0;
|
| + int media_info_callbacks2_ = 0;
|
| + int rtcp_mux_activated_callbacks1_ = 0;
|
| + int rtcp_mux_activated_callbacks2_ = 0;
|
| cricket::CandidatePairInterface* last_selected_candidate_pair_;
|
| };
|
|
|
| @@ -2020,25 +2099,23 @@ cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
|
| rtc::Thread* network_thread,
|
| cricket::MediaEngineInterface* engine,
|
| cricket::FakeVideoMediaChannel* ch,
|
| - cricket::TransportController* transport_controller,
|
| + cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
|
| + cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
|
| + rtc::PacketTransportInterface* fake_rtp_packet_transport,
|
| + rtc::PacketTransportInterface* fake_rtcp_packet_transport,
|
| int flags) {
|
| - rtc::Thread* signaling_thread =
|
| - transport_controller ? transport_controller->signaling_thread() : nullptr;
|
| + rtc::Thread* signaling_thread = rtc::Thread::Current();
|
| cricket::VideoChannel* channel = new cricket::VideoChannel(
|
| worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
|
| (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
|
| rtc::CryptoOptions crypto_options;
|
| crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
|
| channel->SetCryptoOptions(crypto_options);
|
| - cricket::DtlsTransportInternal* rtp_dtls_transport =
|
| - transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
|
| - if (channel->NeedsRtcpTransport()) {
|
| - rtcp_dtls_transport = transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| - }
|
| - if (!channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport)) {
|
| + if (!channel->NeedsRtcpTransport()) {
|
| + fake_rtcp_dtls_transport = nullptr;
|
| + }
|
| + if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
|
| + fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
|
| delete channel;
|
| channel = NULL;
|
| }
|
| @@ -2272,6 +2349,12 @@ TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
|
| Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
|
| }
|
|
|
| +// Test using the channel with a raw packet interface, as opposed to a DTLS
|
| +// transport interface.
|
| +TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
|
| + Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
|
| +}
|
| +
|
| TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
|
| Base::SendEarlyMediaUsingRtcpMuxSrtp();
|
| }
|
| @@ -2605,6 +2688,12 @@ TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
|
| Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
|
| }
|
|
|
| +// Test using the channel with a raw packet interface, as opposed to a DTLS
|
| +// transport interface.
|
| +TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
|
| + Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
|
| +}
|
| +
|
| TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
|
| Base::SendEarlyMediaUsingRtcpMuxSrtp();
|
| }
|
| @@ -2915,6 +3004,12 @@ TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
|
| Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
|
| }
|
|
|
| +// Test using the channel with a raw packet interface, as opposed to a DTLS
|
| +// transport interface.
|
| +TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
|
| + Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
|
| +}
|
| +
|
| TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
|
| Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
|
| }
|
| @@ -3147,6 +3242,12 @@ TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
|
| Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
|
| }
|
|
|
| +// Test using the channel with a raw packet interface, as opposed to a DTLS
|
| +// transport interface.
|
| +TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
|
| + Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
|
| +}
|
| +
|
| TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
|
| Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
|
| }
|
| @@ -3254,25 +3355,23 @@ cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
|
| rtc::Thread* network_thread,
|
| cricket::MediaEngineInterface* engine,
|
| cricket::FakeDataMediaChannel* ch,
|
| - cricket::TransportController* transport_controller,
|
| + cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
|
| + cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
|
| + rtc::PacketTransportInterface* fake_rtp_packet_transport,
|
| + rtc::PacketTransportInterface* fake_rtcp_packet_transport,
|
| int flags) {
|
| - rtc::Thread* signaling_thread =
|
| - transport_controller ? transport_controller->signaling_thread() : nullptr;
|
| + rtc::Thread* signaling_thread = rtc::Thread::Current();
|
| cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
|
| worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
|
| (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
|
| rtc::CryptoOptions crypto_options;
|
| crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
|
| channel->SetCryptoOptions(crypto_options);
|
| - cricket::DtlsTransportInternal* rtp_dtls_transport =
|
| - transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
|
| - if (channel->NeedsRtcpTransport()) {
|
| - rtcp_dtls_transport = transport_controller->CreateDtlsTransport(
|
| - channel->content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| - }
|
| - if (!channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport)) {
|
| + if (!channel->NeedsRtcpTransport()) {
|
| + fake_rtcp_dtls_transport = nullptr;
|
| + }
|
| + if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
|
| + fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
|
| delete channel;
|
| channel = NULL;
|
| }
|
| @@ -3589,7 +3688,9 @@ TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
|
| class BaseChannelDeathTest : public testing::Test {
|
| public:
|
| BaseChannelDeathTest()
|
| - : // RTCP mux not required, SRTP required.
|
| + : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
|
| + fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
|
| + // RTCP mux not required, SRTP required.
|
| voice_channel_(
|
| rtc::Thread::Current(),
|
| rtc::Thread::Current(),
|
| @@ -3599,66 +3700,89 @@ class BaseChannelDeathTest : public testing::Test {
|
| cricket::AudioOptions()),
|
| cricket::CN_AUDIO,
|
| false,
|
| - true) {
|
| - rtp_transport_ = fake_transport_controller_.CreateDtlsTransport(
|
| - "foo", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - rtcp_transport_ = fake_transport_controller_.CreateDtlsTransport(
|
| - "foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| - EXPECT_TRUE(voice_channel_.Init_w(rtp_transport_, rtcp_transport_));
|
| - }
|
| + true) {}
|
|
|
| protected:
|
| - cricket::FakeTransportController fake_transport_controller_;
|
| cricket::FakeMediaEngine fake_media_engine_;
|
| + cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
|
| + cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
|
| cricket::VoiceChannel voice_channel_;
|
| - // Will be cleaned up by FakeTransportController, don't need to worry about
|
| - // deleting them in this test.
|
| - cricket::DtlsTransportInternal* rtp_transport_;
|
| - cricket::DtlsTransportInternal* rtcp_transport_;
|
| };
|
|
|
| -TEST_F(BaseChannelDeathTest, SetTransportWithNullRtpTransport) {
|
| - cricket::DtlsTransportInternal* new_rtcp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| - EXPECT_DEATH(voice_channel_.SetTransports(nullptr, new_rtcp_transport), "");
|
| +TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
|
| + cricket::FakeDtlsTransport new_rtcp_transport(
|
| + "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| + EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
|
| }
|
|
|
| -TEST_F(BaseChannelDeathTest, SetTransportWithMissingRtcpTransport) {
|
| - cricket::DtlsTransportInternal* new_rtp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - EXPECT_DEATH(voice_channel_.SetTransports(new_rtp_transport, nullptr), "");
|
| +TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
|
| + cricket::FakeDtlsTransport new_rtp_transport(
|
| + "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| + EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
|
| }
|
|
|
| -TEST_F(BaseChannelDeathTest, SetTransportWithUnneededRtcpTransport) {
|
| +TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
|
| // Activate RTCP muxing, simulating offer/answer negotiation.
|
| cricket::AudioContentDescription content;
|
| content.set_rtcp_mux(true);
|
| ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
|
| ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
|
| - cricket::DtlsTransportInternal* new_rtp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - cricket::DtlsTransportInternal* new_rtcp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| + cricket::FakeDtlsTransport new_rtp_transport(
|
| + "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| + cricket::FakeDtlsTransport new_rtcp_transport(
|
| + "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| // After muxing is enabled, no RTCP transport should be passed in here.
|
| EXPECT_DEATH(
|
| - voice_channel_.SetTransports(new_rtp_transport, new_rtcp_transport), "");
|
| + voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
|
| + "");
|
| }
|
|
|
| // This test will probably go away if/when we move the transport name out of
|
| // the transport classes and into their parent classes.
|
| -TEST_F(BaseChannelDeathTest, SetTransportWithMismatchingTransportNames) {
|
| - cricket::DtlsTransportInternal* new_rtp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| - cricket::DtlsTransportInternal* new_rtcp_transport =
|
| - fake_transport_controller_.CreateDtlsTransport(
|
| - "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| +TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
|
| + cricket::FakeDtlsTransport new_rtp_transport(
|
| + "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
|
| + cricket::FakeDtlsTransport new_rtcp_transport(
|
| + "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
|
| + EXPECT_DEATH(
|
| + voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
|
| + "");
|
| +}
|
| +
|
| +// Not expected to support going from DtlsTransportInternal to
|
| +// PacketTransportInterface.
|
| +TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
|
| EXPECT_DEATH(
|
| - voice_channel_.SetTransports(new_rtp_transport, new_rtcp_transport), "");
|
| + voice_channel_.SetTransports(static_cast<rtc::PacketTransportInterface*>(
|
| + &fake_rtp_dtls_transport_),
|
| + static_cast<rtc::PacketTransportInterface*>(
|
| + &fake_rtp_dtls_transport_)),
|
| + "");
|
| +}
|
| +
|
| +// Not expected to support going from PacketTransportInterface to
|
| +// DtlsTransportInternal.
|
| +TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
|
| + ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
|
| + &fake_rtcp_dtls_transport_));
|
| + EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
|
| + &fake_rtp_dtls_transport_),
|
| + "");
|
| }
|
|
|
| #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
|
|
|