blob: 46c3965d921a11d8c67d36fc6bee34f8f31427f3 [file] [log] [blame]
deadbeefe814a0d2017-02-25 18:15:09 -08001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "media/base/fakemediaengine.h"
14#include "ortc/ortcfactory.h"
15#include "ortc/testrtpparameters.h"
16#include "p2p/base/fakepackettransport.h"
17#include "rtc_base/gunit.h"
deadbeefe814a0d2017-02-25 18:15:09 -080018
19namespace webrtc {
20
21// This test uses fake packet transports and a fake media engine, in order to
22// test the RtpTransport at only an API level. Any end-to-end test should go in
23// ortcfactory_integrationtest.cc instead.
24class RtpTransportTest : public testing::Test {
25 public:
26 RtpTransportTest() {
27 fake_media_engine_ = new cricket::FakeMediaEngine();
28 // Note: This doesn't need to use fake network classes, since it uses
29 // FakePacketTransports.
30 auto result = OrtcFactory::Create(
31 nullptr, nullptr, nullptr, nullptr, nullptr,
32 std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
33 ortc_factory_ = result.MoveValue();
34 }
35
36 protected:
37 // Owned by |ortc_factory_|.
38 cricket::FakeMediaEngine* fake_media_engine_;
39 std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
40};
41
42// Test GetRtpPacketTransport and GetRtcpPacketTransport, with and without RTCP
43// muxing.
44TEST_F(RtpTransportTest, GetPacketTransports) {
45 rtc::FakePacketTransport rtp("rtp");
46 rtc::FakePacketTransport rtcp("rtcp");
47 // With muxed RTCP.
sprangdb2a9fc2017-08-09 06:42:32 -070048 RtpTransportParameters parameters;
49 parameters.rtcp.mux = true;
50 auto result =
51 ortc_factory_->CreateRtpTransport(parameters, &rtp, nullptr, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -080052 ASSERT_TRUE(result.ok());
53 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
54 EXPECT_EQ(nullptr, result.value()->GetRtcpPacketTransport());
55 result.MoveValue().reset();
56 // With non-muxed RTCP.
sprangdb2a9fc2017-08-09 06:42:32 -070057 parameters.rtcp.mux = false;
58 result = ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -080059 ASSERT_TRUE(result.ok());
60 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
61 EXPECT_EQ(&rtcp, result.value()->GetRtcpPacketTransport());
62}
63
64// If an RtpTransport starts out un-muxed and then starts muxing, the RTCP
65// packet transport should be forgotten and GetRtcpPacketTransport should
66// return null.
67TEST_F(RtpTransportTest, EnablingRtcpMuxingUnsetsRtcpTransport) {
68 rtc::FakePacketTransport rtp("rtp");
69 rtc::FakePacketTransport rtcp("rtcp");
70
71 // Create non-muxed.
sprangdb2a9fc2017-08-09 06:42:32 -070072 RtpTransportParameters parameters;
73 parameters.rtcp.mux = false;
deadbeefe814a0d2017-02-25 18:15:09 -080074 auto result =
sprangdb2a9fc2017-08-09 06:42:32 -070075 ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -080076 ASSERT_TRUE(result.ok());
77 auto rtp_transport = result.MoveValue();
78
79 // Enable muxing.
sprangdb2a9fc2017-08-09 06:42:32 -070080 parameters.rtcp.mux = true;
81 EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
deadbeefe814a0d2017-02-25 18:15:09 -080082 EXPECT_EQ(nullptr, rtp_transport->GetRtcpPacketTransport());
83}
84
85TEST_F(RtpTransportTest, GetAndSetRtcpParameters) {
86 rtc::FakePacketTransport rtp("rtp");
87 rtc::FakePacketTransport rtcp("rtcp");
88 // Start with non-muxed RTCP.
sprangdb2a9fc2017-08-09 06:42:32 -070089 RtpTransportParameters parameters;
90 parameters.rtcp.mux = false;
91 parameters.rtcp.cname = "teST";
92 parameters.rtcp.reduced_size = false;
deadbeefe814a0d2017-02-25 18:15:09 -080093 auto result =
sprangdb2a9fc2017-08-09 06:42:32 -070094 ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -080095 ASSERT_TRUE(result.ok());
96 auto transport = result.MoveValue();
sprangdb2a9fc2017-08-09 06:42:32 -070097 EXPECT_EQ(parameters, transport->GetParameters());
deadbeefe814a0d2017-02-25 18:15:09 -080098
99 // Changing the CNAME is currently unsupported.
sprangdb2a9fc2017-08-09 06:42:32 -0700100 parameters.rtcp.cname = "different";
deadbeefe814a0d2017-02-25 18:15:09 -0800101 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
sprangdb2a9fc2017-08-09 06:42:32 -0700102 transport->SetParameters(parameters).type());
103 parameters.rtcp.cname = "teST";
deadbeefe814a0d2017-02-25 18:15:09 -0800104
105 // Enable RTCP muxing and reduced-size RTCP.
sprangdb2a9fc2017-08-09 06:42:32 -0700106 parameters.rtcp.mux = true;
107 parameters.rtcp.reduced_size = true;
108 EXPECT_TRUE(transport->SetParameters(parameters).ok());
109 EXPECT_EQ(parameters, transport->GetParameters());
deadbeefe814a0d2017-02-25 18:15:09 -0800110
111 // Empty CNAME should result in the existing CNAME being used.
sprangdb2a9fc2017-08-09 06:42:32 -0700112 parameters.rtcp.cname.clear();
113 EXPECT_TRUE(transport->SetParameters(parameters).ok());
114 EXPECT_EQ("teST", transport->GetParameters().rtcp.cname);
deadbeefe814a0d2017-02-25 18:15:09 -0800115
116 // Disabling RTCP muxing after enabling shouldn't be allowed, since enabling
117 // muxing should have made the RTP transport forget about the RTCP packet
118 // transport initially passed into it.
sprangdb2a9fc2017-08-09 06:42:32 -0700119 parameters.rtcp.mux = false;
deadbeefe814a0d2017-02-25 18:15:09 -0800120 EXPECT_EQ(RTCErrorType::INVALID_STATE,
sprangdb2a9fc2017-08-09 06:42:32 -0700121 transport->SetParameters(parameters).type());
deadbeefe814a0d2017-02-25 18:15:09 -0800122}
123
124// When Send or Receive is called on a sender or receiver, the RTCP parameters
125// from the RtpTransport underneath the sender should be applied to the created
126// media stream. The only relevant parameters (currently) are |cname| and
127// |reduced_size|.
128TEST_F(RtpTransportTest, SendAndReceiveApplyRtcpParametersToMediaEngine) {
129 // First, create video transport with reduced-size RTCP.
130 rtc::FakePacketTransport fake_packet_transport1("1");
sprangdb2a9fc2017-08-09 06:42:32 -0700131 RtpTransportParameters parameters;
132 parameters.rtcp.mux = true;
133 parameters.rtcp.reduced_size = true;
134 parameters.rtcp.cname = "foo";
deadbeefe814a0d2017-02-25 18:15:09 -0800135 auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
sprangdb2a9fc2017-08-09 06:42:32 -0700136 parameters, &fake_packet_transport1, nullptr, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -0800137 auto video_transport = rtp_transport_result.MoveValue();
138
139 // Create video sender and call Send, expecting parameters to be applied.
140 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
141 video_transport.get());
142 auto video_sender = sender_result.MoveValue();
143 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
144 cricket::FakeVideoMediaChannel* fake_video_channel =
145 fake_media_engine_->GetVideoChannel(0);
146 ASSERT_NE(nullptr, fake_video_channel);
147 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
148 ASSERT_EQ(1u, fake_video_channel->send_streams().size());
149 const cricket::StreamParams& video_send_stream =
150 fake_video_channel->send_streams()[0];
151 EXPECT_EQ("foo", video_send_stream.cname);
152
153 // Create video receiver and call Receive, expecting parameters to be applied
154 // (minus |cname|, since that's the sent cname, not received).
155 auto receiver_result = ortc_factory_->CreateRtpReceiver(
156 cricket::MEDIA_TYPE_VIDEO, video_transport.get());
157 auto video_receiver = receiver_result.MoveValue();
158 EXPECT_TRUE(
159 video_receiver->Receive(MakeMinimalVp8ParametersWithSsrc(0xdeadbeef))
160 .ok());
161 EXPECT_TRUE(fake_video_channel->recv_rtcp_parameters().reduced_size);
162
163 // Create audio transport with non-reduced size RTCP.
164 rtc::FakePacketTransport fake_packet_transport2("2");
sprangdb2a9fc2017-08-09 06:42:32 -0700165 parameters.rtcp.reduced_size = false;
166 parameters.rtcp.cname = "bar";
deadbeefe814a0d2017-02-25 18:15:09 -0800167 rtp_transport_result = ortc_factory_->CreateRtpTransport(
sprangdb2a9fc2017-08-09 06:42:32 -0700168 parameters, &fake_packet_transport2, nullptr, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -0800169 auto audio_transport = rtp_transport_result.MoveValue();
170
171 // Create audio sender and call Send, expecting parameters to be applied.
172 sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
173 audio_transport.get());
174 auto audio_sender = sender_result.MoveValue();
175 EXPECT_TRUE(audio_sender->Send(MakeMinimalIsacParameters()).ok());
176
177 cricket::FakeVoiceMediaChannel* fake_voice_channel =
178 fake_media_engine_->GetVoiceChannel(0);
179 ASSERT_NE(nullptr, fake_voice_channel);
180 EXPECT_FALSE(fake_voice_channel->send_rtcp_parameters().reduced_size);
181 ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
182 const cricket::StreamParams& audio_send_stream =
183 fake_voice_channel->send_streams()[0];
184 EXPECT_EQ("bar", audio_send_stream.cname);
185
186 // Create audio receiver and call Receive, expecting parameters to be applied
187 // (minus |cname|, since that's the sent cname, not received).
188 receiver_result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
189 audio_transport.get());
190 auto audio_receiver = receiver_result.MoveValue();
191 EXPECT_TRUE(
192 audio_receiver->Receive(MakeMinimalOpusParametersWithSsrc(0xbaadf00d))
193 .ok());
194 EXPECT_FALSE(fake_voice_channel->recv_rtcp_parameters().reduced_size);
195}
196
sprangdb2a9fc2017-08-09 06:42:32 -0700197// When SetParameters is called, the modified parameters should be applied
deadbeefe814a0d2017-02-25 18:15:09 -0800198// to the media engine.
199// TODO(deadbeef): Once the implementation supports changing the CNAME,
200// test that here.
201TEST_F(RtpTransportTest, SetRtcpParametersAppliesParametersToMediaEngine) {
202 rtc::FakePacketTransport fake_packet_transport("fake");
sprangdb2a9fc2017-08-09 06:42:32 -0700203 RtpTransportParameters parameters;
204 parameters.rtcp.mux = true;
205 parameters.rtcp.reduced_size = false;
deadbeefe814a0d2017-02-25 18:15:09 -0800206 auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
sprangdb2a9fc2017-08-09 06:42:32 -0700207 parameters, &fake_packet_transport, nullptr, nullptr);
deadbeefe814a0d2017-02-25 18:15:09 -0800208 auto rtp_transport = rtp_transport_result.MoveValue();
209
210 // Create video sender and call Send, applying an initial set of parameters.
211 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
212 rtp_transport.get());
213 auto sender = sender_result.MoveValue();
214 EXPECT_TRUE(sender->Send(MakeMinimalVp8Parameters()).ok());
215
216 // Modify parameters and expect them to be changed at the media engine level.
sprangdb2a9fc2017-08-09 06:42:32 -0700217 parameters.rtcp.reduced_size = true;
218 EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
deadbeefe814a0d2017-02-25 18:15:09 -0800219
220 cricket::FakeVideoMediaChannel* fake_video_channel =
221 fake_media_engine_->GetVideoChannel(0);
222 ASSERT_NE(nullptr, fake_video_channel);
223 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
224}
225
sprangdb2a9fc2017-08-09 06:42:32 -0700226// SetParameters should set keepalive for all RTP transports.
227// It is impossible to modify keepalive parameters if any streams are created.
228// Note: This is an implementation detail for current way of configuring the
229// keep-alive. It may change in the future.
230TEST_F(RtpTransportTest, CantChangeKeepAliveAfterCreatedSendStreams) {
231 rtc::FakePacketTransport fake_packet_transport("fake");
232 RtpTransportParameters parameters;
233 parameters.keepalive.timeout_interval_ms = 100;
234 auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
235 parameters, &fake_packet_transport, nullptr, nullptr);
236 ASSERT_TRUE(rtp_transport_result.ok());
237 std::unique_ptr<RtpTransportInterface> rtp_transport =
238 rtp_transport_result.MoveValue();
239
240 // Updating keepalive parameters is ok, since no rtp sender created.
241 parameters.keepalive.timeout_interval_ms = 200;
242 EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
243
244 // Create video sender. Note: |sender_result| scope must extend past the
245 // SetParameters() call below.
246 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
247 rtp_transport.get());
248 EXPECT_TRUE(sender_result.ok());
249
250 // Modify parameters second time after video send stream created.
251 parameters.keepalive.timeout_interval_ms = 10;
252 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
253 rtp_transport->SetParameters(parameters).type());
254}
255
256// Note: This is an implementation detail for current way of configuring the
257// keep-alive. It may change in the future.
258TEST_F(RtpTransportTest, KeepAliveMustBeSameAcrossTransportController) {
259 rtc::FakePacketTransport fake_packet_transport("fake");
260 RtpTransportParameters parameters;
261 parameters.keepalive.timeout_interval_ms = 100;
262
263 // Manually create a controller, that can be shared by multiple transports.
264 auto controller_result = ortc_factory_->CreateRtpTransportController();
265 ASSERT_TRUE(controller_result.ok());
266 std::unique_ptr<RtpTransportControllerInterface> controller =
267 controller_result.MoveValue();
268
269 // Create a first transport.
270 auto first_transport_result = ortc_factory_->CreateRtpTransport(
271 parameters, &fake_packet_transport, nullptr, controller.get());
272 ASSERT_TRUE(first_transport_result.ok());
273
274 // Update the parameters, and create another transport for the same
275 // controller.
276 parameters.keepalive.timeout_interval_ms = 10;
277 auto seconds_transport_result = ortc_factory_->CreateRtpTransport(
278 parameters, &fake_packet_transport, nullptr, controller.get());
279 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
280 seconds_transport_result.error().type());
281}
282
deadbeefe814a0d2017-02-25 18:15:09 -0800283} // namespace webrtc