Index: services/video_capture/service_unittest.cc |
diff --git a/services/video_capture/service_unittest.cc b/services/video_capture/service_unittest.cc |
index c3abcf76f74ed0243e09d0c0a72d27bacd4585ef..d104ad12e389c601f4a64baebb931d8c5abfaf26 100644 |
--- a/services/video_capture/service_unittest.cc |
+++ b/services/video_capture/service_unittest.cc |
@@ -5,6 +5,7 @@ |
#include "base/memory/ref_counted.h" |
#include "base/run_loop.h" |
#include "services/shell/public/cpp/service_test.h" |
+#include "services/video_capture/mock_video_capture_device_client.h" |
#include "services/video_capture/public/interfaces/video_capture_device_factory.mojom.h" |
#include "services/video_capture/public/interfaces/video_capture_service.mojom.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -29,6 +30,7 @@ class MockDeviceDescriptorReceiver { |
void(const std::vector<mojom::VideoCaptureDeviceDescriptorPtr>&)); |
}; |
+// Basic test fixture that sets up a connection to the fake device factory. |
class VideoCaptureServiceTest : public shell::test::ServiceTest { |
public: |
VideoCaptureServiceTest() |
@@ -80,4 +82,89 @@ TEST_F(VideoCaptureServiceTest, FakeDeviceFactoryEnumeratesOneDevice) { |
ASSERT_EQ(1u, num_devices_enumerated); |
} |
+// Tests that VideoCaptureDeviceFactory::CreateDeviceProxy() returns an error |
+// code when trying to create a device for an invalid descriptor. |
+TEST_F(VideoCaptureServiceTest, ErrorCodeOnCreateDeviceForInvalidDescriptor) { |
+ auto invalid_descriptor = mojom::VideoCaptureDeviceDescriptor::New(); |
+ invalid_descriptor->device_id = "invalid"; |
+ invalid_descriptor->model_id = "invalid"; |
+ base::RunLoop wait_loop; |
+ mojom::VideoCaptureDeviceProxyPtr fake_device_proxy_; |
+ mojom::DeviceAccessResultCode result_code; |
+ factory_->CreateDeviceProxy( |
+ std::move(invalid_descriptor), mojo::GetProxy(&fake_device_proxy_), |
+ base::Bind( |
+ [](base::RunLoop* wait_loop, mojom::DeviceAccessResultCode* target, |
+ mojom::DeviceAccessResultCode result_code) { |
+ *target = result_code; |
+ wait_loop->Quit(); |
+ }, |
+ &wait_loop, &result_code)); |
+ wait_loop.Run(); |
+ ASSERT_EQ(mojom::DeviceAccessResultCode::ERROR_DEVICE_NOT_FOUND, result_code); |
+} |
+ |
+// Test fixture that creates a proxy to the fake device provided by the fake |
+// device factory. |
+class FakeDeviceVideoCaptureServiceTest : public VideoCaptureServiceTest { |
mcasas
2016/08/30 01:20:26
Separate this new class and associated test cases
chfremer
2016/08/30 18:22:54
Done.
|
+ public: |
+ FakeDeviceVideoCaptureServiceTest() : VideoCaptureServiceTest() {} |
+ ~FakeDeviceVideoCaptureServiceTest() override {} |
+ |
+ void SetUp() override { |
+ VideoCaptureServiceTest::SetUp(); |
+ |
+ base::RunLoop wait_loop; |
+ mojom::VideoCaptureDeviceDescriptorPtr fake_device_descriptor; |
+ EXPECT_CALL(descriptor_receiver_, OnEnumerateDeviceDescriptorsCallback(_)) |
+ .WillOnce(Invoke([&wait_loop, &fake_device_descriptor]( |
+ const std::vector<mojom::VideoCaptureDeviceDescriptorPtr>& |
+ descriptors) { |
+ fake_device_descriptor = descriptors[0].Clone(); |
+ wait_loop.Quit(); |
+ })); |
+ factory_->EnumerateDeviceDescriptors(base::Bind( |
+ &MockDeviceDescriptorReceiver::HandleEnumerateDeviceDescriptorsCallback, |
+ base::Unretained(&descriptor_receiver_))); |
+ wait_loop.Run(); |
+ |
+ factory_->CreateDeviceProxy( |
+ std::move(fake_device_descriptor), mojo::GetProxy(&fake_device_proxy_), |
+ base::Bind([](mojom::DeviceAccessResultCode result_code) { |
+ ASSERT_EQ(mojom::DeviceAccessResultCode::SUCCESS, result_code); |
+ })); |
+ } |
+ |
+ protected: |
+ mojom::VideoCaptureDeviceProxyPtr fake_device_proxy_; |
+}; |
+ |
+TEST_F(FakeDeviceVideoCaptureServiceTest, FrameCallbacksArrive) { |
+ auto arbitrary_requested_format = mojom::VideoCaptureFormat::New(); |
+ arbitrary_requested_format->frame_size.SetSize(640, 480); |
+ arbitrary_requested_format->frame_rate = 15; |
+ arbitrary_requested_format->pixel_format = media::mojom::VideoFormat::I420; |
+ arbitrary_requested_format->pixel_storage = mojom::VideoPixelStorage::CPU; |
+ |
+ base::RunLoop wait_loop; |
+ const int kNumFramesToWaitFor = 3; |
+ int num_frames_arrived = 0; |
+ mojom::VideoCaptureDeviceClientPtr client_proxy; |
+ MockVideoCaptureDeviceClient client(mojo::GetProxy(&client_proxy)); |
+ EXPECT_CALL(client, OnFrameAvailablePtr(_)) |
+ .WillRepeatedly(InvokeWithoutArgs( |
+ [&wait_loop, &kNumFramesToWaitFor, &num_frames_arrived]() { |
+ num_frames_arrived += 1; |
+ if (num_frames_arrived >= kNumFramesToWaitFor) { |
+ wait_loop.Quit(); |
+ } |
+ })); |
+ |
+ fake_device_proxy_->Start(std::move(arbitrary_requested_format), |
+ mojom::ResolutionChangePolicy::FIXED_RESOLUTION, |
+ mojom::PowerLineFrequency::DEFAULT, |
+ std::move(client_proxy)); |
+ wait_loop.Run(); |
+} |
+ |
} // namespace video_capture |