Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: webrtc/pc/rtpsenderreceiver_unittest.cc

Issue 2666853002: Move DTMF sender to RtpSender (as opposed to WebRtcSession). (Closed)
Patch Set: Merge with master Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/pc/rtpsender.cc ('k') | webrtc/pc/webrtcsession.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <memory> 11 #include <memory>
12 #include <string> 12 #include <string>
13 #include <utility> 13 #include <utility>
14 14
15 #include "webrtc/base/gunit.h" 15 #include "webrtc/base/gunit.h"
16 #include "webrtc/base/sigslot.h"
16 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 17 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
17 #include "webrtc/media/base/fakemediaengine.h" 18 #include "webrtc/media/base/fakemediaengine.h"
18 #include "webrtc/media/base/mediachannel.h" 19 #include "webrtc/media/base/mediachannel.h"
19 #include "webrtc/media/engine/fakewebrtccall.h" 20 #include "webrtc/media/engine/fakewebrtccall.h"
20 #include "webrtc/p2p/base/faketransportcontroller.h" 21 #include "webrtc/p2p/base/faketransportcontroller.h"
21 #include "webrtc/pc/audiotrack.h" 22 #include "webrtc/pc/audiotrack.h"
22 #include "webrtc/pc/channelmanager.h" 23 #include "webrtc/pc/channelmanager.h"
23 #include "webrtc/pc/fakemediacontroller.h" 24 #include "webrtc/pc/fakemediacontroller.h"
24 #include "webrtc/pc/localaudiosource.h" 25 #include "webrtc/pc/localaudiosource.h"
25 #include "webrtc/pc/mediastream.h" 26 #include "webrtc/pc/mediastream.h"
26 #include "webrtc/pc/remoteaudiosource.h" 27 #include "webrtc/pc/remoteaudiosource.h"
27 #include "webrtc/pc/rtpreceiver.h" 28 #include "webrtc/pc/rtpreceiver.h"
28 #include "webrtc/pc/rtpsender.h" 29 #include "webrtc/pc/rtpsender.h"
29 #include "webrtc/pc/streamcollection.h" 30 #include "webrtc/pc/streamcollection.h"
30 #include "webrtc/pc/test/fakevideotracksource.h" 31 #include "webrtc/pc/test/fakevideotracksource.h"
31 #include "webrtc/pc/videotrack.h" 32 #include "webrtc/pc/videotrack.h"
32 #include "webrtc/pc/videotracksource.h" 33 #include "webrtc/pc/videotracksource.h"
33 #include "webrtc/test/gmock.h" 34 #include "webrtc/test/gmock.h"
34 #include "webrtc/test/gtest.h" 35 #include "webrtc/test/gtest.h"
35 36
36 using ::testing::_; 37 using ::testing::_;
37 using ::testing::Exactly; 38 using ::testing::Exactly;
38 using ::testing::InvokeWithoutArgs; 39 using ::testing::InvokeWithoutArgs;
39 using ::testing::Return; 40 using ::testing::Return;
40 41
42 namespace {
43
41 static const char kStreamLabel1[] = "local_stream_1"; 44 static const char kStreamLabel1[] = "local_stream_1";
42 static const char kVideoTrackId[] = "video_1"; 45 static const char kVideoTrackId[] = "video_1";
43 static const char kAudioTrackId[] = "audio_1"; 46 static const char kAudioTrackId[] = "audio_1";
44 static const uint32_t kVideoSsrc = 98; 47 static const uint32_t kVideoSsrc = 98;
45 static const uint32_t kVideoSsrc2 = 100; 48 static const uint32_t kVideoSsrc2 = 100;
46 static const uint32_t kAudioSsrc = 99; 49 static const uint32_t kAudioSsrc = 99;
47 static const uint32_t kAudioSsrc2 = 101; 50 static const uint32_t kAudioSsrc2 = 101;
51 static const int kDefaultTimeout = 10000; // 10 seconds.
52
53 } // namespace
48 54
49 namespace webrtc { 55 namespace webrtc {
50 56
51 class RtpSenderReceiverTest : public testing::Test { 57 class RtpSenderReceiverTest : public testing::Test,
58 public sigslot::has_slots<> {
52 public: 59 public:
53 RtpSenderReceiverTest() 60 RtpSenderReceiverTest()
54 : // Create fake media engine/etc. so we can create channels to use to 61 : // Create fake media engine/etc. so we can create channels to use to
55 // test RtpSenders/RtpReceivers. 62 // test RtpSenders/RtpReceivers.
56 media_engine_(new cricket::FakeMediaEngine()), 63 media_engine_(new cricket::FakeMediaEngine()),
57 channel_manager_(media_engine_, 64 channel_manager_(media_engine_,
58 rtc::Thread::Current(), 65 rtc::Thread::Current(),
59 rtc::Thread::Current()), 66 rtc::Thread::Current()),
60 fake_call_(Call::Config(&event_log_)), 67 fake_call_(Call::Config(&event_log_)),
61 fake_media_controller_(&channel_manager_, &fake_call_), 68 fake_media_controller_(&channel_manager_, &fake_call_),
62 stream_(MediaStream::Create(kStreamLabel1)) { 69 stream_(MediaStream::Create(kStreamLabel1)) {
63 // Create channels to be used by the RtpSenders and RtpReceivers. 70 // Create channels to be used by the RtpSenders and RtpReceivers.
64 channel_manager_.Init(); 71 channel_manager_.Init();
65 bool rtcp_mux_required = true; 72 bool rtcp_mux_required = true;
66 bool srtp_required = true; 73 bool srtp_required = true;
67 cricket::DtlsTransportInternal* rtp_transport = 74 cricket::DtlsTransportInternal* rtp_transport =
68 fake_transport_controller_.CreateDtlsTransport( 75 fake_transport_controller_.CreateDtlsTransport(
69 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP); 76 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
70 voice_channel_ = channel_manager_.CreateVoiceChannel( 77 voice_channel_ = channel_manager_.CreateVoiceChannel(
71 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), 78 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
72 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required, 79 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required,
73 cricket::AudioOptions()); 80 cricket::AudioOptions());
74 video_channel_ = channel_manager_.CreateVideoChannel( 81 video_channel_ = channel_manager_.CreateVideoChannel(
75 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), 82 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
76 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required, 83 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required,
77 cricket::VideoOptions()); 84 cricket::VideoOptions());
85 voice_channel_->Enable(true);
86 video_channel_->Enable(true);
78 voice_media_channel_ = media_engine_->GetVoiceChannel(0); 87 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
79 video_media_channel_ = media_engine_->GetVideoChannel(0); 88 video_media_channel_ = media_engine_->GetVideoChannel(0);
80 RTC_CHECK(voice_channel_); 89 RTC_CHECK(voice_channel_);
81 RTC_CHECK(video_channel_); 90 RTC_CHECK(video_channel_);
82 RTC_CHECK(voice_media_channel_); 91 RTC_CHECK(voice_media_channel_);
83 RTC_CHECK(video_media_channel_); 92 RTC_CHECK(video_media_channel_);
84 93
85 // Create streams for predefined SSRCs. Streams need to exist in order 94 // Create streams for predefined SSRCs. Streams need to exist in order
86 // for the senders and receievers to apply parameters to them. 95 // for the senders and receievers to apply parameters to them.
87 // Normally these would be created by SetLocalDescription and 96 // Normally these would be created by SetLocalDescription and
88 // SetRemoteDescription. 97 // SetRemoteDescription.
89 voice_media_channel_->AddSendStream( 98 voice_media_channel_->AddSendStream(
90 cricket::StreamParams::CreateLegacy(kAudioSsrc)); 99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
91 voice_media_channel_->AddRecvStream( 100 voice_media_channel_->AddRecvStream(
92 cricket::StreamParams::CreateLegacy(kAudioSsrc)); 101 cricket::StreamParams::CreateLegacy(kAudioSsrc));
93 voice_media_channel_->AddSendStream( 102 voice_media_channel_->AddSendStream(
94 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); 103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
95 voice_media_channel_->AddRecvStream( 104 voice_media_channel_->AddRecvStream(
96 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); 105 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
97 video_media_channel_->AddSendStream( 106 video_media_channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kVideoSsrc)); 107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
99 video_media_channel_->AddRecvStream( 108 video_media_channel_->AddRecvStream(
100 cricket::StreamParams::CreateLegacy(kVideoSsrc)); 109 cricket::StreamParams::CreateLegacy(kVideoSsrc));
101 video_media_channel_->AddSendStream( 110 video_media_channel_->AddSendStream(
102 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); 111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
103 video_media_channel_->AddRecvStream( 112 video_media_channel_->AddRecvStream(
104 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); 113 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
105 } 114 }
106 115
107 void TearDown() override { channel_manager_.Terminate(); } 116 // Needed to use DTMF sender.
117 void AddDtmfCodec() {
118 cricket::AudioSendParameters params;
119 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
120 0, 1);
121 params.codecs.push_back(kTelephoneEventCodec);
122 voice_media_channel_->SetSendParameters(params);
123 }
108 124
109 void AddVideoTrack() { AddVideoTrack(false); } 125 void AddVideoTrack() { AddVideoTrack(false); }
110 126
111 void AddVideoTrack(bool is_screencast) { 127 void AddVideoTrack(bool is_screencast) {
112 rtc::scoped_refptr<VideoTrackSourceInterface> source( 128 rtc::scoped_refptr<VideoTrackSourceInterface> source(
113 FakeVideoTrackSource::Create(is_screencast)); 129 FakeVideoTrackSource::Create(is_screencast));
114 video_track_ = VideoTrack::Create(kVideoTrackId, source); 130 video_track_ = VideoTrack::Create(kVideoTrackId, source);
115 EXPECT_TRUE(stream_->AddTrack(video_track_)); 131 EXPECT_TRUE(stream_->AddTrack(video_track_));
116 } 132 }
117 133
118 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); } 134 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
119 135
120 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) { 136 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
121 audio_track_ = AudioTrack::Create(kAudioTrackId, source); 137 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
122 EXPECT_TRUE(stream_->AddTrack(audio_track_)); 138 EXPECT_TRUE(stream_->AddTrack(audio_track_));
123 audio_rtp_sender_ = 139 audio_rtp_sender_ =
124 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), 140 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
125 voice_channel_, nullptr); 141 voice_channel_, nullptr);
126 audio_rtp_sender_->SetSsrc(kAudioSsrc); 142 audio_rtp_sender_->SetSsrc(kAudioSsrc);
143 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
144 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
127 VerifyVoiceChannelInput(); 145 VerifyVoiceChannelInput();
128 } 146 }
129 147
148 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
149
130 void CreateVideoRtpSender() { CreateVideoRtpSender(false); } 150 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
131 151
132 void CreateVideoRtpSender(bool is_screencast) { 152 void CreateVideoRtpSender(bool is_screencast) {
133 AddVideoTrack(is_screencast); 153 AddVideoTrack(is_screencast);
134 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], 154 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
135 stream_->label(), video_channel_); 155 stream_->label(), video_channel_);
136 video_rtp_sender_->SetSsrc(kVideoSsrc); 156 video_rtp_sender_->SetSsrc(kVideoSsrc);
137 VerifyVideoChannelInput(); 157 VerifyVideoChannelInput();
138 } 158 }
139 159
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 cricket::VideoChannel* video_channel_; 260 cricket::VideoChannel* video_channel_;
241 cricket::FakeVoiceMediaChannel* voice_media_channel_; 261 cricket::FakeVoiceMediaChannel* voice_media_channel_;
242 cricket::FakeVideoMediaChannel* video_media_channel_; 262 cricket::FakeVideoMediaChannel* video_media_channel_;
243 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_; 263 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
244 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_; 264 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
245 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_; 265 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
246 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_; 266 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
247 rtc::scoped_refptr<MediaStreamInterface> stream_; 267 rtc::scoped_refptr<MediaStreamInterface> stream_;
248 rtc::scoped_refptr<VideoTrackInterface> video_track_; 268 rtc::scoped_refptr<VideoTrackInterface> video_track_;
249 rtc::scoped_refptr<AudioTrackInterface> audio_track_; 269 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
270 bool audio_sender_destroyed_signal_fired_ = false;
250 }; 271 };
251 272
252 // Test that |voice_channel_| is updated when an audio track is associated 273 // Test that |voice_channel_| is updated when an audio track is associated
253 // and disassociated with an AudioRtpSender. 274 // and disassociated with an AudioRtpSender.
254 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) { 275 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
255 CreateAudioRtpSender(); 276 CreateAudioRtpSender();
256 DestroyAudioRtpSender(); 277 DestroyAudioRtpSender();
257 } 278 }
258 279
259 // Test that |video_channel_| is updated when a video track is associated and 280 // Test that |video_channel_| is updated when a video track is associated and
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 735
715 // And removing the hint should go back to false (to verify that false was 736 // And removing the hint should go back to false (to verify that false was
716 // default correctly). 737 // default correctly).
717 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone); 738 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
718 EXPECT_EQ(rtc::Optional<bool>(false), 739 EXPECT_EQ(rtc::Optional<bool>(false),
719 video_media_channel_->options().is_screencast); 740 video_media_channel_->options().is_screencast);
720 741
721 DestroyVideoRtpSender(); 742 DestroyVideoRtpSender();
722 } 743 }
723 744
745 TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
746 CreateAudioRtpSender();
747 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
748 }
749
750 TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
751 CreateVideoRtpSender();
752 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
753 }
754
755 // Test that the DTMF sender is really using |voice_channel_|, and thus returns
756 // true/false from CanSendDtmf based on what |voice_channel_| returns.
757 TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
758 AddDtmfCodec();
759 CreateAudioRtpSender();
760 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
761 ASSERT_NE(nullptr, dtmf_sender);
762 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
763 }
764
765 TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
766 CreateAudioRtpSender();
767 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
768 ASSERT_NE(nullptr, dtmf_sender);
769 // DTMF codec has not been added, as it was in the above test.
770 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
771 }
772
773 TEST_F(RtpSenderReceiverTest, InsertDtmf) {
774 AddDtmfCodec();
775 CreateAudioRtpSender();
776 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
777 ASSERT_NE(nullptr, dtmf_sender);
778
779 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
780
781 // Insert DTMF
782 const int expected_duration = 90;
783 dtmf_sender->InsertDtmf("012", expected_duration, 100);
784
785 // Verify
786 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
787 kDefaultTimeout);
788 const uint32_t send_ssrc =
789 voice_media_channel_->send_streams()[0].first_ssrc();
790 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
791 send_ssrc, 0, expected_duration));
792 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
793 send_ssrc, 1, expected_duration));
794 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
795 send_ssrc, 2, expected_duration));
796 }
797
798 // Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
799 // destroyed, which is needed for the DTMF sender.
800 TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
801 CreateAudioRtpSender();
802 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
803 audio_rtp_sender_ = nullptr;
804 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
805 }
806
724 } // namespace webrtc 807 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/pc/rtpsender.cc ('k') | webrtc/pc/webrtcsession.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698