|
|
|
|
@ -35,6 +35,8 @@
|
|
|
|
|
#include "rtc_base/checks.h"
|
|
|
|
|
#include "rtc_base/rtc_certificate.h"
|
|
|
|
|
#include "rtc_base/ssl_identity.h"
|
|
|
|
|
#include "rtc_base/task_utils/pending_task_safety_flag.h"
|
|
|
|
|
#include "rtc_base/task_utils/to_queued_task.h"
|
|
|
|
|
#include "test/gmock.h"
|
|
|
|
|
#include "test/gtest.h"
|
|
|
|
|
|
|
|
|
|
@ -119,19 +121,30 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
network_thread_keeper_->SetName("Network", nullptr);
|
|
|
|
|
network_thread_ = network_thread_keeper_.get();
|
|
|
|
|
}
|
|
|
|
|
RTC_DCHECK(network_thread_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~ChannelTest() {
|
|
|
|
|
if (network_thread_) {
|
|
|
|
|
network_thread_->Invoke<void>(
|
|
|
|
|
RTC_FROM_HERE, [this]() { network_thread_safety_->SetNotAlive(); });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CreateChannels(int flags1, int flags2) {
|
|
|
|
|
CreateChannels(std::make_unique<typename T::MediaChannel>(
|
|
|
|
|
nullptr, typename T::Options()),
|
|
|
|
|
nullptr, typename T::Options(), network_thread_),
|
|
|
|
|
std::make_unique<typename T::MediaChannel>(
|
|
|
|
|
nullptr, typename T::Options()),
|
|
|
|
|
nullptr, typename T::Options(), network_thread_),
|
|
|
|
|
flags1, flags2);
|
|
|
|
|
}
|
|
|
|
|
void CreateChannels(std::unique_ptr<typename T::MediaChannel> ch1,
|
|
|
|
|
std::unique_ptr<typename T::MediaChannel> ch2,
|
|
|
|
|
int flags1,
|
|
|
|
|
int flags2) {
|
|
|
|
|
RTC_DCHECK(!channel1_);
|
|
|
|
|
RTC_DCHECK(!channel2_);
|
|
|
|
|
|
|
|
|
|
// Network thread is started in CreateChannels, to allow the test to
|
|
|
|
|
// configure a fake clock before any threads are spawned and attempt to
|
|
|
|
|
// access the time.
|
|
|
|
|
@ -143,8 +156,6 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
// channels.
|
|
|
|
|
RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
|
|
|
|
|
rtc::Thread* worker_thread = rtc::Thread::Current();
|
|
|
|
|
media_channel1_ = ch1.get();
|
|
|
|
|
media_channel2_ = ch2.get();
|
|
|
|
|
rtc::PacketTransportInternal* rtp1 = nullptr;
|
|
|
|
|
rtc::PacketTransportInternal* rtcp1 = nullptr;
|
|
|
|
|
rtc::PacketTransportInternal* rtp2 = nullptr;
|
|
|
|
|
@ -399,43 +410,59 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
fake_rtp_packet_transport2_.reset();
|
|
|
|
|
fake_rtcp_packet_transport2_.reset();
|
|
|
|
|
if (network_thread_keeper_) {
|
|
|
|
|
RTC_DCHECK_EQ(network_thread_, network_thread_keeper_.get());
|
|
|
|
|
network_thread_ = nullptr;
|
|
|
|
|
network_thread_keeper_.reset();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendRtp(typename T::MediaChannel* media_channel, rtc::Buffer data) {
|
|
|
|
|
network_thread_->PostTask(webrtc::ToQueuedTask(
|
|
|
|
|
network_thread_safety_, [media_channel, data = std::move(data)]() {
|
|
|
|
|
media_channel->SendRtp(data.data(), data.size(),
|
|
|
|
|
rtc::PacketOptions());
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendRtp1() {
|
|
|
|
|
media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
|
|
|
|
|
rtc::PacketOptions());
|
|
|
|
|
SendRtp1(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendRtp1(rtc::Buffer data) {
|
|
|
|
|
SendRtp(media_channel1(), std::move(data));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendRtp2() {
|
|
|
|
|
media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
|
|
|
|
|
rtc::PacketOptions());
|
|
|
|
|
SendRtp2(rtc::Buffer(rtp_packet_.data(), rtp_packet_.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendRtp2(rtc::Buffer data) {
|
|
|
|
|
SendRtp(media_channel2(), std::move(data));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Methods to send custom data.
|
|
|
|
|
void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
|
|
|
|
|
rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
|
|
|
|
|
media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
|
|
|
|
|
SendRtp1(CreateRtpData(ssrc, sequence_number, pl_type));
|
|
|
|
|
}
|
|
|
|
|
void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
|
|
|
|
|
rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
|
|
|
|
|
media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
|
|
|
|
|
SendRtp2(CreateRtpData(ssrc, sequence_number, pl_type));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CheckRtp1() {
|
|
|
|
|
return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
|
|
|
|
|
return media_channel1()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
|
|
|
|
|
}
|
|
|
|
|
bool CheckRtp2() {
|
|
|
|
|
return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
|
|
|
|
|
return media_channel2()->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
|
|
|
|
|
}
|
|
|
|
|
// Methods to check custom data.
|
|
|
|
|
bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
|
|
|
|
|
rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
|
|
|
|
|
return media_channel1_->CheckRtp(data.data(), data.size());
|
|
|
|
|
return media_channel1()->CheckRtp(data.data(), data.size());
|
|
|
|
|
}
|
|
|
|
|
bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
|
|
|
|
|
rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
|
|
|
|
|
return media_channel2_->CheckRtp(data.data(), data.size());
|
|
|
|
|
return media_channel2()->CheckRtp(data.data(), data.size());
|
|
|
|
|
}
|
|
|
|
|
rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
|
|
|
|
|
rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
|
|
|
|
|
@ -448,8 +475,8 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CheckNoRtp1() { return media_channel1_->CheckNoRtp(); }
|
|
|
|
|
bool CheckNoRtp2() { return media_channel2_->CheckNoRtp(); }
|
|
|
|
|
bool CheckNoRtp1() { return media_channel1()->CheckNoRtp(); }
|
|
|
|
|
bool CheckNoRtp2() { return media_channel2()->CheckNoRtp(); }
|
|
|
|
|
|
|
|
|
|
void CreateContent(int flags,
|
|
|
|
|
const cricket::AudioCodec& audio_codec,
|
|
|
|
|
@ -529,13 +556,13 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
void TestInit() {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
EXPECT_FALSE(IsSrtpActive(channel1_));
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel1_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel1_->codecs().empty());
|
|
|
|
|
EXPECT_TRUE(media_channel1_->recv_streams().empty());
|
|
|
|
|
EXPECT_TRUE(media_channel1_->rtp_packets().empty());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->codecs().empty());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->recv_streams().empty());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->rtp_packets().empty());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that SetLocalContent and SetRemoteContent properly configure
|
|
|
|
|
@ -545,11 +572,11 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
typename T::Content content;
|
|
|
|
|
CreateContent(0, kPcmuCodec, kH264Codec, &content);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_EQ(0U, media_channel1_->codecs().size());
|
|
|
|
|
EXPECT_EQ(0U, media_channel1()->codecs().size());
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_EQ(1U, media_channel1_->codecs().size());
|
|
|
|
|
ASSERT_EQ(1U, media_channel1()->codecs().size());
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
|
|
|
|
|
CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that SetLocalContent and SetRemoteContent properly configure
|
|
|
|
|
@ -566,7 +593,7 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
|
|
|
|
|
content.set_extmap_allow_mixed_enum(answer_enum);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
|
|
|
|
|
EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
|
|
|
|
|
}
|
|
|
|
|
void TestSetContentsExtmapAllowMixedCallee(bool offer, bool answer) {
|
|
|
|
|
// For a callee, SetRemoteContent() is called first with an offer and next
|
|
|
|
|
@ -580,7 +607,7 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kOffer, NULL));
|
|
|
|
|
content.set_extmap_allow_mixed_enum(answer_enum);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_EQ(answer, media_channel1_->ExtmapAllowMixed());
|
|
|
|
|
EXPECT_EQ(answer, media_channel1()->ExtmapAllowMixed());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that SetLocalContent and SetRemoteContent properly deals
|
|
|
|
|
@ -590,11 +617,11 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
typename T::Content content;
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content, SdpType::kOffer, NULL));
|
|
|
|
|
CreateContent(0, kPcmuCodec, kH264Codec, &content);
|
|
|
|
|
EXPECT_EQ(0U, media_channel1_->codecs().size());
|
|
|
|
|
EXPECT_EQ(0U, media_channel1()->codecs().size());
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_EQ(1U, media_channel1_->codecs().size());
|
|
|
|
|
ASSERT_EQ(1U, media_channel1()->codecs().size());
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
CodecMatches(content.codecs()[0], media_channel1_->codecs()[0]));
|
|
|
|
|
CodecMatches(content.codecs()[0], media_channel1()->codecs()[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that SetLocalContent and SetRemoteContent properly set RTCP
|
|
|
|
|
@ -636,20 +663,20 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
content1.AddStream(stream1);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
|
|
|
|
|
channel1_->Enable(true);
|
|
|
|
|
EXPECT_EQ(1u, media_channel1_->send_streams().size());
|
|
|
|
|
EXPECT_EQ(1u, media_channel1()->send_streams().size());
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_EQ(1u, media_channel2_->recv_streams().size());
|
|
|
|
|
EXPECT_EQ(1u, media_channel2()->recv_streams().size());
|
|
|
|
|
ConnectFakeTransports();
|
|
|
|
|
|
|
|
|
|
// Channel 2 do not send anything.
|
|
|
|
|
typename T::Content content2;
|
|
|
|
|
CreateContent(0, kPcmuCodec, kH264Codec, &content2);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_EQ(0u, media_channel1_->recv_streams().size());
|
|
|
|
|
EXPECT_EQ(0u, media_channel1()->recv_streams().size());
|
|
|
|
|
EXPECT_TRUE(channel2_->SetLocalContent(&content2, SdpType::kAnswer, NULL));
|
|
|
|
|
channel2_->Enable(true);
|
|
|
|
|
EXPECT_EQ(0u, media_channel2_->send_streams().size());
|
|
|
|
|
EXPECT_EQ(0u, media_channel2()->send_streams().size());
|
|
|
|
|
|
|
|
|
|
SendCustomRtp1(kSsrc1, 0);
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
@ -660,21 +687,21 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateContent(0, kPcmuCodec, kH264Codec, &content3);
|
|
|
|
|
content3.AddStream(stream2);
|
|
|
|
|
EXPECT_TRUE(channel2_->SetLocalContent(&content3, SdpType::kOffer, NULL));
|
|
|
|
|
ASSERT_EQ(1u, media_channel2_->send_streams().size());
|
|
|
|
|
EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
|
|
|
|
|
ASSERT_EQ(1u, media_channel2()->send_streams().size());
|
|
|
|
|
EXPECT_EQ(stream2, media_channel2()->send_streams()[0]);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content3, SdpType::kOffer, NULL));
|
|
|
|
|
ASSERT_EQ(1u, media_channel1_->recv_streams().size());
|
|
|
|
|
EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
|
|
|
|
|
ASSERT_EQ(1u, media_channel1()->recv_streams().size());
|
|
|
|
|
EXPECT_EQ(stream2, media_channel1()->recv_streams()[0]);
|
|
|
|
|
|
|
|
|
|
// Channel 1 replies but stop sending stream1.
|
|
|
|
|
typename T::Content content4;
|
|
|
|
|
CreateContent(0, kPcmuCodec, kH264Codec, &content4);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content4, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_EQ(0u, media_channel1_->send_streams().size());
|
|
|
|
|
EXPECT_EQ(0u, media_channel1()->send_streams().size());
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel2_->SetRemoteContent(&content4, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_EQ(0u, media_channel2_->recv_streams().size());
|
|
|
|
|
EXPECT_EQ(0u, media_channel2()->recv_streams().size());
|
|
|
|
|
|
|
|
|
|
SendCustomRtp2(kSsrc2, 0);
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
@ -685,58 +712,58 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
void TestPlayoutAndSendingStates() {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel1_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending());
|
|
|
|
|
channel1_->Enable(true);
|
|
|
|
|
FlushCurrentThread();
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel1_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
|
|
|
|
|
SdpType::kOffer, NULL));
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
|
|
|
|
|
SdpType::kOffer, NULL));
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending());
|
|
|
|
|
EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
|
|
|
|
|
SdpType::kAnswer, NULL));
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending());
|
|
|
|
|
ConnectFakeTransports();
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending());
|
|
|
|
|
channel2_->Enable(true);
|
|
|
|
|
FlushCurrentThread();
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel2_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel2_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->sending());
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
|
|
|
|
|
SdpType::kAnswer, NULL));
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that changing the MediaContentDirection in the local and remote
|
|
|
|
|
@ -754,13 +781,13 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
channel2_->Enable(true);
|
|
|
|
|
FlushCurrentThread();
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel1_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending());
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&content1, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_TRUE(channel2_->SetRemoteContent(&content1, SdpType::kOffer, NULL));
|
|
|
|
|
@ -771,13 +798,13 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
ConnectFakeTransports();
|
|
|
|
|
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending()); // remote InActive
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending()); // remote InActive
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_FALSE(media_channel2_->playout()); // local InActive
|
|
|
|
|
EXPECT_FALSE(media_channel2()->playout()); // local InActive
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending()); // local InActive
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending()); // local InActive
|
|
|
|
|
|
|
|
|
|
// Update |content2| to be RecvOnly.
|
|
|
|
|
content2.set_direction(RtpTransceiverDirection::kRecvOnly);
|
|
|
|
|
@ -787,13 +814,13 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
channel1_->SetRemoteContent(&content2, SdpType::kPrAnswer, NULL));
|
|
|
|
|
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel2_->playout()); // local RecvOnly
|
|
|
|
|
EXPECT_TRUE(media_channel2()->playout()); // local RecvOnly
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel2_->sending()); // local RecvOnly
|
|
|
|
|
EXPECT_FALSE(media_channel2()->sending()); // local RecvOnly
|
|
|
|
|
|
|
|
|
|
// Update |content2| to be SendRecv.
|
|
|
|
|
content2.set_direction(RtpTransceiverDirection::kSendRecv);
|
|
|
|
|
@ -801,13 +828,13 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&content2, SdpType::kAnswer, NULL));
|
|
|
|
|
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel2_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel2_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->sending());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Tests that when the transport channel signals a candidate pair change
|
|
|
|
|
@ -876,18 +903,18 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
EXPECT_FALSE(IsSrtpActive(channel1_));
|
|
|
|
|
EXPECT_TRUE(SendInitiate());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel1_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_FALSE(media_channel1_->sending());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->sending());
|
|
|
|
|
EXPECT_TRUE(SendAccept());
|
|
|
|
|
EXPECT_FALSE(IsSrtpActive(channel1_));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_EQ(1U, media_channel1_->codecs().size());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
EXPECT_EQ(1U, media_channel1()->codecs().size());
|
|
|
|
|
if (verify_playout_) {
|
|
|
|
|
EXPECT_TRUE(media_channel2_->playout());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->playout());
|
|
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(media_channel2_->sending());
|
|
|
|
|
EXPECT_EQ(1U, media_channel2_->codecs().size());
|
|
|
|
|
EXPECT_TRUE(media_channel2()->sending());
|
|
|
|
|
EXPECT_EQ(1U, media_channel2()->codecs().size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that we don't crash if packets are sent during call teardown
|
|
|
|
|
@ -897,16 +924,17 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
void TestCallTeardownRtcpMux() {
|
|
|
|
|
class LastWordMediaChannel : public T::MediaChannel {
|
|
|
|
|
public:
|
|
|
|
|
LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
|
|
|
|
|
explicit LastWordMediaChannel(rtc::Thread* network_thread)
|
|
|
|
|
: T::MediaChannel(NULL, typename T::Options(), network_thread) {}
|
|
|
|
|
~LastWordMediaChannel() {
|
|
|
|
|
T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
|
|
|
|
|
rtc::PacketOptions());
|
|
|
|
|
T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
CreateChannels(std::make_unique<LastWordMediaChannel>(),
|
|
|
|
|
std::make_unique<LastWordMediaChannel>(), RTCP_MUX,
|
|
|
|
|
RTCP_MUX);
|
|
|
|
|
CreateChannels(std::make_unique<LastWordMediaChannel>(network_thread_),
|
|
|
|
|
std::make_unique<LastWordMediaChannel>(network_thread_),
|
|
|
|
|
RTCP_MUX, RTCP_MUX);
|
|
|
|
|
EXPECT_TRUE(SendInitiate());
|
|
|
|
|
EXPECT_TRUE(SendAccept());
|
|
|
|
|
EXPECT_TRUE(Terminate());
|
|
|
|
|
@ -1035,7 +1063,7 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
|
|
|
|
|
fake_rtp_dtls_transport1_->SetWritable(true);
|
|
|
|
|
});
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
SendRtp1();
|
|
|
|
|
SendRtp2();
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
@ -1049,7 +1077,7 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
bool asymmetric = true;
|
|
|
|
|
fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
|
|
|
|
|
});
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
|
|
|
|
|
// Should fail also.
|
|
|
|
|
SendRtp1();
|
|
|
|
|
@ -1065,7 +1093,7 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
|
|
|
|
|
asymmetric);
|
|
|
|
|
});
|
|
|
|
|
EXPECT_TRUE(media_channel1_->sending());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->sending());
|
|
|
|
|
SendRtp1();
|
|
|
|
|
SendRtp2();
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
@ -1118,17 +1146,17 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
std::unique_ptr<typename T::Content> content(
|
|
|
|
|
CreateMediaContentWithStream(1));
|
|
|
|
|
|
|
|
|
|
media_channel1_->set_fail_set_recv_codecs(true);
|
|
|
|
|
media_channel1()->set_fail_set_recv_codecs(true);
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetLocalContent(content.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetLocalContent(content.get(), SdpType::kAnswer, &err));
|
|
|
|
|
|
|
|
|
|
media_channel1_->set_fail_set_send_codecs(true);
|
|
|
|
|
media_channel1()->set_fail_set_send_codecs(true);
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetRemoteContent(content.get(), SdpType::kOffer, &err));
|
|
|
|
|
|
|
|
|
|
media_channel1_->set_fail_set_send_codecs(true);
|
|
|
|
|
media_channel1()->set_fail_set_send_codecs(true);
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetRemoteContent(content.get(), SdpType::kAnswer, &err));
|
|
|
|
|
}
|
|
|
|
|
@ -1141,14 +1169,14 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateMediaContentWithStream(1));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(1));
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<typename T::Content> content2(
|
|
|
|
|
CreateMediaContentWithStream(2));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetLocalContent(content2.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_FALSE(media_channel1_->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(2));
|
|
|
|
|
EXPECT_FALSE(media_channel1()->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestReceiveTwoOffers() {
|
|
|
|
|
@ -1159,14 +1187,14 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateMediaContentWithStream(1));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(1));
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<typename T::Content> content2(
|
|
|
|
|
CreateMediaContentWithStream(2));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(content2.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_FALSE(media_channel1_->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(2));
|
|
|
|
|
EXPECT_FALSE(media_channel1()->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestSendPrAnswer() {
|
|
|
|
|
@ -1178,24 +1206,24 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateMediaContentWithStream(1));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(content1.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(1));
|
|
|
|
|
|
|
|
|
|
// Send PR answer
|
|
|
|
|
std::unique_ptr<typename T::Content> content2(
|
|
|
|
|
CreateMediaContentWithStream(2));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetLocalContent(content2.get(), SdpType::kPrAnswer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(2));
|
|
|
|
|
|
|
|
|
|
// Send answer
|
|
|
|
|
std::unique_ptr<typename T::Content> content3(
|
|
|
|
|
CreateMediaContentWithStream(3));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetLocalContent(content3.get(), SdpType::kAnswer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(1));
|
|
|
|
|
EXPECT_FALSE(media_channel1_->HasSendStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(3));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(1));
|
|
|
|
|
EXPECT_FALSE(media_channel1()->HasSendStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestReceivePrAnswer() {
|
|
|
|
|
@ -1207,39 +1235,39 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateMediaContentWithStream(1));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetLocalContent(content1.get(), SdpType::kOffer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(1));
|
|
|
|
|
|
|
|
|
|
// Receive PR answer
|
|
|
|
|
std::unique_ptr<typename T::Content> content2(
|
|
|
|
|
CreateMediaContentWithStream(2));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(content2.get(), SdpType::kPrAnswer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(1));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(2));
|
|
|
|
|
|
|
|
|
|
// Receive answer
|
|
|
|
|
std::unique_ptr<typename T::Content> content3(
|
|
|
|
|
CreateMediaContentWithStream(3));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(content3.get(), SdpType::kAnswer, &err));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasSendStream(1));
|
|
|
|
|
EXPECT_FALSE(media_channel1_->HasRecvStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->HasRecvStream(3));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasSendStream(1));
|
|
|
|
|
EXPECT_FALSE(media_channel1()->HasRecvStream(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->HasRecvStream(3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestOnTransportReadyToSend() {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
EXPECT_FALSE(media_channel1_->ready_to_send());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->ready_to_send());
|
|
|
|
|
|
|
|
|
|
network_thread_->PostTask(
|
|
|
|
|
RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(true); });
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
EXPECT_TRUE(media_channel1_->ready_to_send());
|
|
|
|
|
EXPECT_TRUE(media_channel1()->ready_to_send());
|
|
|
|
|
|
|
|
|
|
network_thread_->PostTask(
|
|
|
|
|
RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
|
|
|
|
|
WaitForThreads();
|
|
|
|
|
EXPECT_FALSE(media_channel1_->ready_to_send());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->ready_to_send());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool SetRemoteContentWithBitrateLimit(int remote_limit) {
|
|
|
|
|
@ -1267,8 +1295,8 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
|
|
|
|
|
SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_EQ(media_channel1_->max_bps(), -1);
|
|
|
|
|
VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
|
|
|
|
|
EXPECT_EQ(media_channel1()->max_bps(), -1);
|
|
|
|
|
VerifyMaxBitrate(media_channel1()->GetRtpSendParameters(kSsrc1),
|
|
|
|
|
absl::nullopt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1285,17 +1313,16 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
|
|
|
|
|
CreateChannels(DTLS, DTLS);
|
|
|
|
|
|
|
|
|
|
channel1_->SetOption(cricket::BaseChannel::ST_RTP,
|
|
|
|
|
rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
|
|
|
|
|
channel2_->SetOption(cricket::BaseChannel::ST_RTP,
|
|
|
|
|
rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
|
|
|
|
|
|
|
|
|
|
new_rtp_transport_ = CreateDtlsSrtpTransport(
|
|
|
|
|
fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
|
|
|
|
|
|
|
|
|
|
bool rcv_success, send_success;
|
|
|
|
|
int rcv_buf, send_buf;
|
|
|
|
|
network_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
|
|
|
|
|
channel1_->SetOption(cricket::BaseChannel::ST_RTP,
|
|
|
|
|
rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
|
|
|
|
|
channel2_->SetOption(cricket::BaseChannel::ST_RTP,
|
|
|
|
|
rtc::Socket::Option::OPT_RCVBUF, kRcvBufSize);
|
|
|
|
|
channel1_->SetRtpTransport(new_rtp_transport_.get());
|
|
|
|
|
send_success = fake_rtp_dtls_transport2_->GetOption(
|
|
|
|
|
rtc::Socket::Option::OPT_SNDBUF, &send_buf);
|
|
|
|
|
@ -1388,9 +1415,24 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
// Worker thread = current Thread process received messages.
|
|
|
|
|
ProcessThreadQueue(rtc::Thread::Current());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename T::MediaChannel* media_channel1() {
|
|
|
|
|
RTC_DCHECK(channel1_);
|
|
|
|
|
RTC_DCHECK(channel1_->media_channel());
|
|
|
|
|
return static_cast<typename T::MediaChannel*>(channel1_->media_channel());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename T::MediaChannel* media_channel2() {
|
|
|
|
|
RTC_DCHECK(channel2_);
|
|
|
|
|
RTC_DCHECK(channel2_->media_channel());
|
|
|
|
|
return static_cast<typename T::MediaChannel*>(channel2_->media_channel());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(pbos): Remove playout from all media channels and let renderers mute
|
|
|
|
|
// themselves.
|
|
|
|
|
const bool verify_playout_;
|
|
|
|
|
rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_thread_safety_ =
|
|
|
|
|
webrtc::PendingTaskSafetyFlag::CreateDetached();
|
|
|
|
|
std::unique_ptr<rtc::Thread> network_thread_keeper_;
|
|
|
|
|
rtc::Thread* network_thread_;
|
|
|
|
|
std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
|
|
|
|
|
@ -1405,9 +1447,6 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
|
|
|
|
|
std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport2_;
|
|
|
|
|
std::unique_ptr<webrtc::RtpTransportInternal> new_rtp_transport_;
|
|
|
|
|
cricket::FakeMediaEngine media_engine_;
|
|
|
|
|
// The media channels are owned by the voice channel objects below.
|
|
|
|
|
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_;
|
|
|
|
|
@ -1567,8 +1606,8 @@ class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
|
|
|
|
|
|
|
|
|
|
TEST_F(VoiceChannelSingleThreadTest, TestInit) {
|
|
|
|
|
Base::TestInit();
|
|
|
|
|
EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
|
|
|
|
|
@ -1708,8 +1747,8 @@ TEST_F(VoiceChannelSingleThreadTest, SocketOptionsMergedOnSetTransport) {
|
|
|
|
|
// VoiceChannelDoubleThreadTest
|
|
|
|
|
TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
|
|
|
|
|
Base::TestInit();
|
|
|
|
|
EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
|
|
|
|
|
EXPECT_FALSE(media_channel1()->IsStreamMuted(0));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->dtmf_info_queue().empty());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
|
|
|
|
|
@ -1999,12 +2038,12 @@ TEST_F(VideoChannelSingleThreadTest, TestSetLocalOfferWithPacketization) {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
|
|
|
|
|
EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
|
|
|
|
|
cricket::kPacketizationParamRaw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -2018,12 +2057,12 @@ TEST_F(VideoChannelSingleThreadTest, TestSetRemoteOfferWithPacketization) {
|
|
|
|
|
CreateChannels(0, 0);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
|
|
|
|
|
EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
|
|
|
|
|
cricket::kPacketizationParamRaw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -2038,17 +2077,17 @@ TEST_F(VideoChannelSingleThreadTest, TestSetAnswerWithPacketization) {
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_TRUE(channel1_->SetRemoteContent(&video, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->recv_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1_->recv_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[1].packetization,
|
|
|
|
|
ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->recv_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1()->recv_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[1].packetization,
|
|
|
|
|
cricket::kPacketizationParamRaw);
|
|
|
|
|
EXPECT_THAT(media_channel1_->send_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1_->send_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1_->send_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[1].packetization,
|
|
|
|
|
EXPECT_THAT(media_channel1()->send_codecs(), testing::SizeIs(2));
|
|
|
|
|
EXPECT_TRUE(media_channel1()->send_codecs()[0].Matches(kVp8Codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_TRUE(media_channel1()->send_codecs()[1].Matches(vp9_codec));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[1].packetization,
|
|
|
|
|
cricket::kPacketizationParamRaw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -2066,10 +2105,10 @@ TEST_F(VideoChannelSingleThreadTest, TestSetLocalAnswerWithoutPacketization) {
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
|
|
|
|
|
@ -2086,10 +2125,10 @@ TEST_F(VideoChannelSingleThreadTest, TestSetRemoteAnswerWithoutPacketization) {
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(VideoChannelSingleThreadTest,
|
|
|
|
|
@ -2108,10 +2147,10 @@ TEST_F(VideoChannelSingleThreadTest,
|
|
|
|
|
EXPECT_TRUE(channel1_->SetLocalContent(&local_video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetRemoteContent(&remote_video, SdpType::kAnswer, NULL));
|
|
|
|
|
ASSERT_THAT(media_channel1_->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->recv_codecs()[0].packetization,
|
|
|
|
|
ASSERT_THAT(media_channel1()->recv_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->recv_codecs()[0].packetization,
|
|
|
|
|
cricket::kPacketizationParamRaw);
|
|
|
|
|
EXPECT_THAT(media_channel1_->send_codecs(), testing::IsEmpty());
|
|
|
|
|
EXPECT_THAT(media_channel1()->send_codecs(), testing::IsEmpty());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(VideoChannelSingleThreadTest,
|
|
|
|
|
@ -2130,9 +2169,9 @@ TEST_F(VideoChannelSingleThreadTest,
|
|
|
|
|
channel1_->SetRemoteContent(&remote_video, SdpType::kOffer, NULL));
|
|
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel1_->SetLocalContent(&local_video, SdpType::kAnswer, NULL));
|
|
|
|
|
EXPECT_THAT(media_channel1_->recv_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1_->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1_->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
EXPECT_THAT(media_channel1()->recv_codecs(), testing::IsEmpty());
|
|
|
|
|
ASSERT_THAT(media_channel1()->send_codecs(), testing::SizeIs(1));
|
|
|
|
|
EXPECT_EQ(media_channel1()->send_codecs()[0].packetization, absl::nullopt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// VideoChannelDoubleThreadTest
|
|
|
|
|
|