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

Side by Side Diff: webrtc/ortc/ortcfactory_integrationtest.cc

Issue 2714813004: Create the SrtpTransportInterface. (Closed)
Patch Set: 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
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698