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

Side by Side Diff: content/renderer/media/media_stream_video_track_unittest.cc

Issue 2805903002: Fix races in MediaStream video constraints tests. (Closed)
Patch Set: Created 3 years, 8 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 19 matching lines...) Expand all
30 30
31 ACTION_P(RunClosure, closure) { 31 ACTION_P(RunClosure, closure) {
32 closure.Run(); 32 closure.Run();
33 } 33 }
34 34
35 class MediaStreamVideoTrackTest : public ::testing::Test { 35 class MediaStreamVideoTrackTest : public ::testing::Test {
36 public: 36 public:
37 MediaStreamVideoTrackTest() 37 MediaStreamVideoTrackTest()
38 : child_process_(new ChildProcess()), 38 : child_process_(new ChildProcess()),
39 mock_source_(nullptr), 39 mock_source_(nullptr),
40 source_started_(false) {} 40 source_started_(false) {
41 scoped_feature_list_.InitAndDisableFeature(
42 features::kMediaStreamOldVideoConstraints);
43 }
41 44
42 ~MediaStreamVideoTrackTest() override {} 45 ~MediaStreamVideoTrackTest() override {}
43 46
44 void TearDown() override { 47 void TearDown() override {
45 blink_source_.reset(); 48 blink_source_.reset();
46 blink::WebHeap::collectAllGarbageForTesting(); 49 blink::WebHeap::collectAllGarbageForTesting();
47 } 50 }
48 51
49 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) { 52 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) {
50 base::RunLoop run_loop; 53 base::RunLoop run_loop;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 return blink_source_; 116 return blink_source_;
114 } 117 }
115 118
116 private: 119 private:
117 const base::MessageLoopForUI message_loop_; 120 const base::MessageLoopForUI message_loop_;
118 const std::unique_ptr<ChildProcess> child_process_; 121 const std::unique_ptr<ChildProcess> child_process_;
119 blink::WebMediaStreamSource blink_source_; 122 blink::WebMediaStreamSource blink_source_;
120 // |mock_source_| is owned by |webkit_source_|. 123 // |mock_source_| is owned by |webkit_source_|.
121 MockMediaStreamVideoSource* mock_source_; 124 MockMediaStreamVideoSource* mock_source_;
122 bool source_started_; 125 bool source_started_;
126 base::test::ScopedFeatureList scoped_feature_list_;
123 }; 127 };
124 128
125 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { 129 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) {
126 InitializeSource(); 130 InitializeSource();
127 MockMediaStreamVideoSink sink; 131 MockMediaStreamVideoSink sink;
128 blink::WebMediaStreamTrack track = CreateTrack(); 132 blink::WebMediaStreamTrack track = CreateTrack();
129 sink.ConnectToTrack(track); 133 sink.ConnectToTrack(track);
130 134
131 DeliverVideoFrameAndWaitForRenderer(&sink); 135 DeliverVideoFrameAndWaitForRenderer(&sink);
132 EXPECT_EQ(1, sink.number_of_frames()); 136 EXPECT_EQ(1, sink.number_of_frames());
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 257
254 MediaStreamVideoTrack* const native_track2 = 258 MediaStreamVideoTrack* const native_track2 =
255 MediaStreamVideoTrack::GetVideoTrack(track2); 259 MediaStreamVideoTrack::GetVideoTrack(track2);
256 native_track2->Stop(); 260 native_track2->Stop();
257 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state()); 261 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state());
258 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, 262 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
259 blink_source().getReadyState()); 263 blink_source().getReadyState());
260 sink2.DisconnectFromTrack(); 264 sink2.DisconnectFromTrack();
261 } 265 }
262 266
263 // TODO(guidou): Remove this test. http://crbug.com/706408 267 TEST_F(MediaStreamVideoTrackTest, CheckTrackRequestsFrame) {
264 TEST_F(MediaStreamVideoTrackTest, 268 InitializeSource();
265 CheckTrackRequestsFrameOldConstraintsOldConstraints) {
266 base::test::ScopedFeatureList scoped_feature_list;
267 scoped_feature_list.InitAndEnableFeature(
268 features::kMediaStreamOldVideoConstraints);
269 UpdateVideoSourceToRespondToRequestRefreshFrame(); 269 UpdateVideoSourceToRespondToRequestRefreshFrame();
270 blink::WebMediaStreamTrack track = CreateTrack(); 270 blink::WebMediaStreamTrack track = CreateTrack();
271 271
272 // Add sink and expect to get a frame. 272 // Add sink and expect to get a frame.
273 MockMediaStreamVideoSink sink; 273 MockMediaStreamVideoSink sink;
274 base::RunLoop run_loop; 274 base::RunLoop run_loop;
275 base::Closure quit_closure = run_loop.QuitClosure(); 275 base::Closure quit_closure = run_loop.QuitClosure();
276 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); 276 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
277 sink.ConnectToTrack(track); 277 sink.ConnectToTrack(track);
278 run_loop.Run(); 278 run_loop.Run();
279 EXPECT_EQ(1, sink.number_of_frames()); 279 EXPECT_EQ(1, sink.number_of_frames());
280 280
281 sink.DisconnectFromTrack(); 281 sink.DisconnectFromTrack();
282 } 282 }
283 283
284 TEST_F(MediaStreamVideoTrackTest, CheckTrackRequestsFrame) { 284 TEST_F(MediaStreamVideoTrackTest, GetSettings) {
285 base::test::ScopedFeatureList scoped_feature_list; 285 InitializeSource();
286 scoped_feature_list.InitAndDisableFeature( 286 blink::WebMediaStreamTrack track = CreateTrack();
287 features::kMediaStreamOldVideoConstraints); 287 MediaStreamVideoTrack* const native_track =
288 InitializeSource(); 288 MediaStreamVideoTrack::GetVideoTrack(track);
289 blink::WebMediaStreamTrack::Settings settings;
290 native_track->getSettings(settings);
291 // These values come straight from the mock video track implementation.
292 EXPECT_EQ(640, settings.width);
293 EXPECT_EQ(480, settings.height);
294 EXPECT_EQ(30.0, settings.frameRate);
295 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::None, settings.facingMode);
296 }
297
298 // TODO(guidou): Remove this test. http://crbug.com/706408
299 class MediaStreamVideoTrackOldConstraintsTest : public ::testing::Test {
300 public:
301 MediaStreamVideoTrackOldConstraintsTest()
302 : child_process_(new ChildProcess()),
303 mock_source_(nullptr),
304 source_started_(false) {
305 scoped_feature_list_.InitAndEnableFeature(
306 features::kMediaStreamOldVideoConstraints);
307 }
308
309 ~MediaStreamVideoTrackOldConstraintsTest() override {}
310
311 void TearDown() override {
312 blink_source_.reset();
313 blink::WebHeap::collectAllGarbageForTesting();
314 }
315
316 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) {
317 base::RunLoop run_loop;
318 base::Closure quit_closure = run_loop.QuitClosure();
319 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
320 const scoped_refptr<media::VideoFrame> frame =
321 media::VideoFrame::CreateColorFrame(
322 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
323 MediaStreamVideoSource::kDefaultHeight),
324 kColorValue, kColorValue, kColorValue, base::TimeDelta());
325 mock_source()->DeliverVideoFrame(frame);
326 run_loop.Run();
327 }
328
329 protected:
330 base::MessageLoop* io_message_loop() const {
331 return child_process_->io_message_loop();
332 }
333
334 void InitializeSource() {
335 blink_source_.reset();
336 mock_source_ = IsOldVideoConstraints()
337 ? new MockMediaStreamVideoSource(false)
338 : new MockMediaStreamVideoSource(
339 media::VideoCaptureFormat(
340 gfx::Size(kMockSourceWidth, kMockSourceHeight),
341 30.0, media::PIXEL_FORMAT_I420),
342 false);
343 blink_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
344 blink::WebMediaStreamSource::TypeVideo,
345 blink::WebString::fromASCII("dummy_source_name"),
346 false /* remote */);
347 blink_source_.setExtraData(mock_source_);
348 }
349
350 // Create a track that's associated with |mock_source_|.
351 blink::WebMediaStreamTrack CreateTrack() {
352 const bool enabled = true;
353 blink::WebMediaStreamTrack track = MediaStreamVideoTrack::CreateVideoTrack(
354 mock_source_, MediaStreamSource::ConstraintsCallback(), enabled);
355 if (!source_started_) {
356 mock_source_->StartMockedSource();
357 source_started_ = true;
358 }
359 return track;
360 }
361
362 void UpdateVideoSourceToRespondToRequestRefreshFrame() {
363 blink_source_.reset();
364 mock_source_ = IsOldVideoConstraints()
365 ? new MockMediaStreamVideoSource(false, true)
366 : new MockMediaStreamVideoSource(
367 media::VideoCaptureFormat(
368 gfx::Size(kMockSourceWidth, kMockSourceHeight),
369 30.0, media::PIXEL_FORMAT_I420),
370 true);
371 blink_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
372 blink::WebMediaStreamSource::TypeVideo,
373 blink::WebString::fromASCII("dummy_source_name"),
374 false /* remote */);
375 blink_source_.setExtraData(mock_source_);
376 }
377
378 MockMediaStreamVideoSource* mock_source() { return mock_source_; }
379 const blink::WebMediaStreamSource& blink_source() const {
380 return blink_source_;
381 }
382
383 private:
384 const base::MessageLoopForUI message_loop_;
385 const std::unique_ptr<ChildProcess> child_process_;
386 blink::WebMediaStreamSource blink_source_;
387 // |mock_source_| is owned by |webkit_source_|.
388 MockMediaStreamVideoSource* mock_source_;
389 bool source_started_;
390 base::test::ScopedFeatureList scoped_feature_list_;
391 };
392
393 TEST_F(MediaStreamVideoTrackOldConstraintsTest, AddAndRemoveSink) {
394 InitializeSource();
395 MockMediaStreamVideoSink sink;
396 blink::WebMediaStreamTrack track = CreateTrack();
397 sink.ConnectToTrack(track);
398
399 DeliverVideoFrameAndWaitForRenderer(&sink);
400 EXPECT_EQ(1, sink.number_of_frames());
401
402 DeliverVideoFrameAndWaitForRenderer(&sink);
403
404 sink.DisconnectFromTrack();
405
406 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateBlackFrame(
407 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
408 MediaStreamVideoSource::kDefaultHeight));
409 mock_source()->DeliverVideoFrame(frame);
410 // Wait for the IO thread to complete delivering frames.
411 base::RunLoop().RunUntilIdle();
412 EXPECT_EQ(2, sink.number_of_frames());
413 }
414
415 // Checks that the callback given to the track is reset on the right thread.
416 TEST_F(MediaStreamVideoTrackOldConstraintsTest, ResetCallbackOnThread) {
417 InitializeSource();
418 MockMediaStreamVideoSink sink;
419 blink::WebMediaStreamTrack track = CreateTrack();
420
421 base::RunLoop run_loop;
422 bool correct = false;
423 sink.ConnectToTrackWithCallback(
424 track, base::Bind(&CheckThreadVideoFrameReceiver,
425 base::Owned(new CheckThreadHelper(
426 run_loop.QuitClosure(), &correct))));
427 sink.DisconnectFromTrack();
428 run_loop.Run();
429 EXPECT_TRUE(correct) << "Not called on correct thread.";
430 }
431
432 TEST_F(MediaStreamVideoTrackOldConstraintsTest, SetEnabled) {
433 InitializeSource();
434 MockMediaStreamVideoSink sink;
435 blink::WebMediaStreamTrack track = CreateTrack();
436 sink.ConnectToTrack(track);
437
438 MediaStreamVideoTrack* video_track =
439 MediaStreamVideoTrack::GetVideoTrack(track);
440
441 DeliverVideoFrameAndWaitForRenderer(&sink);
442 EXPECT_EQ(1, sink.number_of_frames());
443 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
444
445 video_track->SetEnabled(false);
446 EXPECT_FALSE(sink.enabled());
447
448 DeliverVideoFrameAndWaitForRenderer(&sink);
449 EXPECT_EQ(2, sink.number_of_frames());
450 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
451
452 video_track->SetEnabled(true);
453 EXPECT_TRUE(sink.enabled());
454 DeliverVideoFrameAndWaitForRenderer(&sink);
455 EXPECT_EQ(3, sink.number_of_frames());
456 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
457 sink.DisconnectFromTrack();
458 }
459
460 TEST_F(MediaStreamVideoTrackOldConstraintsTest, SourceStopped) {
461 InitializeSource();
462 MockMediaStreamVideoSink sink;
463 blink::WebMediaStreamTrack track = CreateTrack();
464 sink.ConnectToTrack(track);
465 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state());
466
467 mock_source()->StopSource();
468 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state());
469 sink.DisconnectFromTrack();
470 }
471
472 TEST_F(MediaStreamVideoTrackOldConstraintsTest, StopLastTrack) {
473 InitializeSource();
474 MockMediaStreamVideoSink sink1;
475 blink::WebMediaStreamTrack track1 = CreateTrack();
476 sink1.ConnectToTrack(track1);
477 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink1.state());
478
479 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
480 blink_source().getReadyState());
481
482 MockMediaStreamVideoSink sink2;
483 blink::WebMediaStreamTrack track2 = CreateTrack();
484 sink2.ConnectToTrack(track2);
485 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink2.state());
486
487 MediaStreamVideoTrack* const native_track1 =
488 MediaStreamVideoTrack::GetVideoTrack(track1);
489 native_track1->Stop();
490 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink1.state());
491 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
492 blink_source().getReadyState());
493 sink1.DisconnectFromTrack();
494
495 MediaStreamVideoTrack* const native_track2 =
496 MediaStreamVideoTrack::GetVideoTrack(track2);
497 native_track2->Stop();
498 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state());
499 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
500 blink_source().getReadyState());
501 sink2.DisconnectFromTrack();
502 }
503
504 TEST_F(MediaStreamVideoTrackOldConstraintsTest,
505 CheckTrackRequestsFrameOldConstraintsOldConstraints) {
289 UpdateVideoSourceToRespondToRequestRefreshFrame(); 506 UpdateVideoSourceToRespondToRequestRefreshFrame();
290 blink::WebMediaStreamTrack track = CreateTrack(); 507 blink::WebMediaStreamTrack track = CreateTrack();
291 508
292 // Add sink and expect to get a frame. 509 // Add sink and expect to get a frame.
293 MockMediaStreamVideoSink sink; 510 MockMediaStreamVideoSink sink;
294 base::RunLoop run_loop; 511 base::RunLoop run_loop;
295 base::Closure quit_closure = run_loop.QuitClosure(); 512 base::Closure quit_closure = run_loop.QuitClosure();
296 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); 513 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
297 sink.ConnectToTrack(track); 514 sink.ConnectToTrack(track);
298 run_loop.Run(); 515 run_loop.Run();
299 EXPECT_EQ(1, sink.number_of_frames()); 516 EXPECT_EQ(1, sink.number_of_frames());
300 517
301 sink.DisconnectFromTrack(); 518 sink.DisconnectFromTrack();
302 } 519 }
303 520
304 // TODO(guidou): Remove this test. http://crbug.com/706408 521 TEST_F(MediaStreamVideoTrackOldConstraintsTest, GetSettingsOldConstraints) {
305 TEST_F(MediaStreamVideoTrackTest, GetSettingsOldConstraints) {
306 base::test::ScopedFeatureList scoped_feature_list;
307 scoped_feature_list.InitAndEnableFeature(
308 features::kMediaStreamOldVideoConstraints);
309 InitializeSource(); 522 InitializeSource();
310 blink::WebMediaStreamTrack track = CreateTrack(); 523 blink::WebMediaStreamTrack track = CreateTrack();
311 MediaStreamVideoTrack* const native_track = 524 MediaStreamVideoTrack* const native_track =
312 MediaStreamVideoTrack::GetVideoTrack(track);
313 blink::WebMediaStreamTrack::Settings settings;
314 native_track->getSettings(settings);
315 // These values come straight from the mock video track implementation.
316 EXPECT_EQ(640, settings.width);
317 EXPECT_EQ(480, settings.height);
318 EXPECT_EQ(30.0, settings.frameRate);
319 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::None, settings.facingMode);
320 }
321
322 TEST_F(MediaStreamVideoTrackTest, GetSettings) {
323 base::test::ScopedFeatureList scoped_feature_list;
324 scoped_feature_list.InitAndDisableFeature(
325 features::kMediaStreamOldVideoConstraints);
326 InitializeSource();
327 blink::WebMediaStreamTrack track = CreateTrack();
328 MediaStreamVideoTrack* const native_track =
329 MediaStreamVideoTrack::GetVideoTrack(track); 525 MediaStreamVideoTrack::GetVideoTrack(track);
330 blink::WebMediaStreamTrack::Settings settings; 526 blink::WebMediaStreamTrack::Settings settings;
331 native_track->getSettings(settings); 527 native_track->getSettings(settings);
332 // These values come straight from the mock video track implementation. 528 // These values come straight from the mock video track implementation.
333 EXPECT_EQ(640, settings.width); 529 EXPECT_EQ(640, settings.width);
334 EXPECT_EQ(480, settings.height); 530 EXPECT_EQ(480, settings.height);
335 EXPECT_EQ(30.0, settings.frameRate); 531 EXPECT_EQ(30.0, settings.frameRate);
336 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::None, settings.facingMode); 532 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::None, settings.facingMode);
337 } 533 }
338 534
339 } // namespace content 535 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698