Index: content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
index 44e034bf089649e3be43a36327ab4bcce017e5bc..f4a56e534d2e1026e402e2accde7f80d0a350853 100644 |
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
@@ -53,12 +53,19 @@ using ::testing::_; |
using ::testing::DeleteArg; |
using ::testing::DoAll; |
using ::testing::InSequence; |
+using ::testing::Invoke; |
using ::testing::Return; |
using ::testing::SaveArg; |
const int kProcessId = 5; |
const int kRenderId = 6; |
const int kPageRequestId = 7; |
+static const char* kRegularVideoDeviceId = "stub_device_0"; |
miu
2017/04/03 21:31:23
Prefer constexpr to static const here.
Also, all
chfremer
2017/04/04 21:59:32
Done.
|
+static const char* kDepthVideoDeviceId = "stub_device_1 (depth)"; |
+static const double kStubFocalLengthX = 135.0; |
+static const double kStubFocalLengthY = 135.6; |
+static const double kStubDepthNear = 0.0; |
+static const double kStubDepthFar = 65.535; |
namespace content { |
@@ -73,7 +80,7 @@ void AudioInputDevicesEnumerated(base::Closure quit_closure, |
quit_closure.Run(); |
} |
-} // namespace |
+} // anonymous namespace |
class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, |
public TestContentBrowserClient { |
@@ -228,6 +235,18 @@ class MockMediaStreamUIProxy : public FakeMediaStreamUIProxy { |
const MediaStreamUIProxy::WindowIdCallback& window_id_callback)); |
}; |
+class MockVideoCaptureSystem : public media::VideoCaptureSystem { |
+ public: |
+ MOCK_METHOD1(GetDeviceInfosAsync, |
+ void(const base::Callback< |
+ void(const std::vector<media::VideoCaptureDeviceInfo>&)>& |
+ result_callback)); |
+ |
+ MOCK_METHOD1( |
+ CreateDevice, |
+ std::unique_ptr<media::VideoCaptureDevice>(const std::string& device_id)); |
+}; |
+ |
class MediaStreamDispatcherHostTest : public testing::Test { |
public: |
MediaStreamDispatcherHostTest() |
@@ -240,19 +259,13 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
// Make sure we use fake devices to avoid long delays. |
base::CommandLine::ForCurrentProcess()->AppendSwitch( |
switches::kUseFakeDeviceForMediaStream); |
+ auto mock_video_capture_system = base::MakeUnique<MockVideoCaptureSystem>(); |
+ mock_video_capture_system_ = mock_video_capture_system.get(); |
// Create our own MediaStreamManager. |
media_stream_manager_ = |
- base::MakeUnique<MediaStreamManager>(audio_system_.get()); |
- video_capture_device_factory_ = |
- static_cast<media::FakeVideoCaptureDeviceFactory*>( |
- media_stream_manager_->video_capture_manager() |
- ->video_capture_device_factory()); |
- DCHECK(video_capture_device_factory_); |
-#if defined(OS_WIN) |
- // Override the Video Capture Thread that MediaStreamManager constructs. |
- media_stream_manager_->video_capture_manager()->set_device_task_runner( |
- base::ThreadTaskRunnerHandle::Get()); |
-#endif |
+ MediaStreamManager::CreateWithCustomVideoCaptureSystem( |
+ audio_system_.get(), std::move(mock_video_capture_system), |
+ base::ThreadTaskRunnerHandle::Get()); |
MockResourceContext* mock_resource_context = |
static_cast<MockResourceContext*>( |
@@ -279,9 +292,32 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
} |
void SetUp() override { |
- video_capture_device_factory_->GetDeviceDescriptors( |
- &physical_video_devices_); |
- ASSERT_GT(physical_video_devices_.size(), 0u); |
+ stub_video_device_ids_.emplace_back(kRegularVideoDeviceId); |
+ stub_video_device_ids_.emplace_back(kDepthVideoDeviceId); |
+ const media::VideoCaptureApi stub_capture_api = |
miu
2017/04/03 21:31:23
Seems that this constant defined here, then captur
chfremer
2017/04/04 21:59:32
Done.
|
+ media::VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE; |
+ ON_CALL(*mock_video_capture_system_, GetDeviceInfosAsync(_)) |
+ .WillByDefault( |
+ Invoke([this, stub_capture_api]( |
+ const base::Callback<void( |
+ const std::vector<media::VideoCaptureDeviceInfo>&)>& |
+ result_callback) { |
+ std::vector<media::VideoCaptureDeviceInfo> result; |
+ for (const auto& device_id : stub_video_device_ids_) { |
+ media::VideoCaptureDeviceInfo info; |
+ info.descriptor.device_id = device_id; |
+ info.descriptor.capture_api = stub_capture_api; |
+ if (device_id == kDepthVideoDeviceId) { |
+ info.descriptor.camera_calibration.emplace(); |
+ info.descriptor.camera_calibration->focal_length_x = 135.0; |
+ info.descriptor.camera_calibration->focal_length_y = 135.6; |
+ info.descriptor.camera_calibration->depth_near = 0.0; |
+ info.descriptor.camera_calibration->depth_far = 65.535; |
+ } |
+ result.push_back(info); |
+ } |
+ result_callback.Run(result); |
+ })); |
base::RunLoop run_loop; |
MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; |
@@ -314,7 +350,7 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
int expected_audio_array_size = |
(controls.audio.requested && !physical_audio_devices_.empty()) ? 1 : 0; |
int expected_video_array_size = |
- (controls.video.requested && !physical_video_devices_.empty()) ? 1 : 0; |
+ (controls.video.requested && !stub_video_device_ids_.empty()) ? 1 : 0; |
EXPECT_CALL(*host_.get(), OnStreamGenerated(render_frame_id, |
page_request_id, |
expected_audio_array_size, |
@@ -366,8 +402,8 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
return true; |
} |
} |
- for (const auto& video_device : physical_video_devices_) { |
- if (video_device.device_id == devices[i].device.id) |
+ for (const std::string& device_id : stub_video_device_ids_) { |
+ if (device_id == devices[i].device.id) |
return true; |
} |
} |
@@ -390,12 +426,10 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
found_match = true; |
} |
} |
- media::VideoCaptureDeviceDescriptors::const_iterator video_it = |
- physical_video_devices_.begin(); |
- for (; video_it != physical_video_devices_.end(); ++video_it) { |
+ for (const std::string& device_id : stub_video_device_ids_) { |
if (content::DoesMediaDeviceIDMatchHMAC( |
browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), |
- origin, devices[i].device.id, video_it->device_id)) { |
+ origin, devices[i].device.id, device_id)) { |
EXPECT_FALSE(found_match); |
found_match = true; |
} |
@@ -435,9 +469,9 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
std::unique_ptr<ContentClient> content_client_; |
content::TestBrowserContext browser_context_; |
media::AudioDeviceDescriptions physical_audio_devices_; |
miu
2017/04/03 21:31:23
s/physical_audio/stub_audio/ too, or are they real
chfremer
2017/04/04 21:59:32
I had the same question, but since it is fairly no
|
- media::VideoCaptureDeviceDescriptors physical_video_devices_; |
+ std::vector<std::string> stub_video_device_ids_; |
url::Origin origin_; |
- media::FakeVideoCaptureDeviceFactory* video_capture_device_factory_; |
+ MockVideoCaptureSystem* mock_video_capture_system_; |
}; |
TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithVideoOnly) { |
@@ -481,26 +515,21 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithAudioAndVideo) { |
} |
TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithDepthVideo) { |
- // Video device on index 1 is depth video capture device. The number of fake |
- // devices is 2. |
- physical_video_devices_.clear(); |
- video_capture_device_factory_->SetToDefaultDevicesConfig(2); |
- video_capture_device_factory_->GetDeviceDescriptors(&physical_video_devices_); |
// We specify to generate both audio and video stream. |
StreamControls controls(true, true); |
std::string source_id = content::GetHMACForMediaDeviceID( |
browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), origin_, |
- physical_video_devices_[1].device_id); |
- // |source_id| is related to depth device (the device on index 1). As we can |
- // generate only one video stream using GenerateStreamAndWaitForResult, we |
- // use controls.video.source_id to specify that the stream is depth video. |
+ kDepthVideoDeviceId); |
+ // |source_id| corresponds to the depth device. As we can generate only one |
+ // video stream using GenerateStreamAndWaitForResult, we use |
+ // controls.video.source_id to specify that the stream is depth video. |
// See also MediaStreamManager::GenerateStream and other tests here. |
controls.video.device_id = source_id; |
SetupFakeUI(true); |
GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); |
- // There are two fake devices. We specified the generation and expect to get |
+ // We specified the generation and expect to get |
// one audio and one depth video stream. |
EXPECT_EQ(host_->audio_devices_.size(), 1u); |
EXPECT_EQ(host_->video_devices_.size(), 1u); |
@@ -509,10 +538,10 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithDepthVideo) { |
const base::Optional<CameraCalibration> calibration = |
host_->video_devices_[0].device.camera_calibration; |
EXPECT_TRUE(calibration); |
- EXPECT_EQ(calibration->focal_length_x, 135.0); |
- EXPECT_EQ(calibration->focal_length_y, 135.6); |
- EXPECT_EQ(calibration->depth_near, 0.0); |
- EXPECT_EQ(calibration->depth_far, 65.535); |
+ EXPECT_EQ(calibration->focal_length_x, kStubFocalLengthX); |
+ EXPECT_EQ(calibration->focal_length_y, kStubFocalLengthY); |
+ EXPECT_EQ(calibration->depth_near, kStubDepthNear); |
+ EXPECT_EQ(calibration->depth_far, kStubDepthFar); |
} |
// This test generates two streams with video only using the same render frame |
@@ -637,7 +666,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithoutWaiting) { |
// the request. |
TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithSourceId) { |
ASSERT_GE(physical_audio_devices_.size(), 1u); |
- ASSERT_GE(physical_video_devices_.size(), 1u); |
+ ASSERT_GE(stub_video_device_ids_.size(), 1u); |
media::AudioDeviceDescriptions::const_iterator audio_it = |
physical_audio_devices_.begin(); |
@@ -655,12 +684,10 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithSourceId) { |
EXPECT_EQ(host_->audio_devices_[0].device.id, source_id); |
} |
- media::VideoCaptureDeviceDescriptors::const_iterator video_it = |
- physical_video_devices_.begin(); |
- for (; video_it != physical_video_devices_.end(); ++video_it) { |
+ for (const std::string& device_id : stub_video_device_ids_) { |
std::string source_id = content::GetHMACForMediaDeviceID( |
browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), origin_, |
- video_it->device_id); |
+ device_id); |
ASSERT_FALSE(source_id.empty()); |
StreamControls controls(true, true); |
controls.video.device_id = source_id; |
@@ -690,9 +717,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithInvalidAudioSourceId) { |
} |
TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsNoAvailableVideoDevice) { |
- physical_video_devices_.clear(); |
- video_capture_device_factory_->SetToDefaultDevicesConfig(0); |
- video_capture_device_factory_->GetDeviceDescriptors(&physical_video_devices_); |
+ stub_video_device_ids_.clear(); |
StreamControls controls(true, true); |
SetupFakeUI(false); |
@@ -848,7 +873,7 @@ TEST_F(MediaStreamDispatcherHostTest, VideoDeviceUnplugged) { |
EXPECT_EQ(host_->audio_devices_.size(), 1u); |
EXPECT_EQ(host_->video_devices_.size(), 1u); |
- video_capture_device_factory_->SetToDefaultDevicesConfig(0); |
+ stub_video_device_ids_.clear(); |
base::RunLoop run_loop; |
EXPECT_CALL(*host_.get(), OnDeviceStopped(kRenderId)) |