OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |