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 #include <utility> // For std::pair, std::move. | |
13 | |
14 #include "webrtc/api/ortc/ortcfactoryinterface.h" | |
15 #include "webrtc/base/criticalsection.h" | |
16 #include "webrtc/base/fakenetwork.h" | |
17 #include "webrtc/base/gunit.h" | |
18 #include "webrtc/base/physicalsocketserver.h" | |
19 #include "webrtc/base/virtualsocketserver.h" | |
20 #include "webrtc/ortc/testrtpparameters.h" | |
21 #include "webrtc/p2p/base/udptransport.h" | |
22 #include "webrtc/pc/test/fakeaudiocapturemodule.h" | |
23 #include "webrtc/pc/test/fakeperiodicvideocapturer.h" | |
24 #include "webrtc/pc/test/fakevideotrackrenderer.h" | |
25 | |
26 namespace { | |
27 | |
28 const int kDefaultTimeout = 10000; // 10 seconds. | |
29 // Default number of audio/video frames to wait for before considering a test a | |
30 // success. | |
31 const int kDefaultNumFrames = 3; | |
32 const rtc::IPAddress kIPv4LocalHostAddress = | |
33 rtc::IPAddress(0x7F000001); // 127.0.0.1 | |
34 | |
35 static const char kTestKeyParams1[] = | |
36 "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz"; | |
37 static const cricket::CryptoParams kTestCryptoParams1(1, | |
38 "AES_CM_128_HMAC_SHA1_80", | |
39 kTestKeyParams1, | |
40 ""); | |
41 | |
42 } // namespace | |
43 | |
44 namespace webrtc { | |
45 | |
46 // Used to test that things work end-to-end when using the default | |
47 // implementations of threads/etc. provided by OrtcFactory, with the exception | |
48 // of using a virtual network. | |
49 // | |
50 // By default, the virtual network manager doesn't enumerate any networks, but | |
51 // sockets can still be created in this state. | |
52 class OrtcFactoryIntegrationTest : public testing::Test { | |
53 public: | |
54 OrtcFactoryIntegrationTest() | |
55 : virtual_socket_server_(&physical_socket_server_), | |
56 network_thread_(&virtual_socket_server_), | |
57 fake_audio_capture_module1_(FakeAudioCaptureModule::Create()), | |
58 fake_audio_capture_module2_(FakeAudioCaptureModule::Create()) { | |
59 // Sockets are bound to the ANY address, so this is needed to tell the | |
60 // virtual network which address to use in this case. | |
61 virtual_socket_server_.SetDefaultRoute(kIPv4LocalHostAddress); | |
62 network_thread_.Start(); | |
63 // Need to create after network thread is started. | |
64 ortc_factory1_ = OrtcFactoryInterface::Create( | |
65 &network_thread_, nullptr, &fake_network_manager_, | |
66 nullptr, fake_audio_capture_module1_) | |
67 .MoveValue(); | |
68 ortc_factory2_ = OrtcFactoryInterface::Create( | |
69 &network_thread_, nullptr, &fake_network_manager_, | |
70 nullptr, fake_audio_capture_module2_) | |
71 .MoveValue(); | |
72 } | |
73 | |
74 protected: | |
75 typedef std::pair<std::unique_ptr<UdpTransportInterface>, | |
76 std::unique_ptr<UdpTransportInterface>> | |
77 UdpTransportPair; | |
78 typedef std::pair<std::unique_ptr<RtpTransportInterface>, | |
79 std::unique_ptr<RtpTransportInterface>> | |
80 RtpTransportPair; | |
81 typedef std::pair<std::unique_ptr<SrtpTransportInterface>, | |
82 std::unique_ptr<SrtpTransportInterface>> | |
83 SrtpTransportPair; | |
84 typedef std::pair<std::unique_ptr<RtpTransportControllerInterface>, | |
85 std::unique_ptr<RtpTransportControllerInterface>> | |
86 RtpTransportControllerPair; | |
87 | |
88 // Helper function that creates one UDP transport each for |ortc_factory1_| | |
89 // and |ortc_factory2_|, and connects them. | |
90 UdpTransportPair CreateAndConnectUdpTransportPair() { | |
91 auto transport1 = ortc_factory1_->CreateUdpTransport(AF_INET).MoveValue(); | |
92 auto transport2 = ortc_factory2_->CreateUdpTransport(AF_INET).MoveValue(); | |
93 transport1->SetRemoteAddress( | |
94 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET), | |
95 transport2->GetLocalAddress().port())); | |
96 transport2->SetRemoteAddress( | |
97 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET), | |
98 transport1->GetLocalAddress().port())); | |
99 return {std::move(transport1), std::move(transport2)}; | |
100 } | |
101 | |
102 // Creates one transport controller each for |ortc_factory1_| and | |
103 // |ortc_factory2_|. | |
104 RtpTransportControllerPair CreateRtpTransportControllerPair() { | |
105 return {ortc_factory1_->CreateRtpTransportController().MoveValue(), | |
106 ortc_factory2_->CreateRtpTransportController().MoveValue()}; | |
107 } | |
108 | |
109 // Helper function that creates a pair of RtpTransports between | |
110 // |ortc_factory1_| and |ortc_factory2_|. Expected to be called with the | |
111 // result of CreateAndConnectUdpTransportPair. |rtcp_udp_transports| can be | |
112 // empty if RTCP muxing is used. |transport_controllers| can be empty if | |
113 // these transports are being created using a default transport controller. | |
114 RtpTransportPair CreateRtpTransportPair( | |
115 const RtcpParameters& rtcp_parameters, | |
116 const UdpTransportPair& rtp_udp_transports, | |
117 const UdpTransportPair& rtcp_udp_transports, | |
118 const RtpTransportControllerPair& transport_controllers) { | |
119 auto transport_result1 = ortc_factory1_->CreateRtpTransport( | |
120 rtcp_parameters, rtp_udp_transports.first.get(), | |
121 rtcp_udp_transports.first.get(), transport_controllers.first.get()); | |
122 auto transport_result2 = ortc_factory2_->CreateRtpTransport( | |
123 rtcp_parameters, rtp_udp_transports.second.get(), | |
124 rtcp_udp_transports.second.get(), transport_controllers.second.get()); | |
125 return {transport_result1.MoveValue(), transport_result2.MoveValue()}; | |
126 } | |
127 | |
128 SrtpTransportPair CreateSrtpTransportPair( | |
129 const RtcpParameters& rtcp_parameters, | |
130 const UdpTransportPair& rtp_udp_transports, | |
131 const UdpTransportPair& rtcp_udp_transports, | |
132 const RtpTransportControllerPair& transport_controllers) { | |
133 auto transport_result1 = ortc_factory1_->CreateSrtpTransport( | |
134 rtcp_parameters, rtp_udp_transports.first.get(), | |
135 rtcp_udp_transports.first.get(), transport_controllers.first.get()); | |
136 auto transport_result2 = ortc_factory2_->CreateSrtpTransport( | |
137 rtcp_parameters, rtp_udp_transports.second.get(), | |
138 rtcp_udp_transports.second.get(), transport_controllers.second.get()); | |
139 return {transport_result1.MoveValue(), transport_result2.MoveValue()}; | |
140 } | |
141 | |
142 // For convenience when |rtcp_udp_transports| and |transport_controllers| | |
143 // aren't needed. | |
144 RtpTransportPair CreateRtpTransportPair( | |
145 const RtcpParameters& rtcp_parameters, | |
146 const UdpTransportPair& rtp_udp_transports) { | |
147 return CreateRtpTransportPair(rtcp_parameters, rtp_udp_transports, | |
148 UdpTransportPair(), | |
149 RtpTransportControllerPair()); | |
150 } | |
151 | |
152 SrtpTransportPair CreateSrtpTransportPair( | |
153 const RtcpParameters& rtcp_parameters, | |
154 const UdpTransportPair& rtp_udp_transports) { | |
155 return CreateSrtpTransportPair(rtcp_parameters, rtp_udp_transports, | |
156 UdpTransportPair(), | |
157 RtpTransportControllerPair()); | |
158 } | |
159 | |
160 // Ends up using fake audio capture module, which was passed into OrtcFactory | |
161 // on creation. | |
162 rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack( | |
163 const std::string& id, | |
164 OrtcFactoryInterface* ortc_factory) { | |
165 // Disable echo cancellation to make test more efficient. | |
166 cricket::AudioOptions options; | |
167 options.echo_cancellation.emplace(true); | |
168 rtc::scoped_refptr<webrtc::AudioSourceInterface> source = | |
169 ortc_factory->CreateAudioSource(options); | |
170 return ortc_factory->CreateAudioTrack(id, source); | |
171 } | |
172 | |
173 // Stores created capturer in |fake_video_capturers_|. | |
174 rtc::scoped_refptr<webrtc::VideoTrackInterface> | |
175 CreateLocalVideoTrackAndFakeCapturer(const std::string& id, | |
176 OrtcFactoryInterface* ortc_factory) { | |
177 cricket::FakeVideoCapturer* fake_capturer = | |
178 new webrtc::FakePeriodicVideoCapturer(); | |
179 fake_video_capturers_.push_back(fake_capturer); | |
180 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source = | |
181 ortc_factory->CreateVideoSource( | |
182 std::unique_ptr<cricket::VideoCapturer>(fake_capturer)); | |
183 return rtc::scoped_refptr<webrtc::VideoTrackInterface>( | |
184 ortc_factory->CreateVideoTrack(id, source)); | |
185 } | |
186 | |
187 rtc::PhysicalSocketServer physical_socket_server_; | |
188 rtc::VirtualSocketServer virtual_socket_server_; | |
189 rtc::Thread network_thread_; | |
190 rtc::FakeNetworkManager fake_network_manager_; | |
191 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module1_; | |
192 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module2_; | |
193 std::unique_ptr<OrtcFactoryInterface> ortc_factory1_; | |
194 std::unique_ptr<OrtcFactoryInterface> ortc_factory2_; | |
195 // Actually owned by video tracks. | |
196 std::vector<cricket::FakeVideoCapturer*> fake_video_capturers_; | |
197 }; | |
198 | |
199 // Very basic end-to-end test with a single pair of audio RTP sender and | |
200 // receiver. | |
201 // | |
202 // Uses muxed RTCP, and minimal parameters with a hard-coded config that's | |
203 // known to work. | |
204 TEST_F(OrtcFactoryIntegrationTest, BasicOneWayAudioRtpSenderAndReceiver) { | |
205 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
206 auto rtp_transports = | |
207 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
208 | |
209 auto sender_result = ortc_factory1_->CreateRtpSender( | |
210 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get()); | |
211 auto receiver_result = ortc_factory2_->CreateRtpReceiver( | |
212 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get()); | |
213 ASSERT_TRUE(sender_result.ok()); | |
214 ASSERT_TRUE(receiver_result.ok()); | |
215 auto sender = sender_result.MoveValue(); | |
216 auto receiver = receiver_result.MoveValue(); | |
217 | |
218 RTCError error = | |
219 sender->SetTrack(CreateLocalAudioTrack("audio", ortc_factory1_.get())); | |
220 EXPECT_TRUE(error.ok()); | |
221 | |
222 RtpParameters opus_parameters = MakeMinimalOpusParameters(); | |
223 EXPECT_TRUE(receiver->Receive(opus_parameters).ok()); | |
224 EXPECT_TRUE(sender->Send(opus_parameters).ok()); | |
225 // Sender and receiver are connected and configured; audio frames should be | |
226 // able to flow at this point. | |
227 EXPECT_TRUE_WAIT( | |
228 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames, | |
229 kDefaultTimeout); | |
230 } | |
231 | |
232 // Very basic end-to-end test with a single pair of video RTP sender and | |
233 // receiver. | |
234 // | |
235 // Uses muxed RTCP, and minimal parameters with a hard-coded config that's | |
236 // known to work. | |
237 TEST_F(OrtcFactoryIntegrationTest, BasicOneWayVideoRtpSenderAndReceiver) { | |
238 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
239 auto rtp_transports = | |
240 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
241 | |
242 auto sender_result = ortc_factory1_->CreateRtpSender( | |
243 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get()); | |
244 auto receiver_result = ortc_factory2_->CreateRtpReceiver( | |
245 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get()); | |
246 ASSERT_TRUE(sender_result.ok()); | |
247 ASSERT_TRUE(receiver_result.ok()); | |
248 auto sender = sender_result.MoveValue(); | |
249 auto receiver = receiver_result.MoveValue(); | |
250 | |
251 RTCError error = sender->SetTrack( | |
252 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get())); | |
253 EXPECT_TRUE(error.ok()); | |
254 | |
255 RtpParameters vp8_parameters = MakeMinimalVp8Parameters(); | |
256 EXPECT_TRUE(receiver->Receive(vp8_parameters).ok()); | |
257 EXPECT_TRUE(sender->Send(vp8_parameters).ok()); | |
258 FakeVideoTrackRenderer fake_renderer( | |
259 static_cast<VideoTrackInterface*>(receiver->GetTrack().get())); | |
260 // Sender and receiver are connected and configured; video frames should be | |
261 // able to flow at this point. | |
262 EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames, | |
263 kDefaultTimeout); | |
264 } | |
265 | |
266 // Basic end-to-end test with a single pair of audio RTP sender and receiver | |
267 // using SRTP. | |
268 TEST_F(OrtcFactoryIntegrationTest, OneWayAudioRtpSenderAndReceiverWithSrtp) { | |
Taylor Brandstetter
2017/02/24 18:57:57
Since these are high level tests, I'd suggest maki
Zhi Huang
2017/02/27 05:16:00
Done.
| |
269 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
270 auto srtp_transports = | |
271 CreateSrtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
272 | |
273 auto sender_result = ortc_factory1_->CreateRtpSender( | |
274 cricket::MEDIA_TYPE_AUDIO, srtp_transports.first.get()); | |
275 auto receiver_result = ortc_factory2_->CreateRtpReceiver( | |
276 cricket::MEDIA_TYPE_AUDIO, srtp_transports.second.get()); | |
277 ASSERT_TRUE(sender_result.ok()); | |
278 ASSERT_TRUE(receiver_result.ok()); | |
279 auto sender = sender_result.MoveValue(); | |
280 auto receiver = receiver_result.MoveValue(); | |
281 | |
282 RTCError error = | |
283 sender->SetTrack(CreateLocalAudioTrack("audio", ortc_factory1_.get())); | |
284 EXPECT_TRUE(error.ok()); | |
285 | |
286 RtpParameters opus_parameters = MakeMinimalOpusParameters(); | |
287 // Fail to send and receive the parameters before setting the keys. | |
288 EXPECT_FALSE(receiver->Receive(opus_parameters).ok()); | |
289 EXPECT_FALSE(sender->Send(opus_parameters).ok()); | |
290 | |
291 EXPECT_TRUE((srtp_transports.first->SetSrtpSendKey(kTestCryptoParams1)).ok()); | |
Taylor Brandstetter
2017/02/24 18:57:58
Since the individual tests don't care about what k
Zhi Huang
2017/02/27 05:16:00
Done.
| |
292 EXPECT_TRUE( | |
293 (srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams1)).ok()); | |
Taylor Brandstetter
2017/02/24 18:57:58
Should set different send and receive keys
Zhi Huang
2017/02/27 05:16:00
Done.
| |
294 EXPECT_TRUE( | |
295 (srtp_transports.second->SetSrtpSendKey(kTestCryptoParams1)).ok()); | |
296 EXPECT_TRUE( | |
297 (srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams1)).ok()); | |
298 | |
299 EXPECT_TRUE(receiver->Receive(opus_parameters).ok()); | |
300 EXPECT_TRUE(sender->Send(opus_parameters).ok()); | |
301 // Sender and receiver are connected and configured; audio frames should be | |
302 // able to flow at this point. | |
303 EXPECT_TRUE_WAIT( | |
304 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames, | |
305 kDefaultTimeout); | |
306 } | |
307 | |
308 // Basic end-to-end test with a single pair of video RTP sender and receiver | |
309 // using SRTP. | |
310 TEST_F(OrtcFactoryIntegrationTest, OneWayVideoRtpSenderAndReceiverWithSrtp) { | |
311 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
312 auto srtp_transports = | |
313 CreateSrtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
314 | |
315 auto sender_result = ortc_factory1_->CreateRtpSender( | |
316 cricket::MEDIA_TYPE_VIDEO, srtp_transports.first.get()); | |
317 auto receiver_result = ortc_factory2_->CreateRtpReceiver( | |
318 cricket::MEDIA_TYPE_VIDEO, srtp_transports.second.get()); | |
319 ASSERT_TRUE(sender_result.ok()); | |
320 ASSERT_TRUE(receiver_result.ok()); | |
321 auto sender = sender_result.MoveValue(); | |
322 auto receiver = receiver_result.MoveValue(); | |
323 | |
324 RTCError error = sender->SetTrack( | |
325 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get())); | |
326 EXPECT_TRUE(error.ok()); | |
327 | |
328 RtpParameters vp8_parameters = MakeMinimalVp8Parameters(); | |
329 // Fail to send and receive the parameters before setting the keys. | |
330 EXPECT_FALSE(receiver->Receive(vp8_parameters).ok()); | |
331 EXPECT_FALSE(sender->Send(vp8_parameters).ok()); | |
332 | |
333 EXPECT_TRUE((srtp_transports.first->SetSrtpSendKey(kTestCryptoParams1)).ok()); | |
334 EXPECT_TRUE( | |
335 (srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams1)).ok()); | |
336 EXPECT_TRUE( | |
337 (srtp_transports.second->SetSrtpSendKey(kTestCryptoParams1)).ok()); | |
338 EXPECT_TRUE( | |
339 (srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams1)).ok()); | |
340 | |
341 EXPECT_TRUE(receiver->Receive(vp8_parameters).ok()); | |
342 EXPECT_TRUE(sender->Send(vp8_parameters).ok()); | |
343 FakeVideoTrackRenderer fake_renderer( | |
344 static_cast<VideoTrackInterface*>(receiver->GetTrack().get())); | |
345 // Sender and receiver are connected and configured; video frames should be | |
346 // able to flow at this point. | |
347 EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames, | |
348 kDefaultTimeout); | |
349 } | |
350 | |
351 // Test that if the track is changed while sending, the sender seamlessly | |
352 // transitions to sending it and frames are received end-to-end. | |
353 // | |
354 // Only doing this for video, since given that audio is sourced from a single | |
355 // fake audio capture module, the audio track is just a dummy object. | |
356 // TODO(deadbeef): Change this when possible. | |
357 TEST_F(OrtcFactoryIntegrationTest, SetTrackWhileSending) { | |
358 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
359 auto rtp_transports = | |
360 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
361 | |
362 auto sender_result = ortc_factory1_->CreateRtpSender( | |
363 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get()); | |
364 auto receiver_result = ortc_factory2_->CreateRtpReceiver( | |
365 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get()); | |
366 ASSERT_TRUE(sender_result.ok()); | |
367 ASSERT_TRUE(receiver_result.ok()); | |
368 auto sender = sender_result.MoveValue(); | |
369 auto receiver = receiver_result.MoveValue(); | |
370 | |
371 RTCError error = sender->SetTrack( | |
372 CreateLocalVideoTrackAndFakeCapturer("video_1", ortc_factory1_.get())); | |
373 EXPECT_TRUE(error.ok()); | |
374 RtpParameters vp8_parameters = MakeMinimalVp8Parameters(); | |
375 EXPECT_TRUE(receiver->Receive(vp8_parameters).ok()); | |
376 EXPECT_TRUE(sender->Send(vp8_parameters).ok()); | |
377 FakeVideoTrackRenderer fake_renderer( | |
378 static_cast<VideoTrackInterface*>(receiver->GetTrack().get())); | |
379 // Expect for some initial number of frames to be received. | |
380 EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames, | |
381 kDefaultTimeout); | |
382 // Stop the old capturer, set a new track, and verify new frames are received | |
383 // from the new track. Stopping the old capturer ensures that we aren't | |
384 // actually still getting frames from it. | |
385 fake_video_capturers_[0]->Stop(); | |
386 int prev_num_frames = fake_renderer.num_rendered_frames(); | |
387 error = sender->SetTrack( | |
388 CreateLocalVideoTrackAndFakeCapturer("video_2", ortc_factory1_.get())); | |
389 EXPECT_TRUE(error.ok()); | |
390 EXPECT_TRUE_WAIT( | |
391 fake_renderer.num_rendered_frames() > kDefaultNumFrames + prev_num_frames, | |
392 kDefaultTimeout); | |
393 } | |
394 | |
395 // End-to-end test with two pairs of RTP senders and receivers, for audio and | |
396 // video. | |
397 // | |
398 // Uses muxed RTCP, and minimal parameters with hard-coded configs that are | |
399 // known to work. | |
400 TEST_F(OrtcFactoryIntegrationTest, | |
401 BasicTwoWayAudioVideoRtpSendersAndReceivers) { | |
402 auto udp_transports = CreateAndConnectUdpTransportPair(); | |
403 auto rtp_transports = | |
404 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports); | |
405 | |
406 // Create all the senders and receivers (four per endpoint). | |
407 auto audio_sender_result1 = ortc_factory1_->CreateRtpSender( | |
408 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get()); | |
409 auto video_sender_result1 = ortc_factory1_->CreateRtpSender( | |
410 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get()); | |
411 auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver( | |
412 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get()); | |
413 auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver( | |
414 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get()); | |
415 ASSERT_TRUE(audio_sender_result1.ok()); | |
416 ASSERT_TRUE(video_sender_result1.ok()); | |
417 ASSERT_TRUE(audio_receiver_result1.ok()); | |
418 ASSERT_TRUE(video_receiver_result1.ok()); | |
419 auto audio_sender1 = audio_sender_result1.MoveValue(); | |
420 auto video_sender1 = video_sender_result1.MoveValue(); | |
421 auto audio_receiver1 = audio_receiver_result1.MoveValue(); | |
422 auto video_receiver1 = video_receiver_result1.MoveValue(); | |
423 | |
424 auto audio_sender_result2 = ortc_factory2_->CreateRtpSender( | |
425 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get()); | |
426 auto video_sender_result2 = ortc_factory2_->CreateRtpSender( | |
427 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get()); | |
428 auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver( | |
429 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get()); | |
430 auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver( | |
431 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get()); | |
432 ASSERT_TRUE(audio_sender_result2.ok()); | |
433 ASSERT_TRUE(video_sender_result2.ok()); | |
434 ASSERT_TRUE(audio_receiver_result2.ok()); | |
435 ASSERT_TRUE(video_receiver_result2.ok()); | |
436 auto audio_sender2 = audio_sender_result2.MoveValue(); | |
437 auto video_sender2 = video_sender_result2.MoveValue(); | |
438 auto audio_receiver2 = audio_receiver_result2.MoveValue(); | |
439 auto video_receiver2 = video_receiver_result2.MoveValue(); | |
440 | |
441 // Add fake tracks. | |
442 RTCError error = audio_sender1->SetTrack( | |
443 CreateLocalAudioTrack("audio", ortc_factory1_.get())); | |
444 EXPECT_TRUE(error.ok()); | |
445 error = video_sender1->SetTrack( | |
446 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get())); | |
447 EXPECT_TRUE(error.ok()); | |
448 error = audio_sender2->SetTrack( | |
449 CreateLocalAudioTrack("audio", ortc_factory2_.get())); | |
450 EXPECT_TRUE(error.ok()); | |
451 error = video_sender2->SetTrack( | |
452 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get())); | |
453 EXPECT_TRUE(error.ok()); | |
454 | |
455 // "sent_X_parameters1" are the parameters that endpoint 1 sends with and | |
456 // endpoint 2 receives with. | |
457 RtpParameters sent_opus_parameters1 = | |
458 MakeMinimalOpusParametersWithSsrc(0xdeadbeef); | |
459 RtpParameters sent_vp8_parameters1 = | |
460 MakeMinimalVp8ParametersWithSsrc(0xbaadfeed); | |
461 RtpParameters sent_opus_parameters2 = | |
462 MakeMinimalOpusParametersWithSsrc(0x13333337); | |
463 RtpParameters sent_vp8_parameters2 = | |
464 MakeMinimalVp8ParametersWithSsrc(0x12345678); | |
465 | |
466 // Configure the senders' and receivers' parameters. | |
467 EXPECT_TRUE(audio_receiver1->Receive(sent_opus_parameters2).ok()); | |
468 EXPECT_TRUE(video_receiver1->Receive(sent_vp8_parameters2).ok()); | |
469 EXPECT_TRUE(audio_receiver2->Receive(sent_opus_parameters1).ok()); | |
470 EXPECT_TRUE(video_receiver2->Receive(sent_vp8_parameters1).ok()); | |
471 EXPECT_TRUE(audio_sender1->Send(sent_opus_parameters1).ok()); | |
472 EXPECT_TRUE(video_sender1->Send(sent_vp8_parameters1).ok()); | |
473 EXPECT_TRUE(audio_sender2->Send(sent_opus_parameters2).ok()); | |
474 EXPECT_TRUE(video_sender2->Send(sent_vp8_parameters2).ok()); | |
475 | |
476 FakeVideoTrackRenderer fake_video_renderer1( | |
477 static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get())); | |
478 FakeVideoTrackRenderer fake_video_renderer2( | |
479 static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get())); | |
480 | |
481 // Senders and receivers are connected and configured; audio and video frames | |
482 // should be able to flow at this point. | |
483 EXPECT_TRUE_WAIT( | |
484 fake_audio_capture_module1_->frames_received() > kDefaultNumFrames && | |
485 fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames && | |
486 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames && | |
487 fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames, | |
488 kDefaultTimeout); | |
489 } | |
490 | |
491 // End-to-end test with two pairs of RTP senders and receivers, for audio and | |
492 // video. Unlike the test above, this attempts to make the parameters as | |
493 // complex as possible. | |
494 // | |
495 // Uses non-muxed RTCP, with separate audio/video transports, and a full set of | |
496 // parameters, as would normally be used in a PeerConnection. | |
497 // | |
498 // TODO(deadbeef): Update this test as more audio/video features become | |
499 // supported. | |
500 TEST_F(OrtcFactoryIntegrationTest, FullTwoWayAudioVideoRtpSendersAndReceivers) { | |
501 // We want four pairs of UDP transports for this test, for audio/video and | |
502 // RTP/RTCP. | |
503 auto audio_rtp_udp_transports = CreateAndConnectUdpTransportPair(); | |
504 auto audio_rtcp_udp_transports = CreateAndConnectUdpTransportPair(); | |
505 auto video_rtp_udp_transports = CreateAndConnectUdpTransportPair(); | |
506 auto video_rtcp_udp_transports = CreateAndConnectUdpTransportPair(); | |
507 | |
508 // Since we have multiple RTP transports on each side, we need an RTP | |
509 // transport controller. | |
510 auto transport_controllers = CreateRtpTransportControllerPair(); | |
511 | |
512 RtcpParameters audio_rtcp_parameters; | |
513 audio_rtcp_parameters.mux = false; | |
514 auto audio_rtp_transports = | |
515 CreateRtpTransportPair(audio_rtcp_parameters, audio_rtp_udp_transports, | |
516 audio_rtcp_udp_transports, transport_controllers); | |
517 | |
518 RtcpParameters video_rtcp_parameters; | |
519 video_rtcp_parameters.mux = false; | |
520 video_rtcp_parameters.reduced_size = true; | |
521 auto video_rtp_transports = | |
522 CreateRtpTransportPair(video_rtcp_parameters, video_rtp_udp_transports, | |
523 video_rtcp_udp_transports, transport_controllers); | |
524 | |
525 // Create all the senders and receivers (four per endpoint). | |
526 auto audio_sender_result1 = ortc_factory1_->CreateRtpSender( | |
527 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.first.get()); | |
528 auto video_sender_result1 = ortc_factory1_->CreateRtpSender( | |
529 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.first.get()); | |
530 auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver( | |
531 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.first.get()); | |
532 auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver( | |
533 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.first.get()); | |
534 ASSERT_TRUE(audio_sender_result1.ok()); | |
535 ASSERT_TRUE(video_sender_result1.ok()); | |
536 ASSERT_TRUE(audio_receiver_result1.ok()); | |
537 ASSERT_TRUE(video_receiver_result1.ok()); | |
538 auto audio_sender1 = audio_sender_result1.MoveValue(); | |
539 auto video_sender1 = video_sender_result1.MoveValue(); | |
540 auto audio_receiver1 = audio_receiver_result1.MoveValue(); | |
541 auto video_receiver1 = video_receiver_result1.MoveValue(); | |
542 | |
543 auto audio_sender_result2 = ortc_factory2_->CreateRtpSender( | |
544 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.second.get()); | |
545 auto video_sender_result2 = ortc_factory2_->CreateRtpSender( | |
546 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.second.get()); | |
547 auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver( | |
548 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.second.get()); | |
549 auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver( | |
550 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.second.get()); | |
551 ASSERT_TRUE(audio_sender_result2.ok()); | |
552 ASSERT_TRUE(video_sender_result2.ok()); | |
553 ASSERT_TRUE(audio_receiver_result2.ok()); | |
554 ASSERT_TRUE(video_receiver_result2.ok()); | |
555 auto audio_sender2 = audio_sender_result2.MoveValue(); | |
556 auto video_sender2 = video_sender_result2.MoveValue(); | |
557 auto audio_receiver2 = audio_receiver_result2.MoveValue(); | |
558 auto video_receiver2 = video_receiver_result2.MoveValue(); | |
559 | |
560 RTCError error = audio_sender1->SetTrack( | |
561 CreateLocalAudioTrack("audio", ortc_factory1_.get())); | |
562 EXPECT_TRUE(error.ok()); | |
563 error = video_sender1->SetTrack( | |
564 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get())); | |
565 EXPECT_TRUE(error.ok()); | |
566 error = audio_sender2->SetTrack( | |
567 CreateLocalAudioTrack("audio", ortc_factory2_.get())); | |
568 EXPECT_TRUE(error.ok()); | |
569 error = video_sender2->SetTrack( | |
570 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get())); | |
571 EXPECT_TRUE(error.ok()); | |
572 | |
573 // Use different codecs in different directions for extra challenge. | |
574 RtpParameters opus_send_parameters = MakeFullOpusParameters(); | |
575 RtpParameters isac_send_parameters = MakeFullIsacParameters(); | |
576 RtpParameters vp8_send_parameters = MakeFullVp8Parameters(); | |
577 RtpParameters vp9_send_parameters = MakeFullVp9Parameters(); | |
578 | |
579 // Remove "payload_type" from receive parameters. Receiver will need to | |
580 // discern the payload type from packets received. | |
581 RtpParameters opus_receive_parameters = opus_send_parameters; | |
582 RtpParameters isac_receive_parameters = isac_send_parameters; | |
583 RtpParameters vp8_receive_parameters = vp8_send_parameters; | |
584 RtpParameters vp9_receive_parameters = vp9_send_parameters; | |
585 opus_receive_parameters.encodings[0].codec_payload_type.reset(); | |
586 isac_receive_parameters.encodings[0].codec_payload_type.reset(); | |
587 vp8_receive_parameters.encodings[0].codec_payload_type.reset(); | |
588 vp9_receive_parameters.encodings[0].codec_payload_type.reset(); | |
589 | |
590 // Configure the senders' and receivers' parameters. | |
591 // | |
592 // Note: Intentionally, the top codec in the receive parameters does not | |
593 // match the codec sent by the other side. If "Receive" is called with a list | |
594 // of codecs, the receiver should be prepared to receive any of them, not | |
595 // just the one on top. | |
596 EXPECT_TRUE(audio_receiver1->Receive(opus_receive_parameters).ok()); | |
597 EXPECT_TRUE(video_receiver1->Receive(vp8_receive_parameters).ok()); | |
598 EXPECT_TRUE(audio_receiver2->Receive(isac_receive_parameters).ok()); | |
599 EXPECT_TRUE(video_receiver2->Receive(vp9_receive_parameters).ok()); | |
600 EXPECT_TRUE(audio_sender1->Send(opus_send_parameters).ok()); | |
601 EXPECT_TRUE(video_sender1->Send(vp8_send_parameters).ok()); | |
602 EXPECT_TRUE(audio_sender2->Send(isac_send_parameters).ok()); | |
603 EXPECT_TRUE(video_sender2->Send(vp9_send_parameters).ok()); | |
604 | |
605 FakeVideoTrackRenderer fake_video_renderer1( | |
606 static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get())); | |
607 FakeVideoTrackRenderer fake_video_renderer2( | |
608 static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get())); | |
609 | |
610 // Senders and receivers are connected and configured; audio and video frames | |
611 // should be able to flow at this point. | |
612 EXPECT_TRUE_WAIT( | |
613 fake_audio_capture_module1_->frames_received() > kDefaultNumFrames && | |
614 fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames && | |
615 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames && | |
616 fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames, | |
617 kDefaultTimeout); | |
618 } | |
619 | |
Taylor Brandstetter
2017/02/24 18:57:57
Some other end-to-end SRTP tests that would be nic
Zhi Huang
2017/02/27 05:16:00
I'm not sure about the expected behavior when on s
Taylor Brandstetter
2017/02/27 21:48:51
I'd expect the RTP side would try to process the f
| |
620 // TODO(deadbeef): End-to-end test for multiple senders/receivers of the same | |
621 // media type, once that's supported. Currently, it is not because the | |
622 // BaseChannel model relies on there being a single VoiceChannel and | |
623 // VideoChannel, and these only support a single set of codecs/etc. per | |
624 // send/receive direction. | |
625 | |
626 // TODO(deadbeef): End-to-end test for simulcast, once that's supported by this | |
627 // API. | |
628 | |
629 } // namespace webrtc | |
OLD | NEW |