Chromium Code Reviews| Index: services/video_capture/fake_device_unittest.cc |
| diff --git a/services/video_capture/fake_device_unittest.cc b/services/video_capture/fake_device_unittest.cc |
| index 3012e8e4366b7ef9f1f4dcf07d28383efaaf6e88..b2fbb2f6e394cee24e58c9886869b60316f4bed2 100644 |
| --- a/services/video_capture/fake_device_unittest.cc |
| +++ b/services/video_capture/fake_device_unittest.cc |
| @@ -4,6 +4,8 @@ |
| #include "base/memory/ref_counted.h" |
| #include "base/run_loop.h" |
| +#include "media/base/video_frame.h" |
| +#include "media/mojo/common/media_type_converters.h" |
| #include "services/video_capture/fake_device_test.h" |
| #include "services/video_capture/mock_video_frame_receiver.h" |
| #include "services/video_capture/public/cpp/video_capture_settings.h" |
| @@ -11,6 +13,7 @@ |
| #include "services/video_capture/video_capture_service_test.h" |
| using testing::_; |
| +using testing::Invoke; |
| using testing::InvokeWithoutArgs; |
| namespace video_capture { |
| @@ -43,4 +46,67 @@ TEST_F(FakeDeviceTest, FrameCallbacksArrive) { |
| wait_loop.Run(); |
| } |
| +struct FrameInfo { |
| + gfx::Size size; |
| + media::VideoPixelFormat pixel_format; |
| + media::VideoFrame::StorageType storage_type; |
| + bool is_mappable; |
| + base::TimeDelta timestamp; |
| +}; |
|
mcasas
2016/11/09 23:50:29
Move this struct to an anonymous namespace
inside
chfremer
2016/11/10 00:28:48
Done.
|
| + |
| +// Tests that frames received from a fake capture device match the requested |
| +// format and have increasing timestamps. |
| +TEST_F(FakeDeviceTest, ReceiveFramesFromFakeCaptureDevice) { |
| + // Set up a mock VideoFrameReceiver |
| + base::RunLoop wait_loop; |
| + mojom::VideoFrameReceiverPtr receiver_proxy; |
| + constexpr int num_frames_to_receive = 2; |
| + FrameInfo received_frame_infos[num_frames_to_receive]; |
| + int received_frame_count = 0; |
| + MockVideoFrameReceiver receiver(mojo::GetProxy(&receiver_proxy)); |
| + EXPECT_CALL(receiver, OnIncomingCapturedVideoFramePtr(_)) |
| + .WillRepeatedly( |
| + Invoke([&received_frame_infos, &received_frame_count, |
| + &num_frames_to_receive, &wait_loop]( |
| + const media::mojom::VideoFramePtr* frame) { |
| + if (received_frame_count >= num_frames_to_receive) { |
| + return; |
| + } |
|
mcasas
2016/11/09 23:50:29
No {} for one-line bodies. Same for l.84, l.106
chfremer
2016/11/10 00:28:48
Done.
|
| + auto video_frame = frame->To<scoped_refptr<media::VideoFrame>>(); |
| + auto& frame_info = received_frame_infos[received_frame_count]; |
| + frame_info.pixel_format = video_frame->format(); |
| + frame_info.storage_type = video_frame->storage_type(); |
| + frame_info.is_mappable = video_frame->IsMappable(); |
| + frame_info.size = video_frame->natural_size(); |
| + frame_info.timestamp = video_frame->timestamp(); |
| + received_frame_count += 1; |
| + if (received_frame_count == num_frames_to_receive) { |
| + wait_loop.Quit(); |
| + } |
| + })); |
| + |
| + fake_device_proxy_->Start( |
| + requestable_settings_, std::move(receiver_proxy)); |
| + |
| + wait_loop.Run(); |
| + |
| + base::TimeDelta previous_timestamp; |
| + for (int i = 0; i < num_frames_to_receive; i++) { |
| + auto& frame_info = received_frame_infos[i]; |
| + // Service is expected to always output I420 |
| + ASSERT_EQ(media::PIXEL_FORMAT_I420, frame_info.pixel_format); |
| + // Service is expected to always use STORAGE_MOJO_SHARED_BUFFER |
| + ASSERT_EQ(media::VideoFrame::STORAGE_MOJO_SHARED_BUFFER, |
| + frame_info.storage_type); |
| + ASSERT_TRUE(frame_info.is_mappable); |
| + ASSERT_EQ(requestable_settings_.format.frame_size, |
| + frame_info.size); |
| + // Timestamps are expected to increase |
| + if (i > 0) { |
| + ASSERT_GT(frame_info.timestamp, previous_timestamp); |
|
mcasas
2016/11/09 23:50:29
nit: ASSERT_* will stop the test in its tracks, wh
chfremer
2016/11/10 00:28:48
Very nice. I didn't know about EXPECT_*. Thanks.
D
|
| + } |
| + previous_timestamp = frame_info.timestamp; |
| + } |
| +} |
| + |
| } // namespace video_capture |