OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |