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 // RtpTransportController at only an API level. Any end-to-end test should go | |
26 // in ortcfactory_integrationtest.cc instead. | |
27 // | |
28 // Currently, this test mainly focuses on the limitations of the "adapter" | |
29 // RtpTransportController implementation. Only one of each type of | |
30 // sender/receiver can be created, and the sender/receiver of the same media | |
31 // type must use the same transport. | |
32 class RtpTransportControllerTest : public testing::Test { | |
33 public: | |
34 RtpTransportControllerTest() | |
35 : virtual_socket_server_(&physical_socket_server_), | |
pthatcher1
2017/02/21 20:34:54
Why do you need a virtual socket server when you'r
Taylor Brandstetter
2017/02/22 01:41:59
Copy pasted from the wrong test probably. Fixed.
| |
36 socket_server_scope_(&virtual_socket_server_) { | |
37 ortc_factory_ = OrtcFactory::Create( | |
38 nullptr, nullptr, &fake_network_manager_, nullptr, | |
39 nullptr, std::unique_ptr<cricket::MediaEngineInterface>( | |
40 new cricket::FakeMediaEngine())) | |
41 .MoveValue(); | |
42 rtp_transport_controller_ = | |
43 ortc_factory_->CreateRtpTransportController().MoveValue(); | |
44 } | |
45 | |
46 protected: | |
47 rtc::PhysicalSocketServer physical_socket_server_; | |
48 rtc::VirtualSocketServer virtual_socket_server_; | |
49 rtc::SocketServerScope socket_server_scope_; | |
50 rtc::FakeNetworkManager fake_network_manager_; | |
51 std::unique_ptr<OrtcFactoryInterface> ortc_factory_; | |
52 std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_; | |
53 }; | |
54 | |
55 TEST_F(RtpTransportControllerTest, GetTransports) { | |
56 rtc::FakePacketTransport packet_transport1("one"); | |
57 rtc::FakePacketTransport packet_transport2("two"); | |
58 | |
59 auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport( | |
60 MakeRtcpMuxParameters(), &packet_transport1, nullptr, | |
61 rtp_transport_controller_.get()); | |
62 ASSERT_TRUE(rtp_transport_result1.ok()); | |
63 | |
64 auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport( | |
65 MakeRtcpMuxParameters(), &packet_transport2, nullptr, | |
66 rtp_transport_controller_.get()); | |
67 ASSERT_TRUE(rtp_transport_result2.ok()); | |
pthatcher1
2017/02/21 20:34:54
This makes it feel like rtp_tranpsort_controller_-
Taylor Brandstetter
2017/02/22 01:41:59
Oh, you mean for CreateRtpTransport to be on RtpTr
| |
68 | |
69 auto returned_transports = rtp_transport_controller_->GetTransports(); | |
70 ASSERT_EQ(2u, returned_transports.size()); | |
71 EXPECT_EQ(rtp_transport_result1.value().get(), returned_transports[0]); | |
72 EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[1]); | |
73 | |
74 // If a transport is deleted, it shouldn't be returned any more. | |
75 rtp_transport_result1.MoveValue().reset(); | |
76 returned_transports = rtp_transport_controller_->GetTransports(); | |
77 ASSERT_EQ(1u, returned_transports.size()); | |
78 EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[0]); | |
79 } | |
80 | |
81 // Create RtpSenders and RtpReceivers on top of RtpTransports controlled by the | |
82 // same RtpTransportController. Currently only one each of audio/video is | |
83 // supported. | |
84 TEST_F(RtpTransportControllerTest, AttachMultipleSendersAndReceivers) { | |
85 rtc::FakePacketTransport audio_packet_transport("audio"); | |
86 rtc::FakePacketTransport video_packet_transport("video"); | |
87 | |
88 auto audio_rtp_transport_result = ortc_factory_->CreateRtpTransport( | |
89 MakeRtcpMuxParameters(), &audio_packet_transport, nullptr, | |
90 rtp_transport_controller_.get()); | |
91 ASSERT_TRUE(audio_rtp_transport_result.ok()); | |
92 auto audio_rtp_transport = audio_rtp_transport_result.MoveValue(); | |
93 | |
94 auto video_rtp_transport_result = ortc_factory_->CreateRtpTransport( | |
95 MakeRtcpMuxParameters(), &video_packet_transport, nullptr, | |
96 rtp_transport_controller_.get()); | |
97 ASSERT_TRUE(video_rtp_transport_result.ok()); | |
98 auto video_rtp_transport = video_rtp_transport_result.MoveValue(); | |
99 | |
100 auto audio_sender_result = ortc_factory_->CreateRtpSender( | |
101 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
102 EXPECT_TRUE(audio_sender_result.ok()); | |
103 auto audio_receiver_result = ortc_factory_->CreateRtpReceiver( | |
104 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
105 EXPECT_TRUE(audio_receiver_result.ok()); | |
106 auto video_sender_result = ortc_factory_->CreateRtpSender( | |
107 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
108 EXPECT_TRUE(video_sender_result.ok()); | |
109 auto video_receiver_result = ortc_factory_->CreateRtpReceiver( | |
110 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
111 EXPECT_TRUE(video_receiver_result.ok()); | |
112 | |
113 // Now that we have one each of audio/video senders/receivers, trying to | |
114 // create more on top of the same controller is expected to fail. | |
115 // TODO(deadbeef): Update this test once multiple senders/receivers on top of | |
116 // the same controller is supported. | |
117 auto failed_sender_result = ortc_factory_->CreateRtpSender( | |
118 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
119 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
120 failed_sender_result.error().type()); | |
121 auto failed_receiver_result = ortc_factory_->CreateRtpReceiver( | |
122 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
123 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
124 failed_receiver_result.error().type()); | |
125 failed_sender_result = ortc_factory_->CreateRtpSender( | |
126 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
127 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
128 failed_sender_result.error().type()); | |
129 failed_receiver_result = ortc_factory_->CreateRtpReceiver( | |
130 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
131 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
132 failed_receiver_result.error().type()); | |
133 | |
134 // If we destroy the existing sender/receiver using a transport controller, | |
135 // we should be able to make a new one, despite the above limitation. | |
136 audio_sender_result.MoveValue().reset(); | |
137 audio_sender_result = ortc_factory_->CreateRtpSender( | |
138 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
139 EXPECT_TRUE(audio_sender_result.ok()); | |
140 audio_receiver_result.MoveValue().reset(); | |
141 audio_receiver_result = ortc_factory_->CreateRtpReceiver( | |
142 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get()); | |
143 EXPECT_TRUE(audio_receiver_result.ok()); | |
144 video_sender_result.MoveValue().reset(); | |
145 video_sender_result = ortc_factory_->CreateRtpSender( | |
146 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
147 EXPECT_TRUE(video_sender_result.ok()); | |
148 video_receiver_result.MoveValue().reset(); | |
149 video_receiver_result = ortc_factory_->CreateRtpReceiver( | |
150 cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get()); | |
151 EXPECT_TRUE(video_receiver_result.ok()); | |
152 } | |
153 | |
154 // Given the current limitations of the BaseChannel-based implementation, it's | |
155 // not possible for an audio sender and receiver to use different RtpTransports. | |
156 // TODO(deadbeef): Once this is supported, update/replace this test. | |
157 TEST_F(RtpTransportControllerTest, | |
158 SenderAndReceiverUsingDifferentTransportsUnsupported) { | |
159 rtc::FakePacketTransport packet_transport1("one"); | |
160 rtc::FakePacketTransport packet_transport2("two"); | |
161 | |
162 auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport( | |
163 MakeRtcpMuxParameters(), &packet_transport1, nullptr, | |
164 rtp_transport_controller_.get()); | |
165 ASSERT_TRUE(rtp_transport_result1.ok()); | |
166 auto rtp_transport1 = rtp_transport_result1.MoveValue(); | |
167 | |
168 auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport( | |
169 MakeRtcpMuxParameters(), &packet_transport2, nullptr, | |
170 rtp_transport_controller_.get()); | |
171 ASSERT_TRUE(rtp_transport_result2.ok()); | |
172 auto rtp_transport2 = rtp_transport_result2.MoveValue(); | |
173 | |
174 // Create an audio sender on transport 1, then try to create a receiver on 2. | |
175 auto audio_sender_result = ortc_factory_->CreateRtpSender( | |
176 cricket::MEDIA_TYPE_AUDIO, rtp_transport1.get()); | |
177 EXPECT_TRUE(audio_sender_result.ok()); | |
178 auto audio_receiver_result = ortc_factory_->CreateRtpReceiver( | |
179 cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get()); | |
180 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
181 audio_receiver_result.error().type()); | |
182 // Delete the sender; now we should be ok to create the receiver on 2. | |
183 audio_sender_result.MoveValue().reset(); | |
184 audio_receiver_result = ortc_factory_->CreateRtpReceiver( | |
185 cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get()); | |
186 EXPECT_TRUE(audio_receiver_result.ok()); | |
187 | |
188 // Do the same thing for video, reversing 1 and 2 (for variety). | |
189 auto video_sender_result = ortc_factory_->CreateRtpSender( | |
190 cricket::MEDIA_TYPE_VIDEO, rtp_transport2.get()); | |
191 EXPECT_TRUE(video_sender_result.ok()); | |
192 auto video_receiver_result = ortc_factory_->CreateRtpReceiver( | |
193 cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get()); | |
194 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION, | |
195 video_receiver_result.error().type()); | |
196 video_sender_result.MoveValue().reset(); | |
197 video_receiver_result = ortc_factory_->CreateRtpReceiver( | |
198 cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get()); | |
199 EXPECT_TRUE(video_receiver_result.ok()); | |
200 } | |
201 | |
202 } // namespace webrtc | |
OLD | NEW |