Index: webrtc/pc/rtpsenderreceiver_unittest.cc |
diff --git a/webrtc/pc/rtpsenderreceiver_unittest.cc b/webrtc/pc/rtpsenderreceiver_unittest.cc |
index 86c06121149fc632ac935880795b3cc8cc15002e..508a417733d7197484e5672df0631d25844ab92f 100644 |
--- a/webrtc/pc/rtpsenderreceiver_unittest.cc |
+++ b/webrtc/pc/rtpsenderreceiver_unittest.cc |
@@ -13,6 +13,7 @@ |
#include <utility> |
#include "webrtc/base/gunit.h" |
+#include "webrtc/base/sigslot.h" |
#include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
#include "webrtc/media/base/fakemediaengine.h" |
#include "webrtc/media/base/mediachannel.h" |
@@ -38,6 +39,8 @@ using ::testing::Exactly; |
using ::testing::InvokeWithoutArgs; |
using ::testing::Return; |
+namespace { |
+ |
static const char kStreamLabel1[] = "local_stream_1"; |
static const char kVideoTrackId[] = "video_1"; |
static const char kAudioTrackId[] = "audio_1"; |
@@ -45,10 +48,14 @@ static const uint32_t kVideoSsrc = 98; |
static const uint32_t kVideoSsrc2 = 100; |
static const uint32_t kAudioSsrc = 99; |
static const uint32_t kAudioSsrc2 = 101; |
+static const int kDefaultTimeout = 10000; // 10 seconds. |
+ |
+} // namespace |
namespace webrtc { |
-class RtpSenderReceiverTest : public testing::Test { |
+class RtpSenderReceiverTest : public testing::Test, |
+ public sigslot::has_slots<> { |
public: |
RtpSenderReceiverTest() |
: // Create fake media engine/etc. so we can create channels to use to |
@@ -75,6 +82,8 @@ class RtpSenderReceiverTest : public testing::Test { |
&fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), |
cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required, |
cricket::VideoOptions()); |
+ voice_channel_->Enable(true); |
+ video_channel_->Enable(true); |
voice_media_channel_ = media_engine_->GetVoiceChannel(0); |
video_media_channel_ = media_engine_->GetVideoChannel(0); |
RTC_CHECK(voice_channel_); |
@@ -104,7 +113,14 @@ class RtpSenderReceiverTest : public testing::Test { |
cricket::StreamParams::CreateLegacy(kVideoSsrc2)); |
} |
- void TearDown() override { channel_manager_.Terminate(); } |
+ // Needed to use DTMF sender. |
+ void AddDtmfCodec() { |
+ cricket::AudioSendParameters params; |
+ const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, |
+ 0, 1); |
+ params.codecs.push_back(kTelephoneEventCodec); |
+ voice_media_channel_->SetSendParameters(params); |
+ } |
void AddVideoTrack() { AddVideoTrack(false); } |
@@ -124,9 +140,13 @@ class RtpSenderReceiverTest : public testing::Test { |
new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), |
voice_channel_, nullptr); |
audio_rtp_sender_->SetSsrc(kAudioSsrc); |
+ audio_rtp_sender_->GetOnDestroyedSignal()->connect( |
+ this, &RtpSenderReceiverTest::OnAudioSenderDestroyed); |
VerifyVoiceChannelInput(); |
} |
+ void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; } |
+ |
void CreateVideoRtpSender() { CreateVideoRtpSender(false); } |
void CreateVideoRtpSender(bool is_screencast) { |
@@ -247,6 +267,7 @@ class RtpSenderReceiverTest : public testing::Test { |
rtc::scoped_refptr<MediaStreamInterface> stream_; |
rtc::scoped_refptr<VideoTrackInterface> video_track_; |
rtc::scoped_refptr<AudioTrackInterface> audio_track_; |
+ bool audio_sender_destroyed_signal_fired_ = false; |
}; |
// Test that |voice_channel_| is updated when an audio track is associated |
@@ -721,4 +742,66 @@ TEST_F(RtpSenderReceiverTest, |
DestroyVideoRtpSender(); |
} |
+TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) { |
+ CreateAudioRtpSender(); |
+ EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender()); |
+} |
+ |
+TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) { |
+ CreateVideoRtpSender(); |
+ EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender()); |
+} |
+ |
+// Test that the DTMF sender is really using |voice_channel_|, and thus returns |
+// true/false from CanSendDtmf based on what |voice_channel_| returns. |
+TEST_F(RtpSenderReceiverTest, CanInsertDtmf) { |
+ AddDtmfCodec(); |
+ CreateAudioRtpSender(); |
+ auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
+ ASSERT_NE(nullptr, dtmf_sender); |
+ EXPECT_TRUE(dtmf_sender->CanInsertDtmf()); |
+} |
+ |
+TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) { |
+ CreateAudioRtpSender(); |
+ auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
+ ASSERT_NE(nullptr, dtmf_sender); |
+ // DTMF codec has not been added, as it was in the above test. |
+ EXPECT_FALSE(dtmf_sender->CanInsertDtmf()); |
+} |
+ |
+TEST_F(RtpSenderReceiverTest, InsertDtmf) { |
+ AddDtmfCodec(); |
+ CreateAudioRtpSender(); |
+ auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
+ ASSERT_NE(nullptr, dtmf_sender); |
+ |
+ EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size()); |
+ |
+ // Insert DTMF |
+ const int expected_duration = 90; |
+ dtmf_sender->InsertDtmf("012", expected_duration, 100); |
+ |
+ // Verify |
+ ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(), |
+ kDefaultTimeout); |
+ const uint32_t send_ssrc = |
+ voice_media_channel_->send_streams()[0].first_ssrc(); |
+ EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0], |
+ send_ssrc, 0, expected_duration)); |
+ EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1], |
+ send_ssrc, 1, expected_duration)); |
+ EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2], |
+ send_ssrc, 2, expected_duration)); |
+} |
+ |
+// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is |
+// destroyed, which is needed for the DTMF sender. |
+TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) { |
+ CreateAudioRtpSender(); |
+ EXPECT_FALSE(audio_sender_destroyed_signal_fired_); |
+ audio_rtp_sender_ = nullptr; |
+ EXPECT_TRUE(audio_sender_destroyed_signal_fired_); |
+} |
+ |
} // namespace webrtc |