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) |