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

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

Issue 2714813004: Create the SrtpTransportInterface. (Closed)
Patch Set: Created 3 years, 9 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
13 #include "webrtc/base/gunit.h"
14 #include "webrtc/media/base/fakemediaengine.h"
15 #include "webrtc/ortc/ortcfactory.h"
16 #include "webrtc/ortc/testrtpparameters.h"
17 #include "webrtc/p2p/base/fakepackettransport.h"
18
19 namespace webrtc {
20
21 static const char kTestKeyParams1[] =
22 "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
23 static const char kTestKeyParams2[] =
24 "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
25
26 static const cricket::CryptoParams kTestCryptoParams1(1,
27 "AES_CM_128_HMAC_SHA1_80",
28 kTestKeyParams1,
29 "");
30 static const cricket::CryptoParams kTestCryptoParams2(1,
31 "AES_CM_128_HMAC_SHA1_80",
32 kTestKeyParams2,
33 "");
34
35 // This test uses fake packet transports and a fake media engine, in order to
36 // test the RtpTransport at only an API level. Any end-to-end test should go in
37 // ortcfactory_integrationtest.cc instead.
38 class RtpTransportTest : public testing::Test {
39 public:
40 RtpTransportTest() {
41 fake_media_engine_ = new cricket::FakeMediaEngine();
42 // Note: This doesn't need to use fake network classes, since it uses
43 // FakePacketTransports.
44 auto result = OrtcFactory::Create(
45 nullptr, nullptr, nullptr, nullptr, nullptr,
46 std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
47 ortc_factory_ = result.MoveValue();
48 rtp_transport_controller_ =
49 ortc_factory_->CreateRtpTransportController().MoveValue();
50 }
51
52 protected:
53 // Owned by |ortc_factory_|.
54 cricket::FakeMediaEngine* fake_media_engine_;
55 std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
56 std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
57 };
58
59 // Test GetRtpPacketTransport and GetRtcpPacketTransport, with and without RTCP
60 // muxing.
61 TEST_F(RtpTransportTest, GetPacketTransports) {
62 rtc::FakePacketTransport rtp("rtp");
63 rtc::FakePacketTransport rtcp("rtcp");
64 // With muxed RTCP.
65 RtcpParameters rtcp_parameters;
66 rtcp_parameters.mux = true;
67 auto result = ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp,
68 nullptr, nullptr);
69 ASSERT_TRUE(result.ok());
70 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
71 EXPECT_EQ(nullptr, result.value()->GetRtcpPacketTransport());
72 result.MoveValue().reset();
73 // With non-muxed RTCP.
74 rtcp_parameters.mux = false;
75 result =
76 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr);
77 ASSERT_TRUE(result.ok());
78 EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
79 EXPECT_EQ(&rtcp, result.value()->GetRtcpPacketTransport());
80 }
81
82 // If an RtpTransport starts out un-muxed and then starts muxing, the RTCP
83 // packet transport should be forgotten and GetRtcpPacketTransport should
84 // return null.
85 TEST_F(RtpTransportTest, EnablingRtcpMuxingUnsetsRtcpTransport) {
86 rtc::FakePacketTransport rtp("rtp");
87 rtc::FakePacketTransport rtcp("rtcp");
88
89 // Create non-muxed.
90 RtcpParameters rtcp_parameters;
91 rtcp_parameters.mux = false;
92 auto result =
93 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr);
94 ASSERT_TRUE(result.ok());
95 auto rtp_transport = result.MoveValue();
96
97 // Enable muxing.
98 rtcp_parameters.mux = true;
99 EXPECT_TRUE(rtp_transport->SetRtcpParameters(rtcp_parameters).ok());
100 EXPECT_EQ(nullptr, rtp_transport->GetRtcpPacketTransport());
101 }
102
103 TEST_F(RtpTransportTest, GetAndSetRtcpParameters) {
104 rtc::FakePacketTransport rtp("rtp");
105 rtc::FakePacketTransport rtcp("rtcp");
106 // Start with non-muxed RTCP.
107 RtcpParameters rtcp_parameters;
108 rtcp_parameters.mux = false;
109 rtcp_parameters.cname = "teST";
110 rtcp_parameters.reduced_size = false;
111 auto result =
112 ortc_factory_->CreateRtpTransport(rtcp_parameters, &rtp, &rtcp, nullptr);
113 ASSERT_TRUE(result.ok());
114 auto transport = result.MoveValue();
115 EXPECT_EQ(rtcp_parameters, transport->GetRtcpParameters());
116
117 // Changing the CNAME is currently unsupported.
118 rtcp_parameters.cname = "different";
119 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
120 transport->SetRtcpParameters(rtcp_parameters).type());
121 rtcp_parameters.cname = "teST";
122
123 // Enable RTCP muxing and reduced-size RTCP.
124 rtcp_parameters.mux = true;
125 rtcp_parameters.reduced_size = true;
126 EXPECT_TRUE(transport->SetRtcpParameters(rtcp_parameters).ok());
127 EXPECT_EQ(rtcp_parameters, transport->GetRtcpParameters());
128
129 // Empty CNAME should result in the existing CNAME being used.
130 rtcp_parameters.cname.clear();
131 EXPECT_TRUE(transport->SetRtcpParameters(rtcp_parameters).ok());
132 EXPECT_EQ("teST", transport->GetRtcpParameters().cname);
133
134 // Disabling RTCP muxing after enabling shouldn't be allowed, since enabling
135 // muxing should have made the RTP transport forget about the RTCP packet
136 // transport initially passed into it.
137 rtcp_parameters.mux = false;
138 EXPECT_EQ(RTCErrorType::INVALID_STATE,
139 transport->SetRtcpParameters(rtcp_parameters).type());
140 }
141
142 // When Send or Receive is called on a sender or receiver, the RTCP parameters
143 // from the RtpTransport underneath the sender should be applied to the created
144 // media stream. The only relevant parameters (currently) are |cname| and
145 // |reduced_size|.
146 TEST_F(RtpTransportTest, SendAndReceiveApplyRtcpParametersToMediaEngine) {
147 // First, create video transport with reduced-size RTCP.
148 rtc::FakePacketTransport fake_packet_transport1("1");
149 RtcpParameters rtcp_parameters;
150 rtcp_parameters.mux = true;
151 rtcp_parameters.reduced_size = true;
152 rtcp_parameters.cname = "foo";
153 auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
154 rtcp_parameters, &fake_packet_transport1, nullptr, nullptr);
155 auto video_transport = rtp_transport_result.MoveValue();
156
157 // Create video sender and call Send, expecting parameters to be applied.
158 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
159 video_transport.get());
160 auto video_sender = sender_result.MoveValue();
161 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
162 cricket::FakeVideoMediaChannel* fake_video_channel =
163 fake_media_engine_->GetVideoChannel(0);
164 ASSERT_NE(nullptr, fake_video_channel);
165 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
166 ASSERT_EQ(1u, fake_video_channel->send_streams().size());
167 const cricket::StreamParams& video_send_stream =
168 fake_video_channel->send_streams()[0];
169 EXPECT_EQ("foo", video_send_stream.cname);
170
171 // Create video receiver and call Receive, expecting parameters to be applied
172 // (minus |cname|, since that's the sent cname, not received).
173 auto receiver_result = ortc_factory_->CreateRtpReceiver(
174 cricket::MEDIA_TYPE_VIDEO, video_transport.get());
175 auto video_receiver = receiver_result.MoveValue();
176 EXPECT_TRUE(
177 video_receiver->Receive(MakeMinimalVp8ParametersWithSsrc(0xdeadbeef))
178 .ok());
179 EXPECT_TRUE(fake_video_channel->recv_rtcp_parameters().reduced_size);
180
181 // Create audio transport with non-reduced size RTCP.
182 rtc::FakePacketTransport fake_packet_transport2("2");
183 rtcp_parameters.reduced_size = false;
184 rtcp_parameters.cname = "bar";
185 rtp_transport_result = ortc_factory_->CreateRtpTransport(
186 rtcp_parameters, &fake_packet_transport2, nullptr, nullptr);
187 auto audio_transport = rtp_transport_result.MoveValue();
188
189 // Create audio sender and call Send, expecting parameters to be applied.
190 sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
191 audio_transport.get());
192 auto audio_sender = sender_result.MoveValue();
193 EXPECT_TRUE(audio_sender->Send(MakeMinimalIsacParameters()).ok());
194
195 cricket::FakeVoiceMediaChannel* fake_voice_channel =
196 fake_media_engine_->GetVoiceChannel(0);
197 ASSERT_NE(nullptr, fake_voice_channel);
198 EXPECT_FALSE(fake_voice_channel->send_rtcp_parameters().reduced_size);
199 ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
200 const cricket::StreamParams& audio_send_stream =
201 fake_voice_channel->send_streams()[0];
202 EXPECT_EQ("bar", audio_send_stream.cname);
203
204 // Create audio receiver and call Receive, expecting parameters to be applied
205 // (minus |cname|, since that's the sent cname, not received).
206 receiver_result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
207 audio_transport.get());
208 auto audio_receiver = receiver_result.MoveValue();
209 EXPECT_TRUE(
210 audio_receiver->Receive(MakeMinimalOpusParametersWithSsrc(0xbaadf00d))
211 .ok());
212 EXPECT_FALSE(fake_voice_channel->recv_rtcp_parameters().reduced_size);
213 }
214
215 // When SetRtcpParameters is called, the modified parameters should be applied
216 // to the media engine.
217 // TODO(deadbeef): Once the implementation supports changing the CNAME,
218 // test that here.
219 TEST_F(RtpTransportTest, SetRtcpParametersAppliesParametersToMediaEngine) {
220 rtc::FakePacketTransport fake_packet_transport("fake");
221 RtcpParameters rtcp_parameters;
222 rtcp_parameters.mux = true;
223 rtcp_parameters.reduced_size = false;
224 auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
225 rtcp_parameters, &fake_packet_transport, nullptr, nullptr);
226 auto rtp_transport = rtp_transport_result.MoveValue();
227
228 // Create video sender and call Send, applying an initial set of parameters.
229 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
230 rtp_transport.get());
231 auto sender = sender_result.MoveValue();
232 EXPECT_TRUE(sender->Send(MakeMinimalVp8Parameters()).ok());
233
234 // Modify parameters and expect them to be changed at the media engine level.
235 rtcp_parameters.reduced_size = true;
236 EXPECT_TRUE(rtp_transport->SetRtcpParameters(rtcp_parameters).ok());
237
238 cricket::FakeVideoMediaChannel* fake_video_channel =
239 fake_media_engine_->GetVideoChannel(0);
240 ASSERT_NE(nullptr, fake_video_channel);
241 EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
242 }
243
244 // Tests that re-setting the SRTP send/receive key is not supported.
245 TEST_F(RtpTransportTest, SetSrtpSendAndReceiveKey) {
246 rtc::FakePacketTransport fake_packet_transport("fake");
247 RtcpParameters rtcp_parameters;
248 auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
249 rtcp_parameters, &fake_packet_transport, nullptr,
250 rtp_transport_controller_.get());
251 auto srtp_transport = srtp_transport_result.MoveValue();
252 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
253 srtp_transport.get());
254 EXPECT_TRUE(srtp_transport->SetSrtpSendKey(kTestCryptoParams1).ok());
255 EXPECT_FALSE(srtp_transport->SetSrtpSendKey(kTestCryptoParams2).ok());
256 EXPECT_TRUE(srtp_transport->SetSrtpReceiveKey(kTestCryptoParams1).ok());
257 EXPECT_FALSE(srtp_transport->SetSrtpReceiveKey(kTestCryptoParams2).ok());
258 }
259
260 // Tests that the senders cannot send before setting the keys.
261 TEST_F(RtpTransportTest, SendBeforeSettingKeys) {
262 rtc::FakePacketTransport fake_packet_transport("fake");
263 RtcpParameters rtcp_parameters;
264 auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
265 rtcp_parameters, &fake_packet_transport, nullptr,
266 rtp_transport_controller_.get());
267 auto srtp_transport = srtp_transport_result.MoveValue();
268 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
269 srtp_transport.get());
270 auto sender = sender_result.MoveValue();
271 EXPECT_FALSE(sender->Send(MakeMinimalVp8Parameters()).ok());
272 EXPECT_TRUE(srtp_transport->SetSrtpSendKey(kTestCryptoParams1).ok());
273 EXPECT_FALSE(sender->Send(MakeMinimalVp8Parameters()).ok());
274 EXPECT_TRUE(srtp_transport->SetSrtpReceiveKey(kTestCryptoParams1).ok());
275 EXPECT_TRUE(sender->Send(MakeMinimalVp8Parameters()).ok());
276 }
277
278 // Tests that the Receivers cannot receive before setting the keys.
279 TEST_F(RtpTransportTest, ReceiveBeforeSettingKeys) {
280 rtc::FakePacketTransport fake_packet_transport("fake");
281 RtcpParameters rtcp_parameters;
282 auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
283 rtcp_parameters, &fake_packet_transport, nullptr,
284 rtp_transport_controller_.get());
285 auto srtp_transport = srtp_transport_result.MoveValue();
286 auto receiver_result = ortc_factory_->CreateRtpReceiver(
287 cricket::MEDIA_TYPE_VIDEO, srtp_transport.get());
288 auto receiver = receiver_result.MoveValue();
289 EXPECT_FALSE(receiver->Receive(MakeMinimalVp8Parameters()).ok());
290 EXPECT_TRUE(srtp_transport->SetSrtpSendKey(kTestCryptoParams1).ok());
291 EXPECT_FALSE(receiver->Receive(MakeMinimalVp8Parameters()).ok());
292 EXPECT_TRUE(srtp_transport->SetSrtpReceiveKey(kTestCryptoParams1).ok());
293 EXPECT_TRUE(receiver->Receive(MakeMinimalVp8Parameters()).ok());
294 }
295
296 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698