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

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

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Adding OrtcFactory unit tests. 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
13 #include "webrtc/base/gunit.h"
14 #include "webrtc/media/base/fakemediaengine.h"
15 #include "webrtc/p2p/base/fakepackettransport.h"
16 #include "webrtc/ortc/ortcfactory.h"
17 #include "webrtc/ortc/testrtpparameters.h"
18 #include "webrtc/pc/test/fakevideotracksource.h"
19
20 namespace webrtc {
21
22 // This test uses an individual RtpSender using only the public interface, and
23 // verify that its APIs behave as intended. Also tests that parameters are
24 // applied to the audio/video engines as expected. Network and media interfaces
25 // are faked to isolate what's being tested.
26 //
27 // This test shouldn't result any any actual media being sent. That sort of
28 // test should go in ortcfactory_integrationtest.cc.
29 class OrtcRtpSenderTest : public testing::Test {
30 public:
31 OrtcRtpSenderTest() {
32 fake_media_engine_ = new cricket::FakeMediaEngine();
33 // Note: This doesn't need to use fake network classes, since we already
34 // use FakePacketTransport.
35 ortc_factory_ =
36 OrtcFactory::Create(
37 nullptr, nullptr, nullptr, nullptr, nullptr,
38 std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_))
39 .MoveValue();
40 fake_packet_transport_.reset(new rtc::FakePacketTransport("fake_packet"));
41 RtcpParameters rtcp_parameters;
42 rtcp_parameters.mux = true;
43 rtp_transport_ =
44 ortc_factory_
45 ->CreateRtpTransport(rtcp_parameters, fake_packet_transport_.get(),
46 nullptr, nullptr)
47 .MoveValue();
48 }
49
50 protected:
51 rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack(
52 const std::string& id) {
53 return ortc_factory_->CreateAudioTrack(id, nullptr);
54 }
55
56 rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
57 const std::string& id) {
58 return rtc::scoped_refptr<webrtc::VideoTrackInterface>(
59 ortc_factory_->CreateVideoTrack(id, FakeVideoTrackSource::Create()));
60 }
61
62 // Owned by |ortc_factory_|.
63 cricket::FakeMediaEngine* fake_media_engine_;
64 std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
65 std::unique_ptr<PacketTransportInterface> fake_packet_transport_;
66 std::unique_ptr<RtpTransportInterface> rtp_transport_;
67 };
68
69 TEST_F(OrtcRtpSenderTest, GetAndSetTrack) {
70 // Test GetTrack with a sender constructed with a track.
71 auto audio_track = CreateAudioTrack("audio");
72 auto audio_sender =
73 ortc_factory_->CreateRtpSender(audio_track, rtp_transport_.get())
74 .MoveValue();
75 EXPECT_EQ(audio_track, audio_sender->GetTrack());
76
77 // Test GetTrack after SetTrack.
78 auto video_sender =
79 ortc_factory_
80 ->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get())
81 .MoveValue();
82 auto video_track = CreateVideoTrack("video1");
83 EXPECT_TRUE(video_sender->SetTrack(video_track).ok());
84 EXPECT_EQ(video_track, video_sender->GetTrack());
85 video_track = CreateVideoTrack("video2");
86 EXPECT_TRUE(video_sender->SetTrack(video_track).ok());
87 EXPECT_EQ(video_track, video_sender->GetTrack());
88 }
89
90 // Test that track can be sent, even mid sending (or at least, configured for
91 // sending).
92 TEST_F(OrtcRtpSenderTest, SetTrackWhileSending) {
93 auto audio_sender =
94 ortc_factory_
95 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
96 .MoveValue();
97 EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
98 EXPECT_TRUE(audio_sender->SetTrack(CreateAudioTrack("audio")).ok());
99
100 auto video_sender =
101 ortc_factory_
102 ->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get())
103 .MoveValue();
104 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
105 EXPECT_TRUE(video_sender->SetTrack(CreateVideoTrack("video")).ok());
106 }
107
108 // Test that track can be changed mid-sending.
109 TEST_F(OrtcRtpSenderTest, ChangeTrackWhileSending) {
110 auto audio_sender =
111 ortc_factory_
112 ->CreateRtpSender(CreateAudioTrack("audio1"), rtp_transport_.get())
113 .MoveValue();
114 EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
115 EXPECT_TRUE(audio_sender->SetTrack(CreateAudioTrack("audio2")).ok());
116
117 auto video_sender =
118 ortc_factory_
119 ->CreateRtpSender(CreateVideoTrack("video1"), rtp_transport_.get())
120 .MoveValue();
121 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
122 EXPECT_TRUE(video_sender->SetTrack(CreateVideoTrack("video2")).ok());
123 }
124
125 // Test that track can be set to null wihle sending.
126 TEST_F(OrtcRtpSenderTest, UnsetTrackWhileSending) {
127 auto audio_sender =
128 ortc_factory_
129 ->CreateRtpSender(CreateAudioTrack("audio"), rtp_transport_.get())
130 .MoveValue();
131 EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
132 EXPECT_TRUE(audio_sender->SetTrack(nullptr).ok());
133
134 auto video_sender =
135 ortc_factory_
136 ->CreateRtpSender(CreateVideoTrack("video"), rtp_transport_.get())
137 .MoveValue();
138 EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
139 EXPECT_TRUE(video_sender->SetTrack(nullptr).ok());
140 }
141
142 // Shouldn't be able to set an audio track on a video sender or vice versa.
143 TEST_F(OrtcRtpSenderTest, SetTrackOfWrongKindFails) {
144 auto audio_sender =
145 ortc_factory_
146 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
147 .MoveValue();
148 EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
149 audio_sender->SetTrack(CreateVideoTrack("video")).error().type());
150
151 auto video_sender =
152 ortc_factory_
153 ->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get())
154 .MoveValue();
155 EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
156 video_sender->SetTrack(CreateAudioTrack("audio")).error().type());
157 }
158
159 // Currently SetTransport isn't supported. When it is, replace this test with a
160 // test/tests for it.
161 TEST_F(OrtcRtpSenderTest, SetTransportFails) {
162 rtc::FakePacketTransport fake_packet_transport2("fake_two");
163 RtcpParameters rtcp_parameters;
164 rtcp_parameters.mux = true;
165 auto rtp_transport2 =
166 ortc_factory_
167 ->CreateRtpTransport(rtcp_parameters, &fake_packet_transport2,
168 nullptr, nullptr)
169 .MoveValue();
170
171 auto sender =
172 ortc_factory_
173 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
174 .MoveValue();
175 EXPECT_FALSE(RTCErrorType::INVALID_PARAMETER,
176 sender->SetTransport(rtp_transport2.get()).error().type());
177 }
178
179 TEST_F(OrtcRtpSenderTest, GetTransport) {
180 auto result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
181 rtp_transport_.get());
182 EXPECT_EQ(rtp_transport_.get(), result.value()->GetTransport());
183 }
184
185 // Test that "Send" causes the expected parameters to be applied to the media
186 // engine level, for an audio sender.
187 TEST_F(OrtcRtpSenderTest, SendAppliesAudioParametersToMediaEngine) {
188 auto audio_sender =
189 ortc_factory_
190 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
191 .MoveValue();
192
193 // First, create parameters with all the bells and whistles.
194 RtpParameters parameters;
195
196 RtpCodecParameters opus_codec;
197 opus_codec.name = "opus";
198 opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
199 opus_codec.payload_type = 120;
200 opus_codec.clock_rate.emplace(48000);
201 opus_codec.num_channels.emplace(2);
202 opus_codec.parameters["minptime"] = "10";
203 opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
204 parameters.codecs.push_back(std::move(opus_codec));
205
206 // Add two codecs, expecting the first to be used.
207 // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
208 // codec that's not at the top of the list.
209 RtpCodecParameters isac_codec;
210 isac_codec.name = "ISAC";
211 isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
212 isac_codec.payload_type = 110;
213 isac_codec.clock_rate.emplace(16000);
214 parameters.codecs.push_back(std::move(isac_codec));
215
216 RtpEncodingParameters encoding;
217 encoding.ssrc.emplace(0xdeadbeef);
218 encoding.max_bitrate_bps.emplace(20000);
219 parameters.encodings.push_back(std::move(encoding));
220
221 parameters.header_extensions.emplace_back(
222 "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 3);
223
224 EXPECT_TRUE(audio_sender->Send(parameters).ok());
225
226 // Now verify that the parameters were applied to the fake media engine layer
227 // that exists below BaseChannel.
228 cricket::FakeVoiceMediaChannel* fake_voice_channel =
229 fake_media_engine_->GetVoiceChannel(0);
230 ASSERT_NE(nullptr, fake_voice_channel);
231
232 // Verify codec parameters.
233 ASSERT_GT(fake_voice_channel->send_codecs().size(), 0u);
234 const cricket::AudioCodec& top_codec = fake_voice_channel->send_codecs()[0];
235 EXPECT_EQ("opus", top_codec.name);
236 EXPECT_EQ(120, top_codec.id);
237 EXPECT_EQ(48000, top_codec.clockrate);
238 EXPECT_EQ(2u, top_codec.channels);
239 ASSERT_NE(top_codec.params.end(), top_codec.params.find("minptime"));
240 EXPECT_EQ("10", top_codec.params.at("minptime"));
241
242 // Verify encoding parameters.
243 EXPECT_EQ(20000, fake_voice_channel->max_bps());
244 EXPECT_EQ(1u, fake_voice_channel->send_streams().size());
245 const cricket::StreamParams& send_stream =
246 fake_voice_channel->send_streams()[0];
247 EXPECT_EQ(1u, send_stream.ssrcs.size());
248 EXPECT_EQ(0xdeadbeef, send_stream.first_ssrc());
249
250 // Verify header extensions.
251 ASSERT_EQ(1u, fake_voice_channel->send_extensions().size());
252 const RtpExtension& extension = fake_voice_channel->send_extensions()[0];
253 EXPECT_EQ("urn:ietf:params:rtp-hdrext:ssrc-audio-level", extension.uri);
254 EXPECT_EQ(3, extension.id);
255 }
256
257 // Test that "Send" causes the expected parameters to be applied to the media
258 // engine level, for a video sender.
259 TEST_F(OrtcRtpSenderTest, SendAppliesVideoParametersToMediaEngine) {
260 auto video_sender =
261 ortc_factory_
262 ->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get())
263 .MoveValue();
264
265 // First, create parameters with all the bells and whistles.
266 RtpParameters parameters;
267
268 RtpCodecParameters vp8_codec;
269 vp8_codec.name = "VP8";
270 vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
271 vp8_codec.payload_type = 99;
272 // Try a couple types of feedback params. "Generic NACK" is a bit of a
273 // special case, so test it here.
274 vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
275 RtcpFeedbackMessageType::FIR);
276 vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
277 RtcpFeedbackMessageType::GENERIC_NACK);
278 parameters.codecs.push_back(std::move(vp8_codec));
279
280 RtpCodecParameters vp8_rtx_codec;
281 vp8_rtx_codec.name = "rtx";
282 vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
283 vp8_rtx_codec.payload_type = 100;
284 vp8_rtx_codec.parameters["apt"] = "99";
285 parameters.codecs.push_back(std::move(vp8_rtx_codec));
286
287 // Add two codecs, expecting the first to be used.
288 // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
289 // codec that's not at the top of the list.
290 RtpCodecParameters vp9_codec;
291 vp9_codec.name = "VP9";
292 vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO;
293 vp9_codec.payload_type = 102;
294 parameters.codecs.push_back(std::move(vp9_codec));
295
296 RtpCodecParameters vp9_rtx_codec;
297 vp9_rtx_codec.name = "rtx";
298 vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
299 vp9_rtx_codec.payload_type = 103;
300 vp9_rtx_codec.parameters["apt"] = "102";
301 parameters.codecs.push_back(std::move(vp9_rtx_codec));
302
303 RtpEncodingParameters encoding;
304 encoding.ssrc.emplace(0xdeadbeef);
305 encoding.rtx.emplace(0xbaadfeed);
306 encoding.max_bitrate_bps.emplace(99999);
307 parameters.encodings.push_back(std::move(encoding));
308
309 parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4);
310 parameters.header_extensions.emplace_back(
311 "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6);
312
313 EXPECT_TRUE(video_sender->Send(parameters).ok());
314
315 // Now verify that the parameters were applied to the fake media engine layer
316 // that exists below BaseChannel.
317 cricket::FakeVideoMediaChannel* fake_video_channel =
318 fake_media_engine_->GetVideoChannel(0);
319 ASSERT_NE(nullptr, fake_video_channel);
320
321 // Verify codec parameters.
322 ASSERT_GE(fake_video_channel->send_codecs().size(), 2u);
323 const cricket::VideoCodec& top_codec = fake_video_channel->send_codecs()[0];
324 EXPECT_EQ("VP8", top_codec.name);
325 EXPECT_EQ(99, top_codec.id);
326 EXPECT_TRUE(
327 top_codec.feedback_params.Has(cricket::FeedbackParam("ccm", "fir")));
328 EXPECT_TRUE(top_codec.feedback_params.Has(cricket::FeedbackParam("nack")));
329
330 const cricket::VideoCodec& rtx_codec = fake_video_channel->send_codecs()[1];
331 EXPECT_EQ("rtx", rtx_codec.name);
332 EXPECT_EQ(100, rtx_codec.id);
333 ASSERT_NE(rtx_codec.params.end(), rtx_codec.params.find("apt"));
334 EXPECT_EQ("99", rtx_codec.params.at("apt"));
335
336 // Verify encoding parameters.
337 EXPECT_EQ(99999, fake_video_channel->max_bps());
338 EXPECT_EQ(1u, fake_video_channel->send_streams().size());
339 const cricket::StreamParams& send_stream =
340 fake_video_channel->send_streams()[0];
341 EXPECT_EQ(2u, send_stream.ssrcs.size());
342 EXPECT_EQ(0xdeadbeef, send_stream.first_ssrc());
343 uint32_t rtx_ssrc = 0u;
344 EXPECT_TRUE(send_stream.GetFidSsrc(send_stream.first_ssrc(), &rtx_ssrc));
345 EXPECT_EQ(0xbaadfeed, rtx_ssrc);
346
347 // Verify header extensions.
348 ASSERT_EQ(2u, fake_video_channel->send_extensions().size());
349 const RtpExtension& extension1 = fake_video_channel->send_extensions()[0];
350 EXPECT_EQ("urn:3gpp:video-orientation", extension1.uri);
351 EXPECT_EQ(4, extension1.id);
352 const RtpExtension& extension2 = fake_video_channel->send_extensions()[1];
353 EXPECT_EQ("http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",
354 extension2.uri);
355 EXPECT_EQ(6, extension2.id);
356 }
357
358 // Test changing both the send codec and SSRC at the same time, and verify that
359 // the new parameters are applied to the media engine level.
360 TEST_F(OrtcRtpSenderTest, CallingSendTwiceChangesParameters) {
361 auto audio_sender =
362 ortc_factory_
363 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
364 .MoveValue();
365 audio_sender->Send(MakeMinimalOpusParametersWithSsrc(0x11111111));
366 audio_sender->Send(MakeMinimalIsacParametersWithSsrc(0x22222222));
367
368 cricket::FakeVoiceMediaChannel* fake_voice_channel =
369 fake_media_engine_->GetVoiceChannel(0);
370 ASSERT_NE(nullptr, fake_voice_channel);
371 ASSERT_GT(fake_voice_channel->send_codecs().size(), 0u);
372 EXPECT_EQ("ISAC", fake_voice_channel->send_codecs()[0].name);
373 ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
374 EXPECT_EQ(0x22222222u, fake_voice_channel->send_streams()[0].first_ssrc());
375
376 auto video_sender =
377 ortc_factory_
378 ->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get())
379 .MoveValue();
380 video_sender->Send(MakeMinimalVp8ParametersWithSsrc(0x33333333));
381 video_sender->Send(MakeMinimalVp9ParametersWithSsrc(0x44444444));
382
383 cricket::FakeVideoMediaChannel* fake_video_channel =
384 fake_media_engine_->GetVideoChannel(0);
385 ASSERT_NE(nullptr, fake_video_channel);
386 ASSERT_GT(fake_video_channel->send_codecs().size(), 0u);
387 EXPECT_EQ("VP9", fake_video_channel->send_codecs()[0].name);
388 ASSERT_EQ(1u, fake_video_channel->send_streams().size());
389 EXPECT_EQ(0x44444444u, fake_video_channel->send_streams()[0].first_ssrc());
390 }
391
392 // If Send hasn't been called, GetParameters should return empty parameters.
393 TEST_F(OrtcRtpSenderTest, GetDefaultParameters) {
394 auto result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
395 rtp_transport_.get());
396 EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
397 result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
398 rtp_transport_.get());
399 EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
400 }
401
402 // Test that GetParameters returns the last parameters passed into Send, along
403 // with the implementation-default values filled in where they were left unset.
404 TEST_F(OrtcRtpSenderTest,
405 GetParametersReturnsLastSetParametersWithDefaultsFilled) {
406 auto audio_sender =
407 ortc_factory_
408 ->CreateRtpSender(CreateAudioTrack("audio"), rtp_transport_.get())
409 .MoveValue();
410
411 RtpParameters opus_parameters = MakeMinimalOpusParameters();
412 EXPECT_TRUE(audio_sender->Send(opus_parameters).ok());
413 EXPECT_EQ(opus_parameters, audio_sender->GetParameters());
414
415 RtpParameters isac_parameters = MakeMinimalIsacParameters();
416 // Sanity check that num_channels actually is left unset.
417 ASSERT_FALSE(isac_parameters.codecs[0].num_channels);
418 EXPECT_TRUE(audio_sender->Send(isac_parameters).ok());
419 // Should be filled with a default "num channels" of 1.
420 isac_parameters.codecs[0].num_channels.emplace(1);
421 EXPECT_EQ(isac_parameters, audio_sender->GetParameters());
422
423 auto video_sender =
424 ortc_factory_
425 ->CreateRtpSender(CreateVideoTrack("video"), rtp_transport_.get())
426 .MoveValue();
427
428 RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
429 // Sanity check that clock_rate actually is left unset.
430 EXPECT_TRUE(video_sender->Send(vp8_parameters).ok());
431 // Should be filled with a default clock rate of 90000.
432 vp8_parameters.codecs[0].clock_rate.emplace(90000);
433 EXPECT_EQ(vp8_parameters, video_sender->GetParameters());
434
435 RtpParameters vp9_parameters = MakeMinimalVp9Parameters();
436 // Sanity check that clock_rate actually is left unset.
437 EXPECT_TRUE(video_sender->Send(vp9_parameters).ok());
438 // Should be filled with a default clock rate of 90000.
439 vp9_parameters.codecs[0].clock_rate.emplace(90000);
440 EXPECT_EQ(vp9_parameters, video_sender->GetParameters());
441 }
442
443 TEST_F(OrtcRtpSenderTest, GetKind) {
444 // Construct one sender from the "kind" enum and another from a track.
445 auto audio_sender =
446 ortc_factory_
447 ->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get())
448 .MoveValue();
449 auto video_sender =
450 ortc_factory_
451 ->CreateRtpSender(CreateVideoTrack("video"), rtp_transport_.get())
452 .MoveValue();
453 EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, audio_sender->GetKind());
454 EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, video_sender->GetKind());
455 }
456
457 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698