OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | |
3 * | |
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 | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <memory> | |
12 | |
13 #include "webrtc/base/fakenetwork.h" | |
14 #include "webrtc/base/gunit.h" | |
15 #include "webrtc/base/physicalsocketserver.h" | |
16 #include "webrtc/base/virtualsocketserver.h" | |
17 #include "webrtc/media/base/fakemediaengine.h" | |
18 #include "webrtc/ortc/ortcfactory.h" | |
19 #include "webrtc/ortc/testrtpparameters.h" | |
20 #include "webrtc/p2p/base/fakepackettransport.h" | |
21 | |
22 namespace webrtc { | |
23 | |
24 // This test uses a virtual network and fake media engine, in order to test the | |
25 // RtpTransport at only an API level. Any end-to-end test should go in | |
26 // ortcfactory_integrationtest.cc instead. | |
27 class RtpTransportTest : public testing::Test { | |
28 public: | |
29 RtpTransportTest() | |
30 : virtual_socket_server_(&physical_socket_server_), | |
pthatcher1
2017/02/21 20:34:54
Why do we need a virtual socket server when you're
| |
31 socket_server_scope_(&virtual_socket_server_) { | |
32 fake_media_engine_ = new cricket::FakeMediaEngine(); | |
33 auto result = OrtcFactory::Create( | |
34 nullptr, nullptr, &fake_network_manager_, nullptr, nullptr, | |
35 std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_)); | |
36 ortc_factory_ = result.MoveValue(); | |
37 } | |
38 | |
39 protected: | |
40 // Owned by |ortc_factory_|. | |
41 cricket::FakeMediaEngine* fake_media_engine_; | |
42 rtc::PhysicalSocketServer physical_socket_server_; | |
43 rtc::VirtualSocketServer virtual_socket_server_; | |
44 rtc::SocketServerScope socket_server_scope_; | |
45 rtc::FakeNetworkManager fake_network_manager_; | |
46 std::unique_ptr<OrtcFactoryInterface> ortc_factory_; | |
47 }; | |
48 | |
49 // Test GetRtpPacketTransport and GetRtcpPacketTransport, with and without RTCP | |
50 // muxing. | |
51 TEST_F(RtpTransportTest, GetPacketTransports) { | |
52 rtc::FakePacketTransport rtp("rtp"); | |
53 rtc::FakePacketTransport rtcp("rtcp"); | |
54 // With muxed RTCP. | |
55 RtcpParameters rtcp_parameters; | |
56 rtcp_parameters.mux = true; | |
57 auto result = ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, | |
58 nullptr, nullptr); | |
59 ASSERT_TRUE(result.ok()); | |
60 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport()); | |
61 EXPECT_EQ(nullptr, result.value()->GetRtcpPacketTransport()); | |
62 result.MoveValue().reset(); | |
63 // With non-muxed RTCP. | |
64 rtcp_parameters.mux = false; | |
65 result = | |
66 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr); | |
67 ASSERT_TRUE(result.ok()); | |
68 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport()); | |
69 EXPECT_EQ(&rtcp, result.value()->GetRtcpPacketTransport()); | |
70 } | |
71 | |
72 // If an RtpTransport starts out un-muxed and then starts muxing, the RTCP | |
73 // packet transport should be forgotten and GetRtcpPacketTransport should | |
74 // return null. | |
75 TEST_F(RtpTransportTest, EnablingRtcpMuxingUnsetsRtcpTransport) { | |
76 rtc::FakePacketTransport rtp("rtp"); | |
77 rtc::FakePacketTransport rtcp("rtcp"); | |
78 | |
79 // Create non-muxed. | |
80 RtcpParameters rtcp_parameters; | |
81 rtcp_parameters.mux = false; | |
82 auto result = | |
83 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr); | |
84 ASSERT_TRUE(result.ok()); | |
85 auto rtp_transport = result.MoveValue(); | |
86 | |
87 // Enable muxing. | |
88 rtcp_parameters.mux = true; | |
89 EXPECT_TRUE(rtp_transport->SetRtcpParameters(rtcp_parameters).ok()); | |
90 EXPECT_EQ(nullptr, rtp_transport->GetRtcpPacketTransport()); | |
91 } | |
92 | |
93 TEST_F(RtpTransportTest, GetAndSetRtcpParameters) { | |
94 rtc::FakePacketTransport rtp("rtp"); | |
95 rtc::FakePacketTransport rtcp("rtcp"); | |
96 // Start with non-muxed RTCP. | |
97 RtcpParameters rtcp_parameters; | |
98 rtcp_parameters.mux = false; | |
99 rtcp_parameters.cname = "teST"; | |
100 rtcp_parameters.reduced_size = false; | |
101 auto result = | |
102 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr); | |
103 ASSERT_TRUE(result.ok()); | |
104 auto transport = result.MoveValue(); | |
105 EXPECT_EQ(rtcp_parameters, transport->GetRtcpParameters()); | |
106 | |
107 // Changing the CNAME is currently unsupported. | |
108 rtcp_parameters.cname = "different"; | |
109 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
110 transport->SetRtcpParameters(rtcp_parameters).type()); | |
111 rtcp_parameters.cname = "teST"; | |
112 | |
113 // Enable RTCP muxing and reduced-size RTCP. | |
114 rtcp_parameters.mux = true; | |
115 rtcp_parameters.reduced_size = true; | |
116 EXPECT_TRUE(transport->SetRtcpParameters(rtcp_parameters).ok()); | |
117 EXPECT_EQ(rtcp_parameters, transport->GetRtcpParameters()); | |
118 | |
119 // Empty CNAME should result in the existing CNAME being used. | |
120 rtcp_parameters.cname.clear(); | |
121 EXPECT_TRUE(transport->SetRtcpParameters(rtcp_parameters).ok()); | |
122 EXPECT_EQ("teST", transport->GetRtcpParameters().cname); | |
123 | |
124 // Disabling RTCP muxing after enabling shouldn't be allowed, since enabling | |
125 // muxing should have made the RTP transport forget about the RTCP packet | |
126 // transport initially passed into it. | |
127 rtcp_parameters.mux = false; | |
128 EXPECT_EQ(RTCErrorType::INVALID_STATE, | |
129 transport->SetRtcpParameters(rtcp_parameters).type()); | |
130 } | |
131 | |
132 // When Send or Receive is called on a sender or receiver, the RTCP parameters | |
133 // from the RtpTransport underneath the sender should be applied to the created | |
134 // media stream. The only relevant parameters (currently) are |cname| and | |
135 // |reduced_size|. | |
136 TEST_F(RtpTransportTest, SendAndReceiveApplyRtcpParametersToMediaEngine) { | |
137 // First, create video transport with reduced-size RTCP. | |
138 rtc::FakePacketTransport fake_packet_transport1("1"); | |
139 RtcpParameters rtcp_parameters; | |
140 rtcp_parameters.mux = true; | |
141 rtcp_parameters.reduced_size = true; | |
142 rtcp_parameters.cname = "foo"; | |
143 auto rtp_transport_result = ortc_factory_->CreateRtpTransport( | |
144 rtcp_parameters, &fake_packet_transport1, nullptr, nullptr); | |
145 auto video_transport = rtp_transport_result.MoveValue(); | |
146 | |
147 // Create video sender and call Send, expecting parameters to be applied. | |
148 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, | |
149 video_transport.get()); | |
150 auto video_sender = sender_result.MoveValue(); | |
151 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok()); | |
152 cricket::FakeVideoMediaChannel* fake_video_channel = | |
153 fake_media_engine_->GetVideoChannel(0); | |
154 ASSERT_NE(nullptr, fake_video_channel); | |
155 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size); | |
156 ASSERT_EQ(1u, fake_video_channel->send_streams().size()); | |
157 const cricket::StreamParams& video_send_stream = | |
158 fake_video_channel->send_streams()[0]; | |
159 EXPECT_EQ("foo", video_send_stream.cname); | |
160 | |
161 // Create video receiver and call Receive, expecting parameters to be applied | |
162 // (minus |cname|, since that's the sent cname, not received). | |
163 auto receiver_result = ortc_factory_->CreateRtpReceiver( | |
164 cricket::MEDIA_TYPE_VIDEO, video_transport.get()); | |
165 auto video_receiver = receiver_result.MoveValue(); | |
166 EXPECT_TRUE( | |
167 video_receiver->Receive(MakeMinimalVp8ParametersWithSsrc(0xdeadbeef)) | |
168 .ok()); | |
169 EXPECT_TRUE(fake_video_channel->recv_rtcp_parameters().reduced_size); | |
170 | |
171 // Create audio transport with non-reduced size RTCP. | |
172 rtc::FakePacketTransport fake_packet_transport2("2"); | |
173 rtcp_parameters.reduced_size = false; | |
174 rtcp_parameters.cname = "bar"; | |
175 rtp_transport_result = ortc_factory_->CreateRtpTransport( | |
176 rtcp_parameters, &fake_packet_transport2, nullptr, nullptr); | |
177 auto audio_transport = rtp_transport_result.MoveValue(); | |
178 | |
179 // Create audio sender and call Send, expecting parameters to be applied. | |
180 sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, | |
181 audio_transport.get()); | |
182 auto audio_sender = sender_result.MoveValue(); | |
183 EXPECT_TRUE(audio_sender->Send(MakeMinimalIsacParameters()).ok()); | |
184 | |
185 cricket::FakeVoiceMediaChannel* fake_voice_channel = | |
186 fake_media_engine_->GetVoiceChannel(0); | |
187 ASSERT_NE(nullptr, fake_voice_channel); | |
188 EXPECT_FALSE(fake_voice_channel->send_rtcp_parameters().reduced_size); | |
189 ASSERT_EQ(1u, fake_voice_channel->send_streams().size()); | |
190 const cricket::StreamParams& audio_send_stream = | |
191 fake_voice_channel->send_streams()[0]; | |
192 EXPECT_EQ("bar", audio_send_stream.cname); | |
193 | |
194 // Create audio receiver and call Receive, expecting parameters to be applied | |
195 // (minus |cname|, since that's the sent cname, not received). | |
196 receiver_result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO, | |
197 audio_transport.get()); | |
198 auto audio_receiver = receiver_result.MoveValue(); | |
199 EXPECT_TRUE( | |
200 audio_receiver->Receive(MakeMinimalOpusParametersWithSsrc(0xbaadf00d)) | |
201 .ok()); | |
202 EXPECT_FALSE(fake_voice_channel->recv_rtcp_parameters().reduced_size); | |
203 } | |
204 | |
205 // When SetRtcpParameters is called, the modified parameters should be applied | |
206 // to the media engine. | |
207 // TODO(deadbeef): Once the implementation supports changing the CNAME, | |
208 // test that here. | |
209 TEST_F(RtpTransportTest, SetRtcpParametersAppliesParametersToMediaEngine) { | |
210 rtc::FakePacketTransport fake_packet_transport("fake"); | |
211 RtcpParameters rtcp_parameters; | |
212 rtcp_parameters.mux = true; | |
213 rtcp_parameters.reduced_size = false; | |
214 auto rtp_transport_result = ortc_factory_->CreateRtpTransport( | |
215 rtcp_parameters, &fake_packet_transport, nullptr, nullptr); | |
216 auto rtp_transport = rtp_transport_result.MoveValue(); | |
217 | |
218 // Create video sender and call Send, applying an initial set of parameters. | |
219 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, | |
220 rtp_transport.get()); | |
221 auto sender = sender_result.MoveValue(); | |
222 EXPECT_TRUE(sender->Send(MakeMinimalVp8Parameters()).ok()); | |
223 | |
224 // Modify parameters and expect them to be changed at the media engine level. | |
225 rtcp_parameters.reduced_size = true; | |
226 EXPECT_TRUE(rtp_transport->SetRtcpParameters(rtcp_parameters).ok()); | |
227 | |
228 cricket::FakeVideoMediaChannel* fake_video_channel = | |
229 fake_media_engine_->GetVideoChannel(0); | |
230 ASSERT_NE(nullptr, fake_video_channel); | |
231 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size); | |
232 } | |
233 | |
234 } // namespace webrtc | |
OLD | NEW |